[Kimchi-devel] [PATCH 4/8] refator exception: Update control to raise the exception message

Aline Manera alinefm at linux.vnet.ibm.com
Tue Feb 11 17:52:42 UTC 2014


From: Aline Manera <alinefm at br.ibm.com>

The error messages raised on control were being built in there instead of
using the exception message
And the errors from jsonschema validation also were displayed to the user
without a customization what can cause a misunderstanding as it contains
technical words.
Fix it in order to raise the translated messages to the user.

Signed-off-by: Aline Manera <alinefm at br.ibm.com>
---
 src/kimchi/control/base.py  |  116 +++++++++++++++++++++----------------------
 src/kimchi/control/utils.py |   14 +++---
 2 files changed, 65 insertions(+), 65 deletions(-)

diff --git a/src/kimchi/control/base.py b/src/kimchi/control/base.py
index f50ff6e..252e9ef 100644
--- a/src/kimchi/control/base.py
+++ b/src/kimchi/control/base.py
@@ -70,18 +70,16 @@ class Resource(object):
                 fn(*model_args)
                 uri_params = tuple(self.model_args)
                 raise internal_redirect(self.uri_fmt % uri_params)
-            except MissingParameter, param:
-                error = "Missing parameter: '%s'" % param
-                raise cherrypy.HTTPError(400, error)
-            except InvalidParameter, param:
-                error = "Invalid parameter: '%s'" % param
-                raise cherrypy.HTTPError(400, error)
-            except InvalidOperation, msg:
-                raise cherrypy.HTTPError(400, "Invalid operation: '%s'" % msg)
-            except OperationFailed, msg:
-                raise cherrypy.HTTPError(500, "Operation Failed: '%s'" % msg)
-            except NotFoundError, msg:
-                raise cherrypy.HTTPError(404, "Not found: '%s'" % msg)
+            except MissingParameter, e:
+                raise cherrypy.HTTPError(400, e.message)
+            except InvalidParameter, e:
+                raise cherrypy.HTTPError(400, e.message)
+            except InvalidOperation, e:
+                raise cherrypy.HTTPError(400, e.message)
+            except OperationFailed, e:
+                raise cherrypy.HTTPError(500, e.message)
+            except NotFoundError, e:
+                raise cherrypy.HTTPError(404, e.message)
 
         wrapper.__name__ = action_name
         wrapper.exposed = True
@@ -100,12 +98,13 @@ class Resource(object):
             fn(*self.model_args)
             cherrypy.response.status = 204
         except AttributeError:
-            error = "Delete is not allowed for %s" % get_class_name(self)
-            raise cherrypy.HTTPError(405, error)
-        except OperationFailed, msg:
-            raise cherrypy.HTTPError(500, "Operation Failed: '%s'" % msg)
-        except InvalidOperation, msg:
-            raise cherrypy.HTTPError(400, "Invalid operation: '%s'" % msg)
+            e = InvalidOperation('KCHAPI0002E', {'resource':
+                                                 get_class_name(self)})
+            raise cherrypy.HTTPError(405, e.message)
+        except OperationFailed, e:
+            raise cherrypy.HTTPError(500, e.message)
+        except InvalidOperation, e:
+            raise cherrypy.HTTPError(400, e.message)
 
     @cherrypy.expose
     def index(self):
@@ -113,33 +112,34 @@ class Resource(object):
         if method == 'GET':
             try:
                 return self.get()
-            except NotFoundError, msg:
-                raise cherrypy.HTTPError(404, "Not found: '%s'" % msg)
-            except InvalidOperation, msg:
-                raise cherrypy.HTTPError(400, "Invalid operation: '%s'" % msg)
-            except OperationFailed, msg:
-                raise cherrypy.HTTPError(406, "Operation failed: '%s'" % msg)
+            except NotFoundError, e:
+                raise cherrypy.HTTPError(404, e.message)
+            except InvalidOperation, e:
+                raise cherrypy.HTTPError(400, e.message)
+            except OperationFailed, e:
+                raise cherrypy.HTTPError(406, e.message)
         elif method == 'DELETE':
             try:
                 return self.delete()
-            except NotFoundError, msg:
-                raise cherrypy.HTTPError(404, "Not found: '%s'" % msg)
+            except NotFoundError, e:
+                raise cherrypy.HTTPError(404, e.message)
         elif method == 'PUT':
             try:
                 return self.update()
-            except InvalidParameter, msg:
-                raise cherrypy.HTTPError(400, "Invalid parameter: '%s'" % msg)
-            except InvalidOperation, msg:
-                raise cherrypy.HTTPError(400, "Invalid operation: '%s'" % msg)
-            except NotFoundError, msg:
-                raise cherrypy.HTTPError(404, "Not found: '%s'" % msg)
+            except InvalidParameter, e:
+                raise cherrypy.HTTPError(400, e.message)
+            except InvalidOperation, e:
+                raise cherrypy.HTTPError(400, e.message)
+            except NotFoundError, e:
+                raise cherrypy.HTTPError(404, e.message)
 
     def update(self):
         try:
             update = getattr(self.model, model_fn(self, 'update'))
         except AttributeError:
