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