annotate roundup/cgi/apache.py @ 3696:790363e96852

Sorting/grouping by multiple properties. - Implement sorting/grouping by multiple properties for the web interface. I'm now using @sort0/@sortdir0,@sort1/@sortdir1,... and @group0/@groupdir0,... when generating URLs from a search template. These are converted to a list internally. When saving URLs (e.g. when storing queries) I'm using @sort=prop1,prop2,... and @group=... with optional '-' prepended to individual props. This means saved URLs are backward compatible with existing trackers (and yes, this was a design goal). I need the clumsy version with @sort0,@sort1 etc, because I'm currently using several selectors and checkboxes (as the classic template does, too). I don't think there is a way around that in HTML? - Updated (hopefully all) documentation to reflect the new URL format and the consequences in the web-interface. - I've set the number of sort/group properties in the classic template to two -- this can easily be reverted by changing n_sort to 1. Richard, would you look over these changes? I've set a tag before and (will set) after commit, so that it would be easy to merge out. Don't be too scared about the size of the change, most is documentation, the guts are in cgi/templating.py and small changes in the classic template.
author Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
date Wed, 30 Aug 2006 20:28:26 +0000
parents 835ac4013578
children e8d4ac23692f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
1 # mod_python interface for Roundup Issue Tracker
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
2 #
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
3 # This module is free software, you may redistribute it
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
4 # and/or modify under the same terms as Python.
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
5 #
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
6 # This module provides Roundup Web User Interface
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
7 # using mod_python Apache module. Initially written
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
8 # with python 2.3.3, mod_python 3.1.3, roundup 0.7.0.
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
9 #
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
10 # This module operates with only one tracker
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
11 # and must be placed in the tracker directory.
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
12 #
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
13 # History (most recent first):
2560
d45f1669599c added 'TrackerLanguage' option;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2552
diff changeset
14 # 11-jul-2004 [als] added 'TrackerLanguage' option;
d45f1669599c added 'TrackerLanguage' option;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2552
diff changeset
15 # pass message translator to the tracker client instance
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
16 # 04-jul-2004 [als] tracker lookup moved from module global to request handler;
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
17 # use PythonOption TrackerHome (configured in apache)
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
18 # to open the tracker
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
19 # 06-may-2004 [als] use cgi.FieldStorage from Python library
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
20 # instead of mod_python FieldStorage
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
21 # 29-apr-2004 [als] created
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
22
2944
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
23 __version__ = "$Revision: 1.4 $"[11:-2]
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
24 __date__ = "$Date: 2004-11-22 07:33:34 $"[7:-2]
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
25
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
26 import cgi
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
27 import os
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
28
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
29 from mod_python import apache
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
30
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
31 import roundup.instance
2560
d45f1669599c added 'TrackerLanguage' option;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2552
diff changeset
32 from roundup.cgi import TranslationService
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
33
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
34 class Headers(dict):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
35
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
36 """HTTP headers wrapper"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
37
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
38 def __init__(self, headers):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
39 """Initialize with `apache.table`"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
40 super(Headers, self).__init__(headers)
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
41 self.getheader = self.get
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
42
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
43 class Request(object):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
44
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
45 """`apache.Request` object wrapper providing roundup client interface"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
46
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
47 def __init__(self, request):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
48 """Initialize with `apache.Request` object"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
49 self._req = request
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
50 # .headers.getheader()
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
51 self.headers = Headers(request.headers_in)
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
52 # .wfile.write()
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
53 self.wfile = self._req
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
54
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
55 def send_response(self, response_code):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
56 """Set HTTP response code"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
57 self._req.status = response_code
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
58
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
59 def send_header(self, name, value):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
60 """Set output header"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
61 # value may be an instance of roundup.cgi.exceptions.HTTPException
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
62 value = str(value)
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
63 # XXX default content_type is "text/plain",
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
64 # and ain't overrided by "Content-Type" header
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
65 if name == "Content-Type":
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
66 self._req.content_type = value
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
67 else:
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
68 self._req.headers_out.add(name, value)
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
69
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
70 def end_headers(self):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
71 """NOOP. There aint no such thing as 'end_headers' in mod_python"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
72 pass
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
73
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
74 def handler(req):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
75 """HTTP request handler"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
76 _options = req.get_options()
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
77 _home = _options.get("TrackerHome")
2560
d45f1669599c added 'TrackerLanguage' option;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2552
diff changeset
78 _lang = _options.get("TrackerLanguage")
2944
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
79 _timing = _options.get("TrackerTiming", "no")
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
80 if _timing.lower() in ("no", "false"):
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
81 _timing = ""
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
82 _debug = _options.get("TrackerDebug", "no")
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
83 _debug = _debug.lower not in ("no", "false")
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
84 if not (_home and os.path.isdir(_home)):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
85 apache.log_error(
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
86 "PythonOption TrackerHome missing or invalid for %(uri)s"
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
87 % {'uri': req.uri})
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
88 return apache.HTTP_INTERNAL_SERVER_ERROR
2944
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
89 _tracker = roundup.instance.open(_home, not _debug)
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
90 # create environment
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
91 # Note: cookies are read from HTTP variables, so we need all HTTP vars
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
92 req.add_common_vars()
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
93 _env = dict(req.subprocess_env)
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
94 # XXX classname must be the first item in PATH_INFO. roundup.cgi does:
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
95 # path = string.split(os.environ.get('PATH_INFO', '/'), '/')
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
96 # os.environ['PATH_INFO'] = string.join(path[2:], '/')
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
97 # we just remove the first character ('/')
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
98 _env["PATH_INFO"] = req.path_info[1:]
2944
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
99 if _timing:
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
100 _env["CGI_SHOW_TIMING"] = _timing
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
101 _form = cgi.FieldStorage(req, environ=_env)
2560
d45f1669599c added 'TrackerLanguage' option;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2552
diff changeset
102 _client = _tracker.Client(_tracker, Request(req), _env, _form,
2809
353dc16a49b2 pass tracker home directory to get_translation()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2560
diff changeset
103 translator=TranslationService.get_translation(_lang,
353dc16a49b2 pass tracker home directory to get_translation()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2560
diff changeset
104 tracker_home=_home))
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
105 _client.main()
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
106 return apache.OK
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
107
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
108 # vim: set et sts=4 sw=4 :

Roundup Issue Tracker: http://roundup-tracker.org/