44
45
import ivle.conf.apps
45
46
from ivle.dispatch.request import Request
46
47
from ivle.dispatch import login
48
from ivle.webapp.base.plugins import ViewPlugin
49
51
import plugins.console # XXX: Relies on www/ being in the Python path.
51
53
# XXX List of plugins, which will eventually be read in from conf
55
'ivle.webapp.core#Plugin',
53
56
'ivle.webapp.admin.user#Plugin',
54
57
'ivle.webapp.tutorial#Plugin',
55
58
'ivle.webapp.admin.subject#Plugin',
56
'ivle.webapp.browser#Plugin',
59
'ivle.webapp.filesystem.browser#Plugin',
60
'ivle.webapp.filesystem.diff#Plugin',
61
'ivle.webapp.filesystem.svnlog#Plugin',
57
62
'ivle.webapp.groups#Plugin',
58
63
'ivle.webapp.console#Plugin',
59
64
'ivle.webapp.security#Plugin',
65
'ivle.webapp.media#Plugin',
62
def get_routes_mapper():
68
def generate_route_mapper(view_plugins):
64
70
Build a Mapper object for doing URL matching using 'routes', based on the
71
given plugin registry.
67
73
m = routes.Mapper(explicit=True)
68
for pluginstr in plugins_HACK:
69
plugin_path, classname = pluginstr.split('#')
70
# Load the plugin module from somewhere in the Python path
71
# (Note that plugin_path is a fully-qualified Python module name).
72
plugin = getattr(__import__(plugin_path, fromlist=[classname]),
74
for plugin in view_plugins:
74
75
# Establish a URL pattern for each element of plugin.urls
76
assert hasattr(plugin, 'urls'), "%r does not have any urls" % plugin
75
77
for url in plugin.urls:
77
79
view_class = url[1]
79
81
m.connect(routex, view=view_class, **kwargs_dict)
84
def get_plugin(pluginstr):
85
plugin_path, classname = pluginstr.split('#')
86
# Load the plugin module from somewhere in the Python path
87
# (Note that plugin_path is a fully-qualified Python module name).
89
getattr(__import__(plugin_path, fromlist=[classname]), classname))
83
92
"""Handles a request which may be to anywhere in the site except media.
84
93
Intended to be called by mod_python, as a handler.
123
132
# XXX This should be done ONCE per Python process, not per request.
124
133
# (Wait till WSGI)
125
134
# XXX No authentication is done here
126
req.mapper = get_routes_mapper()
135
req.plugins = dict([get_plugin(pluginstr) for pluginstr in plugins_HACK])
136
# Index the plugins by base class
137
req.plugin_index = {}
138
for plugin in req.plugins.values():
139
# Getmro returns a tuple of all the super-classes of the plugin
140
for base in inspect.getmro(plugin):
141
if base not in req.plugin_index:
142
req.plugin_index[base] = []
143
req.plugin_index[base].append(plugin)
144
req.reverse_plugins = dict([(v, k) for (k, v) in req.plugins.items()])
145
req.mapper = generate_route_mapper(req.plugin_index[ViewPlugin])
127
147
matchdict = req.mapper.match(req.uri)
128
148
if matchdict is not None:
129
149
viewcls = matchdict['view']