X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/f589e41b46ab266706a7f82a5562f50805359b26..d958b0a69d6cebf7a4465c552d9392449f0e35fc:/forum/modules/decorators.py diff --git a/forum/modules/decorators.py b/forum/modules/decorators.py index 13bddac..11af9e3 100644 --- a/forum/modules/decorators.py +++ b/forum/modules/decorators.py @@ -47,7 +47,10 @@ class DecoratableObject(object): def __call__(self, *args, **kwargs): if self._params_decoration: for dec in self._params_decoration: - args, kwargs = dec(*args, **kwargs) + try: + args, kwargs = dec(*args, **kwargs) + except ReturnImediatelyException, e: + return e.ret res = self._callable(*args, **kwargs) @@ -60,8 +63,13 @@ class DecoratableObject(object): return res +class ReturnImediatelyException(Exception): + def __init__(self, ret): + super(Exception, self).__init__() + self.ret = ret + def _check_decoratable(origin, install=True): - if not isinstance(origin, DecoratableObject): + if not hasattr(origin, '_decoratable_obj'): if inspect.ismethod(origin) and not hasattr(origin, '_decoratable_obj'): decoratable = DecoratableObject(origin) @@ -83,10 +91,18 @@ def _check_decoratable(origin, install=True): elif inspect.isfunction(origin): decoratable = DecoratableObject(origin) + def decorated(*args, **kwargs): + return decoratable(*args, **kwargs) + + decorated._decoratable_obj = decoratable + if install: - setattr(inspect.getmodule(origin), origin.__name__, decoratable) + setattr(inspect.getmodule(origin), origin.__name__, decorated) + + decorated.__name__ = origin.__name__ + decorated.__module__ = origin.__module__ - return decoratable + return decorated return origin @@ -95,7 +111,7 @@ def decorate(origin, needs_origin=True): origin = _check_decoratable(origin) def decorator(fn): - origin._decorate(fn, DecoratableObject.MODE_OVERRIDE, needs_origin=needs_origin) + origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_OVERRIDE, needs_origin=needs_origin) return decorator @@ -104,7 +120,7 @@ def _decorate_params(origin): origin = _check_decoratable(origin) def decorator(fn): - origin._decorate(fn, DecoratableObject.MODE_PARAMS) + origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_PARAMS) return decorator @@ -114,7 +130,7 @@ def _decorate_result(origin, needs_params=False): origin = _check_decoratable(origin) def decorator(fn): - origin._decorate(fn, DecoratableObject.MODE_RESULT, needs_params=needs_params) + origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_RESULT, needs_params=needs_params) return decorator @@ -123,7 +139,7 @@ decorate.result = _decorate_result def _decorate_with(fn): def decorator(origin): origin = _check_decoratable(origin) - origin._decorate(fn, DecoratableObject.MODE_OVERRIDE, needs_origin=True) + origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_OVERRIDE, needs_origin=True) return origin return decorator @@ -132,7 +148,7 @@ decorate.withfn = _decorate_with def _decorate_result_with(fn, needs_params=False): def decorator(origin): origin = _check_decoratable(origin) - origin._decorate(fn, DecoratableObject.MODE_RESULT, needs_params=needs_params) + origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_RESULT, needs_params=needs_params) return origin return decorator @@ -141,7 +157,7 @@ decorate.result.withfn = _decorate_result_with def _decorate_params_with(fn): def decorator(origin): origin = _check_decoratable(origin) - origin._decorate(fn, DecoratableObject.MODE_PARAMS) + origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_PARAMS) return origin return decorator