]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/modules/decorators.py
creating the updater module and disabling it in the DISABLED_MODULES list until the...
[osqa.git] / forum / modules / decorators.py
index 13bddac89357785c8df24e9402483de3b5724e02..11af9e3d1c4c1cd49e60b04db024a9344f7269f9 100644 (file)
@@ -47,7 +47,10 @@ class DecoratableObject(object):
     def __call__(self, *args, **kwargs):\r
         if self._params_decoration:\r
             for dec in self._params_decoration:\r
-                args, kwargs = dec(*args, **kwargs)\r
+                try:\r
+                    args, kwargs = dec(*args, **kwargs)\r
+                except ReturnImediatelyException, e:\r
+                    return e.ret\r
 \r
         res = self._callable(*args, **kwargs)\r
 \r
@@ -60,8 +63,13 @@ class DecoratableObject(object):
 \r
         return res\r
 \r
+class ReturnImediatelyException(Exception):\r
+    def __init__(self, ret):\r
+        super(Exception, self).__init__()\r
+        self.ret = ret\r
+\r
 def _check_decoratable(origin, install=True):\r
-    if not isinstance(origin, DecoratableObject):\r
+    if not hasattr(origin, '_decoratable_obj'):\r
         if inspect.ismethod(origin) and not hasattr(origin, '_decoratable_obj'):\r
             decoratable = DecoratableObject(origin)\r
 \r
@@ -83,10 +91,18 @@ def _check_decoratable(origin, install=True):
         elif inspect.isfunction(origin):\r
             decoratable = DecoratableObject(origin)\r
 \r
+            def decorated(*args, **kwargs):\r
+                return decoratable(*args, **kwargs)\r
+\r
+            decorated._decoratable_obj = decoratable\r
+\r
             if install:\r
-                setattr(inspect.getmodule(origin), origin.__name__, decoratable)\r
+                setattr(inspect.getmodule(origin), origin.__name__, decorated)\r
+\r
+            decorated.__name__ = origin.__name__\r
+            decorated.__module__ = origin.__module__\r
 \r
-            return decoratable\r
+            return decorated\r
 \r
     return origin\r
 \r
@@ -95,7 +111,7 @@ def decorate(origin, needs_origin=True):
     origin = _check_decoratable(origin)\r
 \r
     def decorator(fn):\r
-        origin._decorate(fn, DecoratableObject.MODE_OVERRIDE, needs_origin=needs_origin)\r
+        origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_OVERRIDE, needs_origin=needs_origin)\r
         \r
     return decorator\r
 \r
@@ -104,7 +120,7 @@ def _decorate_params(origin):
     origin = _check_decoratable(origin)\r
 \r
     def decorator(fn):\r
-        origin._decorate(fn, DecoratableObject.MODE_PARAMS)\r
+        origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_PARAMS)\r
 \r
     return decorator\r
 \r
@@ -114,7 +130,7 @@ def _decorate_result(origin, needs_params=False):
     origin = _check_decoratable(origin)\r
 \r
     def decorator(fn):\r
-        origin._decorate(fn, DecoratableObject.MODE_RESULT, needs_params=needs_params)\r
+        origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_RESULT, needs_params=needs_params)\r
 \r
     return decorator\r
 \r
@@ -123,7 +139,7 @@ decorate.result = _decorate_result
 def _decorate_with(fn):\r
     def decorator(origin):\r
         origin = _check_decoratable(origin)\r
-        origin._decorate(fn, DecoratableObject.MODE_OVERRIDE, needs_origin=True)\r
+        origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_OVERRIDE, needs_origin=True)\r
         return origin\r
     return decorator\r
 \r
@@ -132,7 +148,7 @@ decorate.withfn = _decorate_with
 def _decorate_result_with(fn, needs_params=False):\r
     def decorator(origin):\r
         origin = _check_decoratable(origin)\r
-        origin._decorate(fn, DecoratableObject.MODE_RESULT, needs_params=needs_params)\r
+        origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_RESULT, needs_params=needs_params)\r
         return origin\r
     return decorator\r
 \r
@@ -141,7 +157,7 @@ decorate.result.withfn = _decorate_result_with
 def _decorate_params_with(fn):\r
     def decorator(origin):\r
         origin = _check_decoratable(origin)\r
-        origin._decorate(fn, DecoratableObject.MODE_PARAMS)\r
+        origin._decoratable_obj._decorate(fn, DecoratableObject.MODE_PARAMS)\r
         return origin\r
     return decorator\r
 \r