~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/dispatch/__init__.py

  • Committer: William Grant
  • Date: 2009-07-02 12:48:16 UTC
  • mto: (1294.4.2 ui-the-third)
  • mto: This revision was merged to the branch mainline in revision 1353.
  • Revision ID: grantw@unimelb.edu.au-20090702124816-gmwkqe9n87a99n33
Replace string-route-based dispatch with object-traversal-route one.

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
import time
38
38
 
39
39
import mod_python
40
 
import routes
41
40
 
42
41
from ivle import util
43
42
import ivle.config
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
49
50
 
50
51
config = ivle.config.Config()
51
52
 
52
 
def generate_router(view_plugins, attr):
 
53
def generate_router(view_plugins, root):
53
54
    """
54
55
    Build a Mapper object for doing URL matching using 'routes', based on the
55
56
    given plugin registry.
56
57
    """
57
 
    m = routes.Mapper(explicit=True)
 
58
    r = Router(root=root)
 
59
 
 
60
    r.add_set_switch('api', 'api')
 
61
 
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):
62
 
            routex = url[0]
63
 
            view_class = url[1]
64
 
            kwargs_dict = url[2] if len(url) >= 3 else {}
65
 
            m.connect(routex, view=view_class, **kwargs_dict)
66
 
    return m
 
63
        if hasattr(plugin, 'forward_routes'):
 
64
            for fr in plugin.forward_routes:
 
65
                r.add_forward(*fr)
 
66
 
 
67
        if hasattr(plugin, 'views'):
 
68
            for v in plugin.views:
 
69
                r.add_view(*v)
 
70
 
 
71
    return r
67
72
 
68
73
def handler(apachereq):
69
74
    """Handles an HTTP request.
85
90
            req.user = user
86
91
 
87
92
    if req.publicmode:
88
 
        req.mapper = generate_router(config.plugin_index[PublicViewPlugin],
89
 
                                    'public_urls')
90
 
    else:
91
 
        req.mapper = generate_router(config.plugin_index[ViewPlugin], 'urls')
92
 
 
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()
99
 
        del kwargs['view']
 
93
        raise NotImplementedError("no public mode with obtrav yet!")
 
94
 
 
95
    req.router = generate_router(config.plugin_index[ViewPlugin],
 
96
                                 ApplicationRoot(req.config, req.store))
 
97
 
 
98
    try:
 
99
        obj, viewcls, subpath = req.router.resolve(req.uri)
 
100
    except RoutingError:
 
101
        obj, viewcls, subpath = None, None, ()
 
102
 
 
103
    if viewcls is not None:
100
104
        try:
101
105
            # Instantiate the view, which should be a BaseView class
102
 
            view = viewcls(req, **kwargs)
 
106
            view = viewcls(req, obj)
103
107
 
104
108
            # Check that the request (mainly the user) is permitted to access
105
109
            # the view.