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

« back to all changes in this revision

Viewing changes to ivle/dispatch/__init__.py

  • Committer: Nick Chadwick
  • Date: 2009-03-09 00:15:21 UTC
  • mfrom: (1099.6.4 new-dispatch)
  • mto: This revision was merged to the branch mainline in revision 1162.
  • Revision ID: chadnickbok@gmail.com-20090309001521-dffcygyuyvs2cap0
finished the exercise-ui. It is now ready to be merged with trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
40
40
import routes
41
41
 
42
42
from ivle import util
43
 
import ivle.config
 
43
import ivle.conf
44
44
from ivle.dispatch.request import Request
45
45
import ivle.webapp.security
46
46
from ivle.webapp.base.plugins import ViewPlugin, PublicViewPlugin
47
47
from ivle.webapp.base.xhtml import XHTMLView, XHTMLErrorView
48
48
from ivle.webapp.errors import HTTPError, Unauthorized, NotFound
49
49
 
50
 
config = ivle.config.Config()
51
 
 
52
 
def generate_router(view_plugins, attr):
 
50
def generate_route_mapper(view_plugins, attr):
53
51
    """
54
52
    Build a Mapper object for doing URL matching using 'routes', based on the
55
53
    given plugin registry.
73
71
    @param apachereq: An Apache request object.
74
72
    """
75
73
    # Make the request object into an IVLE request which can be given to views
76
 
    req = Request(apachereq, config)
 
74
    req = Request(apachereq)
77
75
 
78
76
    # Hack? Try and get the user login early just in case we throw an error
79
77
    # (most likely 404) to stop us seeing not logged in even when we are.
84
82
        if user and user.valid:
85
83
            req.user = user
86
84
 
 
85
    conf = ivle.config.Config()
 
86
    req.config = conf
 
87
 
87
88
    if req.publicmode:
88
 
        req.mapper = generate_router(config.plugin_index[PublicViewPlugin],
89
 
                                    'public_urls')
 
89
        req.mapper = generate_route_mapper(conf.plugin_index[PublicViewPlugin],
 
90
                                           'public_urls')
90
91
    else:
91
 
        req.mapper = generate_router(config.plugin_index[ViewPlugin], 'urls')
 
92
        req.mapper = generate_route_mapper(conf.plugin_index[ViewPlugin],
 
93
                                           'urls')
92
94
 
93
95
    matchdict = req.mapper.match(req.uri)
94
96
    if matchdict is not None:
126
128
                return req.OK
127
129
            else:
128
130
                return e.code
129
 
        except mod_python.apache.SERVER_RETURN:
130
 
            # A mod_python-specific Apache error.
131
 
            # XXX: We need to raise these because req.throw_error() uses them.
132
 
            # Remove this after Google Code issue 117 is fixed.
133
 
            raise
134
131
        except Exception, e:
135
132
            # A non-HTTPError appeared. We have an unknown exception. Panic.
136
133
            handle_unknown_exception(req, *sys.exc_info())
139
136
            req.store.commit()
140
137
            return req.OK
141
138
    else:
142
 
        req.status = 404
143
139
        XHTMLErrorView(req, NotFound()).render(req)
144
140
        return req.OK
145
141
 
154
150
    the IVLE request is created.
155
151
    """
156
152
    req.content_type = "text/html"
157
 
    logfile = os.path.join(config['paths']['logs'], 'ivle_error.log')
 
153
    logfile = os.path.join(ivle.conf.log_path, 'ivle_error.log')
158
154
    logfail = False
159
 
 
160
 
    # XXX: This remains here for ivle.interpret's IVLEErrors. Once we rewrite
161
 
    #      fileservice, req.status should always be 500 (ISE) here.
162
155
    try:
163
156
        httpcode = exc_value.httpcode
164
157
        req.status = httpcode
165
158
    except AttributeError:
166
159
        httpcode = None
167
160
        req.status = mod_python.apache.HTTP_INTERNAL_SERVER_ERROR
168
 
 
169
161
    try:
170
162
        publicmode = req.publicmode
171
163
    except AttributeError:
194
186
    # misbehaves (which is currently very easy, if things aren't set up
195
187
    # correctly).
196
188
    # Write the traceback.
197
 
 
198
 
    # We need to special-case IVLEJailError, as we can get another
 
189
    # If this is a non-4xx IVLEError, get the message and httpcode and
 
190
    # make the error message a bit nicer (but still include the
 
191
    # traceback).
 
192
    # We also need to special-case IVLEJailError, as we can get another
199
193
    # almost-exception out of it.
 
194
 
 
195
    codename, msg = None, None
 
196
 
200
197
    if exc_type is util.IVLEJailError:
 
198
        msg = exc_value.type_str + ": " + exc_value.message
201
199
        tb = 'Exception information extracted from IVLEJailError:\n'
202
200
        tb += urllib.unquote(exc_value.info)
203
201
    else:
 
202
        try:
 
203
            codename, msg = req.get_http_codename(httpcode)
 
204
        except AttributeError:
 
205
            pass
 
206
 
204
207
        tb = ''.join(traceback.format_exception(exc_type, exc_value,
205
208
                                                exc_traceback))
206
209
 
207
 
    logging.error('\n' + tb)
 
210
    logging.error('%s\n%s'%(str(msg), tb))
208
211
 
209
212
    # Error messages are only displayed is the user is NOT a student,
210
213
    # or if there has been a problem logging the error message
214
217
<html xmlns="http://www.w3.org/1999/xhtml">
215
218
<head><title>IVLE Internal Server Error</title></head>
216
219
<body>
217
 
<h1>IVLE Internal Server Error</h1>
 
220
<h1>IVLE Internal Server Error""")
 
221
    if show_errors:
 
222
        if codename is not None and \
 
223
           httpcode != mod_python.apache.HTTP_INTERNAL_SERVER_ERROR:
 
224
            req.write(": %s" % cgi.escape(codename))
 
225
 
 
226
    req.write("""</h1>
218
227
<p>An error has occured which is the fault of the IVLE developers or
219
228
administrators. """)
220
229
 
226
235
    req.write("</p>")
227
236
 
228
237
    if show_errors:
 
238
        if msg is not None:
 
239
            req.write("<p>%s</p>\n" % cgi.escape(msg))
 
240
        if httpcode is not None:
 
241
            req.write("<p>(HTTP error code %d)</p>\n" % httpcode)
229
242
        req.write("<h2>Debugging information</h2>")
 
243
 
230
244
        req.write("<pre>\n%s\n</pre>\n"%cgi.escape(tb))
231
245
    req.write("</body></html>")