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

« back to all changes in this revision

Viewing changes to ivle/dispatch/__init__.py

Merge from new-dispatch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
import ivle.conf.apps
46
46
from ivle.dispatch.request import Request
47
47
from ivle.dispatch import login
48
 
from ivle.webapp.base.plugins import ViewPlugin
 
48
from ivle.webapp.base.plugins import ViewPlugin, PublicViewPlugin
49
49
from ivle.webapp.errors import HTTPError, Unauthorized
50
50
import apps
51
51
import html
59
59
    'ivle.webapp.filesystem.browser#Plugin',
60
60
    'ivle.webapp.filesystem.diff#Plugin',
61
61
    'ivle.webapp.filesystem.svnlog#Plugin',
 
62
    'ivle.webapp.filesystem.serve#Plugin',
62
63
    'ivle.webapp.groups#Plugin',
63
64
    'ivle.webapp.console#Plugin',
64
65
    'ivle.webapp.security#Plugin',
66
67
    'ivle.webapp.forum#Plugin',
67
68
    'ivle.webapp.help#Plugin',
68
69
    'ivle.webapp.tos#Plugin',
 
70
    'ivle.webapp.userservice#Plugin',
69
71
70
72
 
71
 
def generate_route_mapper(view_plugins):
 
73
def generate_route_mapper(view_plugins, attr):
72
74
    """
73
75
    Build a Mapper object for doing URL matching using 'routes', based on the
74
76
    given plugin registry.
77
79
    for plugin in view_plugins:
78
80
        # Establish a URL pattern for each element of plugin.urls
79
81
        assert hasattr(plugin, 'urls'), "%r does not have any urls" % plugin 
80
 
        for url in plugin.urls:
 
82
        for url in getattr(plugin, attr):
81
83
            routex = url[0]
82
84
            view_class = url[1]
83
85
            kwargs_dict = url[2] if len(url) >= 3 else {}
138
140
    ### BEGIN New plugins framework ###
139
141
    # XXX This should be done ONCE per Python process, not per request.
140
142
    # (Wait till WSGI)
141
 
    # XXX No authentication is done here
142
143
    req.plugins = dict([get_plugin(pluginstr) for pluginstr in plugins_HACK])
143
144
    # Index the plugins by base class
144
145
    req.plugin_index = {}
149
150
                req.plugin_index[base] = []
150
151
            req.plugin_index[base].append(plugin)
151
152
    req.reverse_plugins = dict([(v, k) for (k, v) in req.plugins.items()])
152
 
    req.mapper = generate_route_mapper(req.plugin_index[ViewPlugin])
 
153
 
 
154
    if req.publicmode:
 
155
        req.mapper = generate_route_mapper(req.plugin_index[PublicViewPlugin],
 
156
                                           'public_urls')
 
157
    else:
 
158
        req.mapper = generate_route_mapper(req.plugin_index[ViewPlugin],
 
159
                                           'urls')
153
160
 
154
161
    matchdict = req.mapper.match(req.uri)
155
162
    if matchdict is not None:
182
189
                errview = errviewcls(req, e)
183
190
                errview.render(req)
184
191
                return req.OK
185
 
            else:
 
192
            elif e.message:
186
193
                req.write(e.message)
 
194
                return req.OK
 
195
            else:
187
196
                return e.code
188
197
        except Exception, e:
189
198
            # A non-HTTPError appeared. We have an unknown exception. Panic.
192
201
        else:
193
202
            req.store.commit()
194
203
            return req.OK
 
204
    else:
 
205
        # We had no matching URL! Check if it matches an old-style app. If
 
206
        # not, 404.
 
207
        if req.app not in ivle.conf.apps.app_url:
 
208
            return req.HTTP_NOT_FOUND # TODO: Prettify.
195
209
    ### END New plugins framework ###
196
210
 
197
 
    # Check req.app to see if it is valid. 404 if not.
198
 
    if req.app is not None and req.app not in ivle.conf.apps.app_url:
199
 
        req.throw_error(Request.HTTP_NOT_FOUND,
200
 
            "There is no application called %s." % repr(req.app))
201
211
 
202
 
    # Special handling for public mode - only allow the public app, call it
203
 
    # and get out.
204
 
    # NOTE: This will not behave correctly if the public app uses
205
 
    # write_html_head_foot, but "serve" does not.
206
 
    if req.publicmode:
207
 
        if req.app != ivle.conf.apps.public_app:
208
 
            req.throw_error(Request.HTTP_FORBIDDEN,
209
 
                "This application is not available on the public site.")
210
 
        app = ivle.conf.apps.app_url[ivle.conf.apps.public_app]
211
 
        apps.call_app(app.dir, req)
212
 
        return req.OK
 
212
    ### BEGIN legacy application framework ###
 
213
    # We have no public apps back here.
 
214
    assert not req.publicmode
213
215
 
214
216
    # app is the App object for the chosen app
215
217
    if req.app is None:
235
237
        # sessions not time out.
236
238
        req.get_session().unlock()
237
239
 
238
 
        # If user did not specify an app, HTTP redirect to default app and
239
 
        # exit.
240
 
        if req.app is None:
241
 
            req.throw_redirect(util.make_path(ivle.conf.apps.default_app))
242
 
 
243
 
        # Set the default title to the app's tab name, if any. Otherwise URL
244
 
        # name.
245
 
        if app.name is not None:
246
 
            req.title = app.name
247
 
        else:
248
 
            req.title = req.app
249
 
 
250
240
        # Call the specified app with the request object
251
241
        apps.call_app(app.dir, req)
252
242
 
253
 
    # if not logged in, login.login will have written the login box.
254
 
    # Just clean up and exit.
255
 
 
256
243
    # MAKE SURE we write the HTTP (and possibly HTML) header. This
257
244
    # wouldn't happen if nothing else ever got written, so we have to make
258
245
    # sure.