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

« back to all changes in this revision

Viewing changes to ivle/dispatch/__init__.py

Added a console plugin, which now uses our new architecture.

Show diffs side-by-side

added added

removed removed

Lines of Context:
35
35
import logging
36
36
import socket
37
37
import time
 
38
import inspect
38
39
 
39
40
import mod_python
40
41
import routes
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
47
49
import apps
48
50
import html
49
51
import plugins.console # XXX: Relies on www/ being in the Python path.
50
52
 
51
53
# XXX List of plugins, which will eventually be read in from conf
52
54
plugins_HACK = [
 
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',
60
 
]
 
65
    'ivle.webapp.media#Plugin',
 
66
61
67
 
62
 
def get_routes_mapper():
 
68
def generate_route_mapper(view_plugins):
63
69
    """
64
70
    Build a Mapper object for doing URL matching using 'routes', based on the
65
 
    plugins config.
 
71
    given plugin registry.
66
72
    """
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]),
73
 
            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:
76
78
            routex = url[0]
77
79
            view_class = url[1]
79
81
            m.connect(routex, view=view_class, **kwargs_dict)
80
82
    return m
81
83
 
 
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).
 
88
    return (plugin_path,
 
89
            getattr(__import__(plugin_path, fromlist=[classname]), classname))
 
90
 
82
91
def handler(req):
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])
 
146
 
127
147
    matchdict = req.mapper.match(req.uri)
128
148
    if matchdict is not None:
129
149
        viewcls = matchdict['view']