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.decode('utf-8'))
101
101
# Instantiate the view, which should be a BaseView class
102
view = viewcls(req, **kwargs)
102
view = viewcls(req, obj)
104
104
# Check that the request (mainly the user) is permitted to access
139
139
req.store.commit()
143
XHTMLErrorView(req, NotFound()).render(req)
141
except RoutingError, e:
143
XHTMLErrorView(req, NotFound('Not found: ' +
144
str(e.args))).render(req)
146
XHTMLErrorView(req, NotFound()).render(req)
146
150
def handle_unknown_exception(req, exc_type, exc_value, exc_traceback):