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

« back to all changes in this revision

Viewing changes to ivle/dispatch/__init__.py

Began implementing new dispatch framework (with Will Grant and Nick Chadwick).
Added package: ivle.webapp. This contains 'base', with some base class
    implementations for the new Plugins and Views, and 'admin', with 'user'
    (part of 'userservice') re-implemented for the new framework in a RESTful
    way.
dispatch: Added code to partly handle the new plugin system, then fall back to
    the old one.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
17
 
18
 
# Author: Matt Giuca
 
18
# Author: Matt Giuca, Will Grant
19
19
 
20
20
"""
21
21
This is a mod_python handler program. The correct way to call it is to have
38
38
 
39
39
import mod_python
40
40
from mod_python import apache, Cookie
 
41
import routes
41
42
 
42
43
from ivle import util
43
44
import ivle.conf
48
49
from request import Request
49
50
import plugins.console # XXX: Relies on www/ being in the Python path.
50
51
 
 
52
# XXX List of plugins, which will eventually be read in from conf
 
53
# Elements are (module, classname) pairs.
 
54
plugins_HACK = [
 
55
    ('ivle.webapp.admin.user', 'Plugin'),
 
56
]
 
57
 
 
58
def get_routes_mapper():
 
59
    """
 
60
    Build a Mapper object for doing URL matching using 'routes', based on the
 
61
    plugins config.
 
62
    """
 
63
    m = routes.Mapper()
 
64
    for plugin_path, classname in plugins_HACK:
 
65
        # Load the plugin module from somewhere in the Python path
 
66
        # (Note that plugin_path is a fully-qualified Python module name).
 
67
        plugin = getattr(__import__(plugin_path, fromlist=[classname]),
 
68
            classname)
 
69
        # Establish a URL pattern for each element of plugin.urls
 
70
        for url in plugin.urls:
 
71
            routex = url[0]
 
72
            view_class = url[1]
 
73
            kwargs_dict = url[2] if len(url) >= 3 else {}
 
74
            m.connect(routex, view=view_class, **kwargs_dict)
 
75
    return m
 
76
 
51
77
def handler(req):
52
78
    """Handles a request which may be to anywhere in the site except media.
53
79
    Intended to be called by mod_python, as a handler.
88
114
    if not req.publicmode:
89
115
        req.user = login.get_user_details(req)
90
116
 
 
117
    ### BEGIN New plugins framework ###
 
118
    # XXX This should be done ONCE per Python process, not per request.
 
119
    # (Wait till WSGI)
 
120
    # XXX No authentication is done here
 
121
    mapper = get_routes_mapper()
 
122
    matchdict = mapper.match(req.uri)
 
123
    if matchdict is not None:
 
124
        viewcls = matchdict['view']
 
125
        # Get the remaining arguments, less 'view', 'action' and 'controller'
 
126
        # (The latter two seem to be built-in, and we don't want them).
 
127
        kwargs = matchdict.copy()
 
128
        del kwargs['view']
 
129
        del kwargs['action']
 
130
        del kwargs['controller']
 
131
        # Instantiate the view, which should be a BaseView class
 
132
        view = viewcls(req, **kwargs)
 
133
        # Render the output
 
134
        view.render(req)
 
135
        req.store.commit()
 
136
        return req.OK
 
137
    ### END New plugins framework ###
 
138
 
91
139
    # Check req.app to see if it is valid. 404 if not.
92
140
    if req.app is not None and req.app not in ivle.conf.apps.app_url:
93
141
        req.throw_error(Request.HTTP_NOT_FOUND,