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

« back to all changes in this revision

Viewing changes to ivle/dispatch/__init__.py

Dispatch now generates an index for each plugin type, allowing plugins to
be written which are aware of other plugins, and other plugin types.

All view plugins now subclass from ivle.webapp.base.plugins.ViewPlugin,
as opposed to subclassing BasePlugin directly. This will allow us to
easily re-write console as an OverlayPlugin, and allow future new
plugins types to be created.

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.
61
63
    'ivle.webapp.console#Plugin',
62
64
    'ivle.webapp.security#Plugin',
63
65
    'ivle.webapp.media#Plugin',
64
 
]
 
66
65
67
 
66
 
def generate_route_mapper(plugins):
 
68
def generate_route_mapper(view_plugins):
67
69
    """
68
70
    Build a Mapper object for doing URL matching using 'routes', based on the
69
71
    given plugin registry.
70
72
    """
71
73
    m = routes.Mapper(explicit=True)
72
 
    for name in plugins:
 
74
    for plugin in view_plugins:
73
75
        # Establish a URL pattern for each element of plugin.urls
74
 
        if not hasattr(plugins[name], 'urls'):
75
 
            continue
76
 
        for url in plugins[name].urls:
 
76
        assert hasattr(plugin, 'urls'), "%r does not have any urls" % plugin 
 
77
        for url in plugin.urls:
77
78
            routex = url[0]
78
79
            view_class = url[1]
79
80
            kwargs_dict = url[2] if len(url) >= 3 else {}
132
133
    # (Wait till WSGI)
133
134
    # XXX No authentication is done here
134
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)
135
144
    req.reverse_plugins = dict([(v, k) for (k, v) in req.plugins.items()])
136
 
    req.mapper = generate_route_mapper(req.plugins)
 
145
    req.mapper = generate_route_mapper(req.plugin_index[ViewPlugin])
137
146
 
138
147
    matchdict = req.mapper.match(req.uri)
139
148
    if matchdict is not None: