46
45
from ivle.webapp.base.plugins import ViewPlugin, PublicViewPlugin
47
46
from ivle.webapp.base.xhtml import XHTMLView, XHTMLErrorView
48
47
from ivle.webapp.errors import HTTPError, Unauthorized, NotFound
48
from ivle.webapp.urls import Router, RoutingError
49
from ivle.webapp import ApplicationRoot
50
51
config = ivle.config.Config()
52
def generate_router(view_plugins, attr):
53
def generate_router(view_plugins, root):
54
55
Build a Mapper object for doing URL matching using 'routes', based on the
55
56
given plugin registry.
57
m = routes.Mapper(explicit=True)
60
r.add_set_switch('api', 'api')
58
62
for plugin in view_plugins:
59
# Establish a URL pattern for each element of plugin.urls
60
assert hasattr(plugin, 'urls'), "%r does not have any urls" % plugin
61
for url in getattr(plugin, attr):
64
kwargs_dict = url[2] if len(url) >= 3 else {}
65
m.connect(routex, view=view_class, **kwargs_dict)
63
if hasattr(plugin, 'forward_routes'):
64
for fr in plugin.forward_routes:
67
if hasattr(plugin, 'views'):
68
for v in plugin.views:
68
73
def handler(apachereq):
69
74
"""Handles an HTTP request.
88
req.mapper = generate_router(config.plugin_index[PublicViewPlugin],
91
req.mapper = generate_router(config.plugin_index[ViewPlugin], 'urls')
93
matchdict = req.mapper.match(req.uri)
94
if matchdict is not None:
95
viewcls = matchdict['view']
96
# Get the remaining arguments, less 'view', 'action' and 'controller'
97
# (The latter two seem to be built-in, and we don't want them).
98
kwargs = matchdict.copy()
93
raise NotImplementedError("no public mode with obtrav yet!")
95
req.router = generate_router(config.plugin_index[ViewPlugin],
96
ApplicationRoot(req.config, req.store))
99
obj, viewcls, subpath = req.router.resolve(req.uri)
101
obj, viewcls, subpath = None, None, ()
103
if viewcls is not None:
101
105
# Instantiate the view, which should be a BaseView class
102
view = viewcls(req, **kwargs)
106
view = viewcls(req, obj)
104
108
# Check that the request (mainly the user) is permitted to access