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