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

« back to all changes in this revision

Viewing changes to ivle/dispatch/__init__.py

Error views are now retrieved from a class method of the view, not the plugin
registry. They also now discriminate based on exception type.

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, ErrorPlugin
 
48
from ivle.webapp.base.plugins import ViewPlugin
49
49
from ivle.webapp.errors import HTTPError
50
50
import apps
51
51
import html
53
53
# XXX List of plugins, which will eventually be read in from conf
54
54
plugins_HACK = [
55
55
    'ivle.webapp.core#Plugin',
56
 
    'ivle.webapp.base#Plugin',
57
56
    'ivle.webapp.admin.user#Plugin',
58
57
    'ivle.webapp.tutorial#Plugin',
59
58
    'ivle.webapp.admin.subject#Plugin',
90
89
    return (plugin_path,
91
90
            getattr(__import__(plugin_path, fromlist=[classname]), classname))
92
91
 
93
 
def get_error_view(req, viewcls):
94
 
    if ErrorPlugin not in req.plugin_index:
95
 
        return
96
 
 
97
 
    error_plugins = req.plugin_index[ErrorPlugin]
98
 
 
99
 
    view_map = {}
100
 
 
101
 
    for plugin in error_plugins:
102
 
        for src in plugin.error_views:
103
 
            view_map[src] = plugin.error_views[src]
104
 
 
105
 
    for cls in inspect.getmro(viewcls):
106
 
        if cls in view_map:
107
 
            return view_map[cls]
108
 
 
109
92
def handler(req):
110
93
    """Handles a request which may be to anywhere in the site except media.
111
94
    Intended to be called by mod_python, as a handler.
179
162
            req.status = e.code
180
163
 
181
164
            # Try to find a custom error view.
182
 
            errviewcls = get_error_view(req, viewcls)
 
165
            if hasattr(viewcls, 'get_error_view'):
 
166
                errviewcls = viewcls.get_error_view(e)
 
167
            else:
 
168
                errviewcls = None
 
169
 
183
170
            if errviewcls:
184
171
                errview = errviewcls(req, e)
185
172
                errview.render(req)