[Kimchi-devel] [WIP PATCH 4/5] Render different types of data in generate_action_handler

Crístian Viana vianac at linux.vnet.ibm.com
Fri Oct 17 08:26:51 UTC 2014


The function "generate_action_handler" creates a function which handles
a string being returned by the underlying action function. However, in
some cases, another type of element might be returned. The action
"swupdate", for example, doesn't use "generate_action_handler" because
it returns a Task instead of a string.

Make the function "generate_action_handler" more modular so it can
process different types of data.

Signed-off-by: Crístian Viana <vianac at linux.vnet.ibm.com>
---
 src/kimchi/control/base.py | 37 +++++++++++++++++++++++++++----------
 src/kimchi/control/host.py | 18 +++---------------
 2 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/src/kimchi/control/base.py b/src/kimchi/control/base.py
index 1eb10bd..60db1df 100644
--- a/src/kimchi/control/base.py
+++ b/src/kimchi/control/base.py
@@ -65,6 +65,29 @@ class Resource(object):
             raise cherrypy.HTTPRedirect(self.uri_fmt % tuple(uri_params), code)
 
     def generate_action_handler(self, action_name, action_args=None):
+        def _render_element(self, ident):
+            self._redirect(ident)
+            uri_params = []
+            for arg in self.model_args:
+                if arg is None:
+                    arg = ''
+                uri_params.append(urllib2.quote(arg.encode('utf-8'),
+                                  safe=""))
+            raise internal_redirect(self.uri_fmt % tuple(uri_params))
+
+        return self._generate_action_handler_base(action_name, _render_element,
+                                                  action_args)
+
+    def generate_action_handler_task(self, action_name, action_args=None):
+        def _render_task(self, task):
+            cherrypy.response.status = 202
+            return kimchi.template.render('Task', task)
+
+        return self._generate_action_handler_base(action_name, _render_task,
+                                                  action_args)
+
+    def _generate_action_handler_base(self, action_name, render_fn,
+                                      action_args=None):
         def wrapper(*args, **kwargs):
             validate_method(('POST'), self.role_key, self.admin_methods)
             try:
@@ -76,16 +99,10 @@ class Resource(object):
                 if action_args is not None:
                     request = parse_request()
                     model_args.extend(request[key] for key in action_args)
-                fn = getattr(self.model, model_fn(self, action_name))
-                ident = fn(*model_args)
-                self._redirect(ident)
-                uri_params = []
-                for arg in self.model_args:
-                    if arg is None:
-                        arg = ''
-                    uri_params.append(urllib2.quote(arg.encode('utf-8'),
-                                      safe=""))
-                raise internal_redirect(self.uri_fmt % tuple(uri_params))
+
+                action_fn = getattr(self.model, model_fn(self, action_name))
+                action_result = action_fn(*model_args)
+                return render_fn(self, action_result)
             except MissingParameter, e:
                 raise cherrypy.HTTPError(400, e.message)
             except InvalidParameter, e:
diff --git a/src/kimchi/control/host.py b/src/kimchi/control/host.py
index 7bcae72..4362da7 100644
--- a/src/kimchi/control/host.py
+++ b/src/kimchi/control/host.py
@@ -17,12 +17,9 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
 
-import cherrypy
-
 from kimchi.control.base import Collection, Resource, SimpleCollection
-from kimchi.control.utils import UrlSubNode, validate_method
-from kimchi.exception import OperationFailed, NotFoundError
-from kimchi.template import render
+from kimchi.control.utils import UrlSubNode
+from kimchi.exception import NotFoundError
 
 
 @UrlSubNode('host', True)
@@ -41,16 +38,7 @@ class Host(Resource):
         self.repositories = Repositories(self.model)
         self.users = Users(self.model)
         self.groups = Groups(self.model)
-
-    @cherrypy.expose
-    def swupdate(self):
-        validate_method(('POST'), self.role_key, self.admin_methods)
-        try:
-            task = self.model.host_swupdate()
-            cherrypy.response.status = 202
-            return render("Task", task)
-        except OperationFailed, e:
-            raise cherrypy.HTTPError(500, e.message)
+        self.swupdate = self.generate_action_handler_task('swupdate')
 
     @property
     def data(self):
-- 
1.9.3




More information about the Kimchi-devel mailing list