]> git.openstreetmap.org Git - osqa.git/blob - forum/modules/decorators.py
Fixed http://jira.osqa.net/browse/OSQA-214 and improved awarded badges list.
[osqa.git] / forum / modules / decorators.py
1 import inspect\r
2 \r
3 class DecoratableObject(object):\r
4     def __init__(self, fn):\r
5         self._callable = fn\r
6 \r
7     def decorate(self, fn, needs_origin):\r
8         origin = self._callable\r
9 \r
10         if needs_origin:\r
11             self._callable = lambda *args, **kwargs: fn(origin, *args, **kwargs)\r
12         else:\r
13             self._callable = lambda *args, **kwargs: fn(*args, **kwargs)\r
14 \r
15     def __call__(self, *args, **kwargs):\r
16         return self._callable(*args, **kwargs)\r
17 \r
18 \r
19 def decoratable(fn):\r
20     return DecoratableObject(fn)\r
21 \r
22 def decoratable_method(fn):\r
23     obj = DecoratableObject(fn)\r
24     def decorated(self, *args, **kwargs):\r
25         return obj(self, *args, **kwargs)\r
26 \r
27     decorated.__obj = obj\r
28     return decorated\r
29 \r
30 decoratable.method = decoratable_method\r
31 \r
32 def decorate(origin, needs_origin=True):\r
33     if not isinstance(origin, DecoratableObject):\r
34         if hasattr(origin, '__obj'):\r
35             def decorator(fn):\r
36                 origin.__obj.decorate(fn, needs_origin)\r
37                 return origin\r
38             return decorator\r
39 \r
40         raise Exception('Not an decoratable function: %s' % origin.name)\r
41 \r
42     def decorator(fn):\r
43         origin.decorate(fn, needs_origin)\r
44         return origin\r
45 \r
46     return decorator\r
47 \r
48 \r
49 \r
50 \r
51 \r
52 \r
53 \r