~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-04 12:52:34 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-20090704125234-w4fb92f9n4rtp6d8
svnlog ported...

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.decode('utf-8'))
100
100
        try:
101
101
            # Instantiate the view, which should be a BaseView class
102
 
            view = viewcls(req, **kwargs)
 
102
            view = viewcls(req, obj)
103
103
 
104
104
            # Check that the request (mainly the user) is permitted to access
105
105
            # the view.
138
138
        else:
139
139
            req.store.commit()
140
140
            return req.OK
141
 
    else:
142
 
        req.status = 404
143
 
        XHTMLErrorView(req, NotFound()).render(req)
 
141
    except RoutingError, e:
 
142
        if req.user.admin:
 
143
            XHTMLErrorView(req, NotFound('Not found: ' +
 
144
                                         str(e.args))).render(req)
 
145
        else:
 
146
            XHTMLErrorView(req, NotFound()).render(req)
 
147
 
144
148
        return req.OK
145
149
 
146
150
def handle_unknown_exception(req, exc_type, exc_value, exc_traceback):