annotate roundup/cgi/apache.py @ 5614:be99aa02c616

issue2550833 enhance the export csv action to include the keys for liked items rather than id's. So for nosy list display usernames and not numbers. The original code was renamed and also made available. See change document.
author John Rouillard <rouilj@ieee.org>
date Sat, 16 Feb 2019 15:17:21 -0500
parents 1ab2c81a64df
children a243a036e7f3
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
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
14 import cgi
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
15 import os
4213
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
16 import threading
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
17
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
18 from mod_python import apache
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
19
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
20 import roundup.instance
2560
d45f1669599c added 'TrackerLanguage' option;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2552
diff changeset
21 from roundup.cgi import TranslationService
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
22
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
23 class Headers(dict):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
24
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
25 """HTTP headers wrapper"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
26
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
27 def __init__(self, headers):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
28 """Initialize with `apache.table`"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
29 super(Headers, self).__init__(headers)
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
30 self.getheader = self.get
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
31
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
32 class Request(object):
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 """`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
35
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
36 def __init__(self, request):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
37 """Initialize with `apache.Request` object"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
38 self._req = request
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
39 # .headers.getheader()
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
40 self.headers = Headers(request.headers_in)
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
41 # .wfile.write()
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
42 self.wfile = self._req
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
43
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3735
diff changeset
44 def start_response(self, headers, response):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3735
diff changeset
45 self.send_response(response)
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3735
diff changeset
46 for key, value in headers:
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3735
diff changeset
47 self.send_header(key, value)
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3735
diff changeset
48 self.end_headers()
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3735
diff changeset
49
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
50 def send_response(self, response_code):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
51 """Set HTTP response code"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
52 self._req.status = response_code
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
53
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
54 def send_header(self, name, value):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
55 """Set output header"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
56 # 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
57 value = str(value)
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
58 # XXX default content_type is "text/plain",
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
59 # 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
60 if name == "Content-Type":
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
61 self._req.content_type = value
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
62 else:
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
63 self._req.headers_out.add(name, value)
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
64
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
65 def end_headers(self):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
66 """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
67 pass
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
68
4047
e70643990e9c Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents: 3736
diff changeset
69
e70643990e9c Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents: 3736
diff changeset
70 def sendfile(self, filename, offset = 0, len = -1):
e70643990e9c Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents: 3736
diff changeset
71 """Send 'filename' to the user."""
e70643990e9c Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents: 3736
diff changeset
72
e70643990e9c Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents: 3736
diff changeset
73 return self._req.sendfile(filename, offset, len)
e70643990e9c Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents: 3736
diff changeset
74
4213
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
75 __tracker_cache = {}
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
76 """A cache of optimized tracker instances.
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
77
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
78 The keys are strings giving the directories containing the trackers.
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
79 The values are tracker instances."""
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
80
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
81 __tracker_cache_lock = threading.Lock()
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
82 """A lock used to guard access to the cache."""
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
83
4047
e70643990e9c Support the use of sendfile() for file transfer, if available.
Stefan Seefeld <stefan@seefeld.name>
parents: 3736
diff changeset
84
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
85 def handler(req):
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
86 """HTTP request handler"""
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
87 _options = req.get_options()
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
88 _home = _options.get("TrackerHome")
2560
d45f1669599c added 'TrackerLanguage' option;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2552
diff changeset
89 _lang = _options.get("TrackerLanguage")
2944
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
90 _timing = _options.get("TrackerTiming", "no")
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
91 if _timing.lower() in ("no", "false"):
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
92 _timing = ""
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
93 _debug = _options.get("TrackerDebug", "no")
3735
e8d4ac23692f fix debug flag detection
Richard Jones <richard@users.sourceforge.net>
parents: 2944
diff changeset
94 _debug = _debug.lower() not in ("no", "false")
4213
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
95
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
96 # We do not need to take a lock here (the fast path) because reads
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
97 # from dictionaries are atomic.
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
98 if not _debug and _home in __tracker_cache:
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
99 _tracker = __tracker_cache[_home]
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
100 else:
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
101 if not (_home and os.path.isdir(_home)):
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
102 apache.log_error(
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
103 "PythonOption TrackerHome missing or invalid for %(uri)s"
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
104 % {'uri': req.uri})
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
105 return apache.HTTP_INTERNAL_SERVER_ERROR
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
106 if _debug:
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
107 _tracker = roundup.instance.open(_home, optimize=0)
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
108 else:
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
109 __tracker_cache_lock.acquire()
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
110 try:
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
111 # The tracker may have been added while we were acquiring
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
112 # the lock.
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
113 if _home in __tracker_cache:
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
114 _tracker = __tracker_cache[home]
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
115 else:
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
116 _tracker = roundup.instance.open(_home, optimize=1)
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
117 __tracker_cache[_home] = _tracker
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
118 finally:
302bc481ceb1 Cache tracker instances.
Stefan Seefeld <stefan@seefeld.name>
parents: 4047
diff changeset
119 __tracker_cache_lock.release()
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
120 # create environment
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
121 # 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
122 req.add_common_vars()
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
123 _env = dict(req.subprocess_env)
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
124 # XXX classname must be the first item in PATH_INFO. roundup.cgi does:
5433
86b6cea7a975 Python 3 preparation: avoid string.split().
Joseph Myers <jsm@polyomino.org.uk>
parents: 4213
diff changeset
125 # path = os.environ.get('PATH_INFO', '/').split('/')
5434
1ab2c81a64df Python 3 preparation: avoid string.join().
Joseph Myers <jsm@polyomino.org.uk>
parents: 5433
diff changeset
126 # os.environ['PATH_INFO'] = '/'.join(path[2:])
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
127 # we just remove the first character ('/')
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
128 _env["PATH_INFO"] = req.path_info[1:]
2944
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
129 if _timing:
835ac4013578 added options TrackerDebug and TrackerTiming;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2809
diff changeset
130 _env["CGI_SHOW_TIMING"] = _timing
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
131 _form = cgi.FieldStorage(req, environ=_env)
2560
d45f1669599c added 'TrackerLanguage' option;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2552
diff changeset
132 _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
133 translator=TranslationService.get_translation(_lang,
353dc16a49b2 pass tracker home directory to get_translation()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2560
diff changeset
134 tracker_home=_home))
2552
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
135 _client.main()
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
136 return apache.OK
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
137
41fbe26aa2df mod_python interface for Roundup Issue Tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
138 # vim: set et sts=4 sw=4 :

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