]> git.openstreetmap.org Git - osqa.git/blob - forum/modules/__init__.py
976d9eb448a05fd2b2fa78e741ee9e4c59ae8993
[osqa.git] / forum / modules / __init__.py
1 import os
2 import types
3 import logging
4
5 MODULES_PACKAGE = 'forum_modules'
6
7 MODULES_FOLDER = None
8 MODULE_LIST = []
9
10
11 def init_modules_engine(site_src_root, disabled_modules):
12     MODULES_FOLDER = os.path.join(site_src_root, MODULES_PACKAGE)
13
14     MODULE_LIST.extend(filter(lambda m: getattr(m, 'CAN_USE', True), [
15             __import__('forum_modules.%s' % f, globals(), locals(), ['forum_modules'])
16             for f in os.listdir(MODULES_FOLDER)
17             if os.path.isdir(os.path.join(MODULES_FOLDER, f)) and
18                os.path.exists(os.path.join(MODULES_FOLDER, "%s/__init__.py" % f)) and
19                not f in disabled_modules
20     ]))
21
22 def get_modules_script(script_name):
23     all = []
24
25     for m in MODULE_LIST:
26         if hasattr(m, script_name):
27             all.append(getattr(m, script_name))
28             continue
29
30         try:
31             all.append(__import__('%s.%s' % (m.__name__, script_name), globals(), locals(), [m.__name__]))
32         except ImportError, e:
33             #print repr(type(e)) + m.__name__ + ":" + str(e)
34             pass
35         except:
36             import traceback
37             msg = "Error importing %s from module %s: \n %s" % (
38                 script_name, m, traceback.format_exc()
39             )
40             logging.error(msg)
41
42     return all
43
44 def get_modules_script_implementations(script_name, impl_class):
45     scripts = get_modules_script(script_name)
46     all_impls = {}
47
48     for script in scripts:
49         all_impls.update(dict([
50             (n, i) for (n, i) in [(n, getattr(script, n)) for n in dir(script)]
51             if isinstance(i, impl_class)
52         ]))
53
54     return all_impls
55
56 def get_modules_script_classes(script_name, base_class):
57     scripts = get_modules_script(script_name)
58     all_classes = {}
59
60     for script in scripts:
61         all_classes.update(dict([
62             (n, c) for (n, c) in [(n, getattr(script, n)) for n in dir(script)]
63             if isinstance(c, (type, types.ClassType)) and issubclass(c, base_class)
64         ]))
65
66     return all_classes
67
68 def get_all_handlers(name):
69      handler_files = get_modules_script('handlers')
70
71      return [
72         h for h in [
73             getattr(f, name) for f in handler_files
74             if hasattr(f, name)
75         ]
76
77         if callable(h)
78      ]
79
80 def call_all_handlers(name, *args, **kwargs):
81     all = get_all_handlers(name)
82
83     ret = []
84
85     for handler in all:
86         ret.append(handler(*args, **kwargs))
87
88     return ret
89
90 def get_handler(name, default):
91     all = get_all_handlers(name)
92     return len(all) and all[0] or default
93
94 from decorators import decorate, ReturnImediatelyException