annotate examples/trac/trac/web/main.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children f8a5a6ee2097
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2005 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # Copyright (C) 2005 Matthew Good <trac@matt-good.net>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16 # Author: Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 # Matthew Good <trac@matt-good.net>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 import locale
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 import os
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 import sys
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 import dircache
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 import urllib
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 from trac.config import ExtensionOption, OrderedExtensionsOption
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 from trac.core import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27 from trac.env import open_environment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 from trac.perm import PermissionCache, NoPermissionCache, PermissionError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 from trac.util import reversed, get_last_traceback
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 from trac.util.datefmt import format_datetime, http_date
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31 from trac.util.text import to_unicode
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 from trac.util.markup import Markup
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 from trac.web.api import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34 from trac.web.chrome import Chrome
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 from trac.web.clearsilver import HDFWrapper
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 from trac.web.href import Href
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 from trac.web.session import Session
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 # Environment cache for multithreaded front-ends:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 import threading
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 except ImportError:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 import dummy_threading as threading
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 env_cache = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 env_cache_lock = threading.Lock()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 def _open_environment(env_path, run_once=False):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 if run_once:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 return open_environment(env_path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 global env_cache, env_cache_lock
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 env = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 env_cache_lock.acquire()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 if not env_path in env_cache:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 env_cache[env_path] = open_environment(env_path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58 env = env_cache[env_path]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 finally:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 env_cache_lock.release()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 # Re-parse the configuration file if it changed since the last the time it
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 # was parsed
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 env.config.parse_if_needed()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 return env
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 def populate_hdf(hdf, env, req=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 """Populate the HDF data set with various information, such as common URLs,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 project information and request-related information.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 FIXME: do we really have req==None at times?
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 from trac import __version__
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 hdf['trac'] = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 'version': __version__,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 'time': format_datetime(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 'time.gmt': http_date()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 hdf['project'] = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 'name': env.project_name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81 'name_encoded': env.project_name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 'descr': env.project_description,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 'footer': Markup(env.project_footer),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 'url': env.project_url
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 if req:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 hdf['trac.href'] = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 'wiki': req.href.wiki(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 'browser': req.href.browser('/'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 'timeline': req.href.timeline(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 'roadmap': req.href.roadmap(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 'milestone': req.href.milestone(None),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 'report': req.href.report(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95 'query': req.href.query(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 'newticket': req.href.newticket(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 'search': req.href.search(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 'about': req.href.about(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 'about_config': req.href.about('config'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 'login': req.href.login(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 'logout': req.href.logout(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 'settings': req.href.settings(),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 'homepage': 'http://trac.edgewall.com/'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 hdf['base_url'] = req.base_url
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 hdf['base_host'] = req.base_url[:req.base_url.rfind(req.base_path)]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 hdf['cgi_location'] = req.base_path
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 hdf['trac.authname'] = req.authname
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 if req.perm:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112 for action in req.perm.permissions():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 req.hdf['trac.acl.' + action] = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115 for arg in [k for k in req.args.keys() if k]:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 if isinstance(req.args[arg], (list, tuple)):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 hdf['args.%s' % arg] = [v for v in req.args[arg]]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 elif isinstance(req.args[arg], basestring):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 hdf['args.%s' % arg] = req.args[arg]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120 # others are file uploads
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 class RequestDispatcher(Component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 """Component responsible for dispatching requests to registered handlers."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 authenticators = ExtensionPoint(IAuthenticator)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 handlers = ExtensionPoint(IRequestHandler)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129 filters = OrderedExtensionsOption('trac', 'request_filters', IRequestFilter,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 doc="""Ordered list of filters to apply to all requests
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 (''since 0.10'').""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 default_handler = ExtensionOption('trac', 'default_handler',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134 IRequestHandler, 'WikiModule',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 """Name of the component that handles requests to the base URL.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 Options include `TimeLineModule`, `RoadmapModule`, `BrowserModule`,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138 `QueryModule`, `ReportModule` and `NewticketModule` (''since 0.9'').""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 # Public API
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 def authenticate(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143 for authenticator in self.authenticators:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 authname = authenticator.authenticate(req)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 if authname:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146 return authname
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148 return 'anonymous'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 def dispatch(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 """Find a registered handler that matches the request and let it process
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 it.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 In addition, this method initializes the HDF data set and adds the web
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155 site chrome.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157 # FIXME: For backwards compatibility, should be removed in 0.11
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 self.env.href = req.href
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159 self.env.abs_href = req.abs_href
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 # Select the component that should handle the request
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 chosen_handler = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 if not req.path_info or req.path_info == '/':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164 chosen_handler = self.default_handler
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166 for handler in self.handlers:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167 if handler.match_request(req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 chosen_handler = handler
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 break
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171 for filter_ in self.filters:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172 chosen_handler = filter_.pre_process_request(req, chosen_handler)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174 if not chosen_handler:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175 raise HTTPNotFound('No handler matched request to %s',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176 req.path_info)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 # Attach user information to the request
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179 anonymous_request = getattr(chosen_handler, 'anonymous_request', False)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180 if anonymous_request:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181 req.authname = 'anonymous'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182 req.perm = NoPermissionCache()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184 req.authname = self.authenticate(req)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185 req.perm = PermissionCache(self.env, req.authname)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 req.session = Session(self.env, req)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188 # Prepare HDF for the clearsilver template
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 use_template = getattr(chosen_handler, 'use_template', True)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190 if use_template:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191 chrome = Chrome(self.env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192 req.hdf = HDFWrapper(loadpaths=chrome.get_all_templates_dirs())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193 populate_hdf(req.hdf, self.env, req)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194 chrome.populate_hdf(req, chosen_handler)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 # Process the request and render the template
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 resp = chosen_handler.process_request(req)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200 if resp:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201 for filter_ in reversed(self.filters):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202 resp = filter_.post_process_request(req, *resp)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203 template, content_type = resp
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204 req.display(template, content_type or 'text/html')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206 for filter_ in reversed(self.filters):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207 filter_.post_process_request(req, None, None)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 except PermissionError, e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209 raise HTTPForbidden(to_unicode(e))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 except TracError, e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211 raise HTTPInternalError(e.message)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212 finally:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213 # Give the session a chance to persist changes
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214 if req.session:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215 req.session.save()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
217
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
218 def dispatch_request(environ, start_response):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
219 """Main entry point for the Trac web interface.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
220
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
221 @param environ: the WSGI environment dict
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
222 @param start_response: the WSGI callback for starting the response
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
223 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
224 if 'mod_python.options' in environ:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
225 options = environ['mod_python.options']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
226 environ.setdefault('trac.env_path', options.get('TracEnv'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
227 environ.setdefault('trac.env_parent_dir',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
228 options.get('TracEnvParentDir'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
229 environ.setdefault('trac.env_index_template',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
230 options.get('TracEnvIndexTemplate'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
231 environ.setdefault('trac.template_vars',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
232 options.get('TracTemplateVars'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
233 environ.setdefault('trac.locale', options.get('TracLocale'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
234
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
235 if 'TracUriRoot' in options:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
236 # Special handling of SCRIPT_NAME/PATH_INFO for mod_python, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
237 # tends to get confused for whatever reason
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
238 root_uri = options['TracUriRoot'].rstrip('/')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
239 request_uri = environ['REQUEST_URI'].split('?', 1)[0]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
240 if not request_uri.startswith(root_uri):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
241 raise ValueError('TracUriRoot set to %s but request URL '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
242 'is %s' % (root_uri, request_uri))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
243 environ['SCRIPT_NAME'] = root_uri
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
244 environ['PATH_INFO'] = urllib.unquote(request_uri[len(root_uri):])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
245
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
246 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
247 environ.setdefault('trac.env_path', os.getenv('TRAC_ENV'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
248 environ.setdefault('trac.env_parent_dir',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
249 os.getenv('TRAC_ENV_PARENT_DIR'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
250 environ.setdefault('trac.env_index_template',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
251 os.getenv('TRAC_ENV_INDEX_TEMPLATE'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
252 environ.setdefault('trac.template_vars',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
253 os.getenv('TRAC_TEMPLATE_VARS'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
254 environ.setdefault('trac.locale', '')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
255
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
256 locale.setlocale(locale.LC_ALL, environ['trac.locale'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
257
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
258 # Allow specifying the python eggs cache directory using SetEnv
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
259 if 'mod_python.subprocess_env' in environ:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
260 egg_cache = environ['mod_python.subprocess_env'].get('PYTHON_EGG_CACHE')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
261 if egg_cache:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
262 os.environ['PYTHON_EGG_CACHE'] = egg_cache
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
263
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
264 # Determine the environment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
265 env_path = environ.get('trac.env_path')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
266 if not env_path:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
267 env_parent_dir = environ.get('trac.env_parent_dir')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
268 env_paths = environ.get('trac.env_paths')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
269 if env_parent_dir or env_paths:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
270 # The first component of the path is the base name of the
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
271 # environment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
272 path_info = environ.get('PATH_INFO', '').lstrip('/').split('/')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
273 env_name = path_info.pop(0)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
274
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
275 if not env_name:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
276 # No specific environment requested, so render an environment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
277 # index page
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
278 send_project_index(environ, start_response, env_parent_dir,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
279 env_paths)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
280 return []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
281
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
282 # To make the matching patterns of request handlers work, we append
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
283 # the environment name to the `SCRIPT_NAME` variable, and keep only
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
284 # the remaining path in the `PATH_INFO` variable.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
285 environ['SCRIPT_NAME'] = Href(environ['SCRIPT_NAME'])(env_name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
286 environ['PATH_INFO'] = '/'.join([''] + path_info)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
287
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
288 if env_parent_dir:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
289 env_path = os.path.join(env_parent_dir, env_name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
290 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
291 env_path = get_environments(environ).get(env_name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
292
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
293 if not env_path or not os.path.isdir(env_path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
294 start_response('404 Not Found', [])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
295 return ['Environment not found']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
296
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
297 if not env_path:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
298 raise EnvironmentError('The environment options "TRAC_ENV" or '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
299 '"TRAC_ENV_PARENT_DIR" or the mod_python '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
300 'options "TracEnv" or "TracEnvParentDir" are '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
301 'missing. Trac requires one of these options '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
302 'to locate the Trac environment(s).')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
303 env = _open_environment(env_path, run_once=environ['wsgi.run_once'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
304
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
305 if env.base_url:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
306 environ['trac.base_url'] = env.base_url
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
307
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
308 req = Request(environ, start_response)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
309 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
310 db = env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
311 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
312 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
313 dispatcher = RequestDispatcher(env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
314 dispatcher.dispatch(req)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
315 except RequestDone:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
316 pass
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
317 return req._response or []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
318 finally:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
319 db.close()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
320
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
321 except HTTPException, e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
322 env.log.warn(e)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
323 if req.hdf:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
324 req.hdf['title'] = e.reason or 'Error'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
325 req.hdf['error'] = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
326 'title': e.reason or 'Error',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
327 'type': 'TracError',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
328 'message': e.message
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
329 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
330 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
331 req.send_error(sys.exc_info(), status=e.code)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
332 except RequestDone:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
333 return []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
334
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
335 except Exception, e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
336 env.log.exception(e)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
337
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
338 if req.hdf:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
339 req.hdf['title'] = to_unicode(e) or 'Error'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
340 req.hdf['error'] = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
341 'title': to_unicode(e) or 'Error',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
342 'type': 'internal',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
343 'traceback': get_last_traceback()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
344 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
345 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
346 req.send_error(sys.exc_info(), status=500)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
347 except RequestDone:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
348 return []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
349
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
350 def send_project_index(environ, start_response, parent_dir=None,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
351 env_paths=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
352 from trac.config import default_dir
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
353
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
354 req = Request(environ, start_response)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
355
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
356 loadpaths = [default_dir('templates')]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
357 if req.environ.get('trac.env_index_template'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
358 tmpl_path, template = os.path.split(req.environ['trac.env_index_template'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
359 loadpaths.insert(0, tmpl_path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
360 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
361 template = 'index.cs'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
362 req.hdf = HDFWrapper(loadpaths)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
363
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
364 tmpl_vars = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
365 if req.environ.get('trac.template_vars'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
366 for pair in req.environ['trac.template_vars'].split(','):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
367 key, val = pair.split('=')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
368 req.hdf[key] = val
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
369
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
370 if parent_dir and not env_paths:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
371 env_paths = dict([(filename, os.path.join(parent_dir, filename))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
372 for filename in os.listdir(parent_dir)])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
373
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
374 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
375 href = Href(req.base_path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
376 projects = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
377 for env_name, env_path in get_environments(environ).items():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
378 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
379 env = _open_environment(env_path,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
380 run_once=environ['wsgi.run_once'])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
381 proj = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
382 'name': env.project_name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
383 'description': env.project_description,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
384 'href': href(env_name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
385 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
386 except Exception, e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
387 proj = {'name': env_name, 'description': to_unicode(e)}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
388 projects.append(proj)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
389 projects.sort(lambda x, y: cmp(x['name'].lower(), y['name'].lower()))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
390
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
391 req.hdf['projects'] = projects
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
392 req.display(template)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
393 except RequestDone:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
394 pass
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
395
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
396 def get_environments(environ, warn=False):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
397 """Retrieve canonical environment name to path mapping.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
398
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
399 The environments may not be all valid environments, but they are good
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
400 candidates.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
401 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
402 env_paths = environ.get('trac.env_paths', [])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
403 env_parent_dir = environ.get('trac.env_parent_dir')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
404 if env_parent_dir:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
405 env_parent_dir = os.path.normpath(env_parent_dir)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
406 paths = dircache.listdir(env_parent_dir)[:]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
407 dircache.annotate(env_parent_dir, paths)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
408 env_paths += [os.path.join(env_parent_dir, project) \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
409 for project in paths if project[-1] == '/']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
410 envs = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
411 for env_path in env_paths:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
412 env_path = os.path.normpath(env_path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
413 if not os.path.isdir(env_path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
414 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
415 env_name = os.path.split(env_path)[1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
416 if env_name in envs:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
417 if warn:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
418 print >> sys.stderr, ('Warning: Ignoring project "%s" since '
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
419 'it conflicts with project "%s"'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
420 % (env_path, envs[env_name]))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
421 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
422 envs[env_name] = env_path
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
423 return envs
Copyright (C) 2012-2017 Edgewall Software