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

« back to all changes in this revision

Viewing changes to ivle/dispatch/__init__.py

Add support for custom error views. Plugins can now declare that errors
occuring in a view class or its subclasses should be passed into another view.

We start with an XHTMLErrorView used to render errors in XHTMLViews.

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, ErrorPlugin
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',
56
57
    'ivle.webapp.admin.user#Plugin',
57
58
    'ivle.webapp.tutorial#Plugin',
58
59
    'ivle.webapp.admin.subject#Plugin',
89
90
    return (plugin_path,
90
91
            getattr(__import__(plugin_path, fromlist=[classname]), classname))
91
92
 
 
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
 
92
109
def handler(req):
93
110
    """Handles a request which may be to anywhere in the site except media.
94
111
    Intended to be called by mod_python, as a handler.
160
177
        except HTTPError, e:
161
178
            # A view explicitly raised an HTTP error. Respect it.
162
179
            req.status = e.code
163
 
            req.write(e.message)
164
 
            return e.code # Should be req.OK once we have our own errviews.
 
180
 
 
181
            # Try to find a custom error view.
 
182
            errviewcls = get_error_view(req, viewcls)
 
183
            if errviewcls:
 
184
                errview = errviewcls(req, e)
 
185
                errview.render(req)
 
186
                return req.OK
 
187
            else:
 
188
                req.write(e.message)
 
189
                return e.code
165
190
        except Exception, e:
166
191
            # A non-HTTPError appeared. We have an unknown exception. Panic.
167
192
            handle_unknown_exception(req, *sys.exc_info())