-            error = "%s does not implement update method"
-            raise cherrypy.HTTPError(405, error % get_class_name(self))
+            e = InvalidOperation('KCHAPI0003E', {'resource':
+                                                 get_class_name(self)})
+            raise cherrypy.HTTPError(405, e.message)
 
         params = parse_request()
         validate_params(params, self, 'update')
@@ -148,8 +148,10 @@ class Resource(object):
             invalids = [v for v in params.keys() if
                         v not in self.update_params]
             if invalids:
-                error = "%s are not allowed to be updated" % invalids
-                raise cherrypy.HTTPError(405, error)
+                msg_args = {'params': ", ".join(invalids),
+                            'resource': get_class_name(self)}
+                e = InvalidOperation('KCHAPI0004E', msg_args)
+                raise cherrypy.HTTPError(405, e.message)
 
         ident = update(self.ident, params)
         if ident != self.ident:
@@ -199,8 +201,9 @@ class Collection(object):
         try:
             create = getattr(self.model, model_fn(self, 'create'))
         except AttributeError:
-            error = 'Create is not allowed for %s' % get_class_name(self)
-            raise cherrypy.HTTPError(405, error)
+            e = InvalidOperation('KCHAPI0005E', {'resource':
+                                                 get_class_name(self)})
+            raise cherrypy.HTTPError(405, e.message)
 
         params = parse_request()
         validate_params(params, self, 'create')
@@ -264,28 +267,24 @@ class Collection(object):
                 filter_params = cherrypy.request.params
                 validate_params(filter_params, self, 'get_list')
                 return self.get(filter_params)
-            except InvalidOperation, param:
-                error = "Invalid operation: '%s'" % param
-                raise cherrypy.HTTPError(400, error)
-            except NotFoundError, param:
-                raise cherrypy.HTTPError(404, "Not found: '%s'" % param)
+            except InvalidOperation, e:
+                raise cherrypy.HTTPError(400, e.message)
+            except NotFoundError, e:
+                raise cherrypy.HTTPError(404, e.message)
 
         elif method == 'POST':
             try:
                 return self.create(*args)
-            except MissingParameter, param:
-                error = "Missing parameter: '%s'" % param
-                raise cherrypy.HTTPError(400, error)
-            except InvalidParameter, param:
-                error = "Invalid parameter: '%s'" % param
-                raise cherrypy.HTTPError(400, error)
-            except OperationFailed, param:
-                raise cherrypy.HTTPError(500, "Operation Failed: '%s'" % param)
-            except InvalidOperation, param:
-                error = "Invalid operation: '%s'" % param
-                raise cherrypy.HTTPError(400, error)
-            except NotFoundError, param:
-                raise cherrypy.HTTPError(404, "Not found: '%s'" % param)
+            except MissingParameter, e:
+                raise cherrypy.HTTPError(400, e.message)
+            except InvalidParameter, e:
+                raise cherrypy.HTTPError(400, e.message)
+            except OperationFailed, e:
+                raise cherrypy.HTTPError(500, e.message)
+            except InvalidOperation, e:
+                raise cherrypy.HTTPError(400, e.message)
+            except NotFoundError, e:
+                raise cherrypy.HTTPError(404, e.message)
 
 
 class AsyncCollection(Collection):
@@ -299,8 +298,9 @@ class AsyncCollection(Collection):
         try:
             create = getattr(self.model, model_fn(self, 'create'))
         except AttributeError:
-            error = 'Create is not allowed for %s' % get_class_name(self)
-            raise cherrypy.HTTPError(405, error)
+            e = InvalidOperation('KCHAPI0005E', {'resource':
+                                                 get_class_name(self)})
+            raise cherrypy.HTTPError(405, e.message)
 
         params = parse_request()
         args = self.model_args + [params]
diff --git a/src/kimchi/control/utils.py b/src/kimchi/control/utils.py
index 9c6878b..ebfdda7 100644
--- a/src/kimchi/control/utils.py
+++ b/src/kimchi/control/utils.py
@@ -30,7 +30,7 @@ import json
 from jsonschema import Draft3Validator, ValidationError, FormatChecker
 
 
-from kimchi.exception import InvalidParameter
+from kimchi.exception import InvalidParameter, OperationFailed
 from kimchi.utils import import_module, listPathModules
 
 
@@ -77,10 +77,11 @@ def parse_request():
         try:
             return json.loads(rawbody)
         except ValueError:
-            raise cherrypy.HTTPError(400, "Unable to parse JSON request")
+            e = OperationFailed('KCHAPI0006E')
+            raise cherrypy.HTTPError(400, e.message)
     else:
-        raise cherrypy.HTTPError(415, "This API only supports"
-                                      " 'application/json'")
+        e = OperationFailed('KCHAPI0007E')
+        raise cherrypy.HTTPError(415, e.message)
 
 
 def internal_redirect(url):
@@ -101,9 +102,8 @@ def validate_params(params, instance, action):
 
     try:
         validator.validate(request)
-    except ValidationError:
-        raise InvalidParameter('; '.join(
-            e.message for e in validator.iter_errors(request)))
+    except ValidationError, e:
+        raise InvalidParameter(e.schema['error'], {'value': str(e.instance)})
 
 
 class UrlSubNode(object):
-- 
1.7.10.4




More information about the Kimchi-devel mailing list