
From: Aline Manera <alinefm@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@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