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

« back to all changes in this revision

Viewing changes to www/dispatch/request.py

  • Committer: mattgiuca
  • Date: 2008-02-19 00:54:28 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:500
db: get_user and get_users now return User objects instead of dictionaries.
    This is the major part of replacing dicts with User objects, as it
    propagates upwards.

Propagated User objects up through the following modules:
    listusers.py, dispatch.login, authenticate, userservice, forumutil
All of these now treat users as an object rather than a dict.

To save on the size of the changes so far, login still individually copies
fields over to the session (so the session does not yet store a user object;
that is the second part of this refactor).

WOO!! Revision 500 :)

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
import mod_python
28
28
from mod_python import (util, Session, Cookie)
29
29
import conf
30
 
import plugins.console
31
30
 
32
31
class Request:
33
32
    """An IVLE request object. This is presented to the IVLE apps as a way of
44
43
            String. The path specified in the URL *not including* the
45
44
            application or the IVLE location prefix. eg. a URL of
46
45
            "/ivle/files/joe/myfiles" has a path of "joe/myfiles".
47
 
        user (read)
48
 
            User object. Details of the user who is currently logged in, or
 
46
        username (read)
 
47
            String. Login name of the user who is currently logged in, or
49
48
            None.
50
49
        hostname (read)
51
50
            String. Hostname the server is running on.
81
80
            in the head, if write_html_head_foot is True.
82
81
            URLs should be relative to the IVLE root; they will be fixed up
83
82
            to be site-relative.
84
 
        scripts_init (write)
85
 
            List of strings. Write a list of JS function names, and they
86
 
            will be added as window.addListener('load', ..., false); calls
87
 
            in the head, if write_html_head_foot is True.
88
 
            This is the propper way to specify functions that need to run at 
89
 
            page load time.
90
83
        write_html_head_foot (write)
91
84
            Boolean. If True, dispatch assumes that this is an XHTML page, and
92
85
            will immediately write a full HTML head, open the body element,
185
178
        # Split the given path into the app (top-level dir) and sub-path
186
179
        # (after first stripping away the root directory)
187
180
        path = common.util.unmake_path(req.uri)
188
 
        (self.app, self.path) = (common.util.split_path(path))
189
 
        self.user = None
 
181
        if self.publicmode:
 
182
            self.app = None
 
183
            self.path = path
 
184
        else:
 
185
            (self.app, self.path) = (common.util.split_path(path))
 
186
        self.username = None
190
187
        self.hostname = req.hostname
191
188
        self.headers_in = req.headers_in
192
189
        self.headers_out = req.headers_out
198
195
        self.title = None     # Will be set by dispatch before passing to app
199
196
        self.styles = []
200
197
        self.scripts = []
201
 
        self.scripts_init = []
202
198
        self.write_html_head_foot = False
203
199
        self.got_common_vars = False
204
200
 
206
202
        """Writes out the HTTP and HTML headers before any real data is
207
203
        written."""
208
204
        self.headers_written = True
209
 
        
210
 
        # app is the App object for the chosen app
211
 
        try:
212
 
            app = conf.apps.app_url[self.app]
213
 
        except KeyError:
214
 
            app = None
215
 
 
216
 
        # Write any final modifications to header content
217
 
        if app and app.useconsole and self.user:
218
 
            plugins.console.insert_scripts_styles(self.scripts, self.styles, \
219
 
                self.scripts_init)
220
 
 
221
205
        # Prepare the HTTP and HTML headers before the first write is made
222
206
        if self.content_type != None:
223
207
            self.apache_req.content_type = self.content_type
267
251
        else:
268
252
            return self.apache_req.read(len)
269
253
 
270
 
    def throw_error(self, httpcode, message=None):
 
254
    def throw_error(self, httpcode):
271
255
        """Writes out an HTTP error of the specified code. Raises an exception
272
256
        which is caught by the dispatch or web server, so any code following
273
257
        this call will not be executed.
275
259
        httpcode: An HTTP response status code. Pass a constant from the
276
260
        Request class.
277
261
        """
278
 
        raise common.util.IVLEError(httpcode, message)
 
262
        raise mod_python.apache.SERVER_RETURN, httpcode
279
263
 
280
264
    def throw_redirect(self, location):
281
265
        """Writes out an HTTP redirect to the specified URL. Raises an
321
305
            self.apache_req.add_common_vars()
322
306
            self.got_common_vars = True
323
307
        return self.apache_req.subprocess_env
324
 
 
325
 
    @staticmethod
326
 
    def get_http_codename(code):
327
 
        """Given a HTTP error code int, returns a (name, description)
328
 
        pair, suitable for displaying to the user.
329
 
        May return (None,None) if code is unknown.
330
 
        Only lists common 4xx and 5xx codes (since this is just used
331
 
        to display throw_error error messages).
332
 
        """
333
 
        try:
334
 
            return http_codenames[code]
335
 
        except KeyError:
336
 
            return None, None
337
 
 
338
 
# Human strings for HTTP response codes
339
 
http_codenames = {
340
 
    Request.HTTP_BAD_REQUEST:
341
 
        ("Bad Request",
342
 
        "Your browser sent a request IVLE did not understand."),
343
 
    Request.HTTP_UNAUTHORIZED:
344
 
        ("Unauthorized",
345
 
        "You are not allowed to view this part of IVLE."),
346
 
    Request.HTTP_FORBIDDEN:
347
 
        ("Forbidden",
348
 
        "You are not allowed to view this part of IVLE."),
349
 
    Request.HTTP_NOT_FOUND:
350
 
        ("Not Found",
351
 
        "The application or file you requested does not exist."),
352
 
    Request.HTTP_METHOD_NOT_ALLOWED:
353
 
        ("Method Not Allowed",
354
 
        "Your browser is interacting with IVLE in the wrong way."
355
 
        "This is probably a bug in IVLE. "
356
 
        "Please report it to the administrators."),
357
 
    Request.HTTP_INTERNAL_SERVER_ERROR:
358
 
        ("Internal Server Error",
359
 
        "An unknown error occured in IVLE."),
360
 
    Request.HTTP_NOT_IMPLEMENTED:
361
 
        ("Not Implemented",
362
 
        "The application or file you requested has not been implemented "
363
 
        "in IVLE."),
364
 
    Request.HTTP_SERVICE_UNAVAILABLE:
365
 
        ("Service Unavailable",
366
 
        "IVLE is currently experiencing technical difficulties. "
367
 
        "Please try again later."),
368
 
}