##// END OF EJS Templates
cleanup: move jsroutes generator function and only generate in...
dan -
r95:d24c04eb default
parent child Browse files
Show More
@@ -0,0 +1,42 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2016 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 def generate_jsroutes_content(jsroutes):
22 statements = []
23 for url_name, url, fields in jsroutes:
24 statements.append(
25 "pyroutes.register('%s', '%s', %s);" % (url_name, url, fields))
26 return u'''
27 /******************************************************************************
28 * *
29 * DO NOT CHANGE THIS FILE MANUALLY *
30 * *
31 * *
32 * This file is automatically generated when the app starts up. *
33 * *
34 * To add a route here pass jsroute=True to the route definition in the app *
35 * *
36 ******************************************************************************/
37 function registerRCRoutes() {
38 // routes registration
39 %s
40 }
41 ''' % '\n '.join(statements)
42
@@ -1,210 +1,193 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2010-2016 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 """
22 22 Pylons environment configuration
23 23 """
24 24
25 25 import os
26 26 import logging
27 27 import rhodecode
28 28 import platform
29 29 import re
30 import io
30 31
31 32 from mako.lookup import TemplateLookup
32 33 from pylons.configuration import PylonsConfig
33 34 from pylons.error import handle_mako_error
35 from pyramid.settings import asbool
34 36
35 37 # don't remove this import it does magic for celery
36 38 from rhodecode.lib import celerypylons # noqa
37 39
38 40 import rhodecode.lib.app_globals as app_globals
39 41
40 42 from rhodecode.config import utils
41 43 from rhodecode.config.routing import make_map
44 from rhodecode.config.jsroutes import generate_jsroutes_content
42 45
43 46 from rhodecode.lib import helpers
44 47 from rhodecode.lib.auth import set_available_permissions
45 48 from rhodecode.lib.utils import (
46 49 repo2db_mapper, make_db_config, set_rhodecode_config,
47 50 load_rcextensions)
48 51 from rhodecode.lib.utils2 import str2bool, aslist
49 52 from rhodecode.lib.vcs import connect_vcs, start_vcs_server
50 53 from rhodecode.model.scm import ScmModel
51 54
52 55 log = logging.getLogger(__name__)
53 56
54
55 57 def load_environment(global_conf, app_conf, initial=False,
56 58 test_env=None, test_index=None):
57 59 """
58 60 Configure the Pylons environment via the ``pylons.config``
59 61 object
60 62 """
61 63 config = PylonsConfig()
62 64
63 65 rhodecode.is_test = str2bool(app_conf.get('is_test', 'False'))
64 66
65 67 # Pylons paths
66 68 root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
67 69 paths = {
68 70 'root': root,
69 71 'controllers': os.path.join(root, 'controllers'),
70 72 'static_files': os.path.join(root, 'public'),
71 73 'templates': [os.path.join(root, 'templates')],
72 74 }
73 75
74 76 # Initialize config with the basic options
75 77 config.init_app(global_conf, app_conf, package='rhodecode', paths=paths)
76 78
77 79 # store some globals into rhodecode
78 80 rhodecode.CELERY_ENABLED = str2bool(config['app_conf'].get('use_celery'))
79 81 rhodecode.CELERY_EAGER = str2bool(
80 82 config['app_conf'].get('celery.always.eager'))
81 83
82 84 config['routes.map'] = make_map(config)
85
86 if asbool(config['debug']):
83 87 jsroutes = config['routes.map'].jsroutes()
84 statements = []
85 for url_name, url, fields in jsroutes:
86 statements.append(
87 "pyroutes.register('%s', '%s', %s);" % (url_name, url, fields))
88 import io
89 import textwrap
90 template = textwrap.dedent(u'''
91 /******************************************************************************
92 * *
93 * DO NOT CHANGE THIS FILE MANUALLY *
94 * *
95 * *
96 * This file is automatically generated when the app starts up. *
97 * *
98 * To add a route here pass jsroute=True to the route definition in the app *
99 * *
100 ******************************************************************************/
101 function registerRCRoutes() {
102 // routes registration
103 %s
104 }
105 ''').strip()
106 content = template % '\n '.join(statements)
107 js_routes_filepath = os.path.join(
88 jsroutes_file_content = generate_jsroutes_content(jsroutes)
89 jsroutes_file_path = os.path.join(
108 90 paths['static_files'], 'js', 'rhodecode', 'routes.js')
109 with io.open(js_routes_filepath, 'w', encoding='utf-8') as f:
110 f.write(content)
91
92 with io.open(jsroutes_file_path, 'w', encoding='utf-8') as f:
93 f.write(jsroutes_file_content)
111 94
112 95 config['pylons.app_globals'] = app_globals.Globals(config)
113 96 config['pylons.h'] = helpers
114 97 rhodecode.CONFIG = config
115 98
116 99 load_rcextensions(root_path=config['here'])
117 100
118 101 # Setup cache object as early as possible
119 102 import pylons
120 103 pylons.cache._push_object(config['pylons.app_globals'].cache)
121 104
122 105 # Create the Mako TemplateLookup, with the default auto-escaping
123 106 config['pylons.app_globals'].mako_lookup = TemplateLookup(
124 107 directories=paths['templates'],
125 108 error_handler=handle_mako_error,
126 109 module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
127 110 input_encoding='utf-8', default_filters=['escape'],
128 111 imports=['from webhelpers.html import escape'])
129 112
130 113 # sets the c attribute access when don't existing attribute are accessed
131 114 config['pylons.strict_tmpl_context'] = True
132 115 config_file_name = os.path.split(config['__file__'])[-1]
133 116 test = re.match('^test[\w_]*\.ini$', config_file_name) is not None
134 117 if test:
135 118 if test_env is None:
136 119 test_env = not int(os.environ.get('RC_NO_TMP_PATH', 0))
137 120
138 121 from rhodecode.lib.utils import create_test_env, create_test_index
139 122 from rhodecode.tests import TESTS_TMP_PATH
140 123 # test repos
141 124 if test_env:
142 125 create_test_env(TESTS_TMP_PATH, config)
143 126 create_test_index(TESTS_TMP_PATH, config, True)
144 127
145 128 # Limit backends to "vcs.backends" from configuration
146 129 backends = config['vcs.backends'] = aslist(
147 130 config.get('vcs.backends', 'hg,git'), sep=',')
148 131 for alias in rhodecode.BACKENDS.keys():
149 132 if alias not in backends:
150 133 del rhodecode.BACKENDS[alias]
151 134 log.info("Enabled backends: %s", backends)
152 135
153 136 # initialize vcs client and optionally run the server if enabled
154 137 vcs_server_uri = config.get('vcs.server', '')
155 138 vcs_server_enabled = str2bool(config.get('vcs.server.enable', 'true'))
156 139 start_server = (
157 140 str2bool(config.get('vcs.start_server', 'false')) and
158 141 not int(os.environ.get('RC_VCSSERVER_TEST_DISABLE', '0')))
159 142 if vcs_server_enabled and start_server:
160 143 log.info("Starting vcsserver")
161 144 start_vcs_server(server_and_port=vcs_server_uri,
162 145 protocol=utils.get_vcs_server_protocol(config),
163 146 log_level=config['vcs.server.log_level'])
164 147
165 148 # MULTIPLE DB configs
166 149 # Setup the SQLAlchemy database engine
167 150 utils.initialize_database(config)
168 151
169 152 set_available_permissions(config)
170 153 db_cfg = make_db_config(clear_session=True)
171 154
172 155 repos_path = list(db_cfg.items('paths'))[0][1]
173 156 config['base_path'] = repos_path
174 157
175 158 config['vcs.hooks.direct_calls'] = _use_direct_hook_calls(config)
176 159 config['vcs.hooks.protocol'] = _get_vcs_hooks_protocol(config)
177 160
178 161 # store db config also in main global CONFIG
179 162 set_rhodecode_config(config)
180 163
181 164 # configure instance id
182 165 utils.set_instance_id(config)
183 166
184 167 # CONFIGURATION OPTIONS HERE (note: all config options will override
185 168 # any Pylons config options)
186 169
187 170 # store config reference into our module to skip import magic of pylons
188 171 rhodecode.CONFIG.update(config)
189 172
190 173 utils.configure_pyro4(config)
191 174 utils.configure_vcs(config)
192 175 if vcs_server_enabled:
193 176 connect_vcs(vcs_server_uri, utils.get_vcs_server_protocol(config))
194 177
195 178 import_on_startup = str2bool(config.get('startup.import_repos', False))
196 179 if vcs_server_enabled and import_on_startup:
197 180 repo2db_mapper(ScmModel().repo_scan(repos_path), remove_obsolete=False)
198 181 return config
199 182
200 183
201 184 def _use_direct_hook_calls(config):
202 185 default_direct_hook_calls = 'false'
203 186 direct_hook_calls = str2bool(
204 187 config.get('vcs.hooks.direct_calls', default_direct_hook_calls))
205 188 return direct_hook_calls
206 189
207 190
208 191 def _get_vcs_hooks_protocol(config):
209 192 protocol = config.get('vcs.hooks.protocol', 'pyro4').lower()
210 193 return protocol
@@ -1,1151 +1,1153 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2010-2016 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 """
22 22 Routes configuration
23 23
24 24 The more specific and detailed routes should be defined first so they
25 25 may take precedent over the more generic routes. For more information
26 26 refer to the routes manual at http://routes.groovie.org/docs/
27 27
28 28 IMPORTANT: if you change any routing here, make sure to take a look at lib/base.py
29 29 and _route_name variable which uses some of stored naming here to do redirects.
30 30 """
31 31 import os
32 32 import re
33 33 from routes import Mapper
34 34
35 35 from rhodecode.config import routing_links
36 36
37 37 # prefix for non repository related links needs to be prefixed with `/`
38 38 ADMIN_PREFIX = '/_admin'
39 39
40 40 # Default requirements for URL parts
41 41 URL_NAME_REQUIREMENTS = {
42 42 # group name can have a slash in them, but they must not end with a slash
43 43 'group_name': r'.*?[^/]',
44 44 # repo names can have a slash in them, but they must not end with a slash
45 45 'repo_name': r'.*?[^/]',
46 46 # file path eats up everything at the end
47 47 'f_path': r'.*',
48 48 # reference types
49 49 'source_ref_type': '(branch|book|tag|rev|\%\(source_ref_type\)s)',
50 50 'target_ref_type': '(branch|book|tag|rev|\%\(target_ref_type\)s)',
51 51 }
52 52
53 53
54 54 class JSRoutesAwareMapper(Mapper):
55 55 """
56 56 Wrapper for routes.Mapper to make pyroutes compatible url definitions
57 57 """
58 58 _named_route_regex = re.compile(r'^[a-z-_0-9A-Z]+$')
59 59 _argument_prog = re.compile('\{(.*?)\}|:\((.*)\)')
60 60 def __init__(self, *args, **kw):
61 61 super(JSRoutesAwareMapper, self).__init__(*args, **kw)
62 62 self._jsroutes = []
63 63
64 64 def connect(self, *args, **kw):
65 65 """
66 66 Wrapper for connect to take an extra argument jsroute=True
67 67
68 68 :param jsroute: boolean, if True will add the route to the pyroutes list
69 69 """
70 70 if kw.pop('jsroute', False):
71 71 if not self._named_route_regex.match(args[0]):
72 72 # import pdb;pdb.set_trace()
73 73 raise Exception('only named routes can be added to pyroutes')
74 74 self._jsroutes.append(args[0])
75 75
76 76 super(JSRoutesAwareMapper, self).connect(*args, **kw)
77 77
78 78 def _extract_route_information(self, route):
79 79 """
80 80 Convert a route into tuple(name, path, args), eg:
81 81 ('user_profile', '/profile/%(username)s', ['username'])
82 82 """
83 83 routepath = route.routepath
84 84 def replace(matchobj):
85 85 if matchobj.group(1):
86 86 return "%%(%s)s" % matchobj.group(1).split(':')[0]
87 87 else:
88 88 return "%%(%s)s" % matchobj.group(2)
89 89
90 90 routepath = self._argument_prog.sub(replace, routepath)
91 91 return (
92 92 route.name,
93 93 routepath,
94 94 [(arg[0].split(':')[0] if arg[0] != '' else arg[1])
95 95 for arg in self._argument_prog.findall(route.routepath)]
96 96 )
97 97
98 98 def jsroutes(self):
99 99 """
100 100 Return a list of pyroutes.js compatible routes
101 101 """
102 102 for route_name in self._jsroutes:
103 103 yield self._extract_route_information(self._routenames[route_name])
104 104
105 105
106 106 def make_map(config):
107 107 """Create, configure and return the routes Mapper"""
108 108 rmap = JSRoutesAwareMapper(directory=config['pylons.paths']['controllers'],
109 109 always_scan=config['debug'])
110 110 rmap.minimization = False
111 111 rmap.explicit = False
112 112
113 113 from rhodecode.lib.utils2 import str2bool
114 114 from rhodecode.model import repo, repo_group
115 115
116 116 def check_repo(environ, match_dict):
117 117 """
118 118 check for valid repository for proper 404 handling
119 119
120 120 :param environ:
121 121 :param match_dict:
122 122 """
123 123 repo_name = match_dict.get('repo_name')
124 124
125 125 if match_dict.get('f_path'):
126 126 # fix for multiple initial slashes that causes errors
127 127 match_dict['f_path'] = match_dict['f_path'].lstrip('/')
128 128 repo_model = repo.RepoModel()
129 129 by_name_match = repo_model.get_by_repo_name(repo_name)
130 130 # if we match quickly from database, short circuit the operation,
131 131 # and validate repo based on the type.
132 132 if by_name_match:
133 133 return True
134 134
135 135 by_id_match = repo_model.get_repo_by_id(repo_name)
136 136 if by_id_match:
137 137 repo_name = by_id_match.repo_name
138 138 match_dict['repo_name'] = repo_name
139 139 return True
140 140
141 141 return False
142 142
143 143 def check_group(environ, match_dict):
144 144 """
145 145 check for valid repository group path for proper 404 handling
146 146
147 147 :param environ:
148 148 :param match_dict:
149 149 """
150 150 repo_group_name = match_dict.get('group_name')
151 151 repo_group_model = repo_group.RepoGroupModel()
152 152 by_name_match = repo_group_model.get_by_group_name(repo_group_name)
153 153 if by_name_match:
154 154 return True
155 155
156 156 return False
157 157
158 158 def check_user_group(environ, match_dict):
159 159 """
160 160 check for valid user group for proper 404 handling
161 161
162 162 :param environ:
163 163 :param match_dict:
164 164 """
165 165 return True
166 166
167 167 def check_int(environ, match_dict):
168 168 return match_dict.get('id').isdigit()
169 169
170 170 # The ErrorController route (handles 404/500 error pages); it should
171 171 # likely stay at the top, ensuring it can always be resolved
172 172 rmap.connect('/error/{action}', controller='error')
173 173 rmap.connect('/error/{action}/{id}', controller='error')
174 174
175 175 #==========================================================================
176 176 # CUSTOM ROUTES HERE
177 177 #==========================================================================
178 178
179 179 # MAIN PAGE
180 180 rmap.connect('home', '/', controller='home', action='index', jsroute=True)
181 181 rmap.connect('goto_switcher_data', '/_goto_data', controller='home',
182 182 action='goto_switcher_data')
183 183 rmap.connect('repo_list_data', '/_repos', controller='home',
184 184 action='repo_list_data')
185 185
186 186 rmap.connect('user_autocomplete_data', '/_users', controller='home',
187 187 action='user_autocomplete_data', jsroute=True)
188 188 rmap.connect('user_group_autocomplete_data', '/_user_groups', controller='home',
189 189 action='user_group_autocomplete_data')
190 190
191 191 rmap.connect(
192 192 'user_profile', '/_profiles/{username}', controller='users',
193 193 action='user_profile')
194 194
195 195 # TODO: johbo: Static links, to be replaced by our redirection mechanism
196 196 rmap.connect('rst_help',
197 197 'http://docutils.sourceforge.net/docs/user/rst/quickref.html',
198 198 _static=True)
199 199 rmap.connect('markdown_help',
200 200 'http://daringfireball.net/projects/markdown/syntax',
201 201 _static=True)
202 202 rmap.connect('rhodecode_official', 'https://rhodecode.com', _static=True)
203 203 rmap.connect('rhodecode_support', 'https://rhodecode.com/help/', _static=True)
204 204 rmap.connect('rhodecode_translations', 'https://rhodecode.com/translate/enterprise', _static=True)
205 205 # TODO: anderson - making this a static link since redirect won't play
206 206 # nice with POST requests
207 207 rmap.connect('enterprise_license_convert_from_old',
208 208 'https://rhodecode.com/u/license-upgrade',
209 209 _static=True)
210 210
211 211 routing_links.connect_redirection_links(rmap)
212 212
213 213 rmap.connect('ping', '%s/ping' % (ADMIN_PREFIX,), controller='home', action='ping')
214 214 rmap.connect('error_test', '%s/error_test' % (ADMIN_PREFIX,), controller='home', action='error_test')
215 215
216 216 # ADMIN REPOSITORY ROUTES
217 217 with rmap.submapper(path_prefix=ADMIN_PREFIX,
218 218 controller='admin/repos') as m:
219 219 m.connect('repos', '/repos',
220 220 action='create', conditions={'method': ['POST']})
221 221 m.connect('repos', '/repos',
222 222 action='index', conditions={'method': ['GET']})
223 223 m.connect('new_repo', '/create_repository', jsroute=True,
224 224 action='create_repository', conditions={'method': ['GET']})
225 225 m.connect('/repos/{repo_name}',
226 226 action='update', conditions={'method': ['PUT'],
227 227 'function': check_repo},
228 228 requirements=URL_NAME_REQUIREMENTS)
229 229 m.connect('delete_repo', '/repos/{repo_name}',
230 230 action='delete', conditions={'method': ['DELETE']},
231 231 requirements=URL_NAME_REQUIREMENTS)
232 232 m.connect('repo', '/repos/{repo_name}',
233 233 action='show', conditions={'method': ['GET'],
234 234 'function': check_repo},
235 235 requirements=URL_NAME_REQUIREMENTS)
236 236
237 237 # ADMIN REPOSITORY GROUPS ROUTES
238 238 with rmap.submapper(path_prefix=ADMIN_PREFIX,
239 239 controller='admin/repo_groups') as m:
240 240 m.connect('repo_groups', '/repo_groups',
241 241 action='create', conditions={'method': ['POST']})
242 242 m.connect('repo_groups', '/repo_groups',
243 243 action='index', conditions={'method': ['GET']})
244 244 m.connect('new_repo_group', '/repo_groups/new',
245 245 action='new', conditions={'method': ['GET']})
246 246 m.connect('update_repo_group', '/repo_groups/{group_name}',
247 247 action='update', conditions={'method': ['PUT'],
248 248 'function': check_group},
249 249 requirements=URL_NAME_REQUIREMENTS)
250 250
251 251 # EXTRAS REPO GROUP ROUTES
252 252 m.connect('edit_repo_group', '/repo_groups/{group_name}/edit',
253 253 action='edit',
254 254 conditions={'method': ['GET'], 'function': check_group},
255 255 requirements=URL_NAME_REQUIREMENTS)
256 256 m.connect('edit_repo_group', '/repo_groups/{group_name}/edit',
257 257 action='edit',
258 258 conditions={'method': ['PUT'], 'function': check_group},
259 259 requirements=URL_NAME_REQUIREMENTS)
260 260
261 261 m.connect('edit_repo_group_advanced', '/repo_groups/{group_name}/edit/advanced',
262 262 action='edit_repo_group_advanced',
263 263 conditions={'method': ['GET'], 'function': check_group},
264 264 requirements=URL_NAME_REQUIREMENTS)
265 265 m.connect('edit_repo_group_advanced', '/repo_groups/{group_name}/edit/advanced',
266 266 action='edit_repo_group_advanced',
267 267 conditions={'method': ['PUT'], 'function': check_group},
268 268 requirements=URL_NAME_REQUIREMENTS)
269 269
270 270 m.connect('edit_repo_group_perms', '/repo_groups/{group_name}/edit/permissions',
271 271 action='edit_repo_group_perms',
272 272 conditions={'method': ['GET'], 'function': check_group},
273 273 requirements=URL_NAME_REQUIREMENTS)
274 274 m.connect('edit_repo_group_perms', '/repo_groups/{group_name}/edit/permissions',
275 275 action='update_perms',
276 276 conditions={'method': ['PUT'], 'function': check_group},
277 277 requirements=URL_NAME_REQUIREMENTS)
278 278
279 279 m.connect('delete_repo_group', '/repo_groups/{group_name}',
280 280 action='delete', conditions={'method': ['DELETE'],
281 281 'function': check_group},
282 282 requirements=URL_NAME_REQUIREMENTS)
283 283
284 284 # ADMIN USER ROUTES
285 285 with rmap.submapper(path_prefix=ADMIN_PREFIX,
286 286 controller='admin/users') as m:
287 287 m.connect('users', '/users',
288 288 action='create', conditions={'method': ['POST']})
289 289 m.connect('users', '/users',
290 290 action='index', conditions={'method': ['GET']})
291 291 m.connect('new_user', '/users/new',
292 292 action='new', conditions={'method': ['GET']})
293 293 m.connect('update_user', '/users/{user_id}',
294 294 action='update', conditions={'method': ['PUT']})
295 295 m.connect('delete_user', '/users/{user_id}',
296 296 action='delete', conditions={'method': ['DELETE']})
297 297 m.connect('edit_user', '/users/{user_id}/edit',
298 298 action='edit', conditions={'method': ['GET']})
299 299 m.connect('user', '/users/{user_id}',
300 300 action='show', conditions={'method': ['GET']})
301 301 m.connect('force_password_reset_user', '/users/{user_id}/password_reset',
302 302 action='reset_password', conditions={'method': ['POST']})
303 303 m.connect('create_personal_repo_group', '/users/{user_id}/create_repo_group',
304 304 action='create_personal_repo_group', conditions={'method': ['POST']})
305 305
306 306 # EXTRAS USER ROUTES
307 307 m.connect('edit_user_advanced', '/users/{user_id}/edit/advanced',
308 308 action='edit_advanced', conditions={'method': ['GET']})
309 309 m.connect('edit_user_advanced', '/users/{user_id}/edit/advanced',
310 310 action='update_advanced', conditions={'method': ['PUT']})
311 311
312 312 m.connect('edit_user_auth_tokens', '/users/{user_id}/edit/auth_tokens',
313 313 action='edit_auth_tokens', conditions={'method': ['GET']})
314 314 m.connect('edit_user_auth_tokens', '/users/{user_id}/edit/auth_tokens',
315 315 action='add_auth_token', conditions={'method': ['PUT']})
316 316 m.connect('edit_user_auth_tokens', '/users/{user_id}/edit/auth_tokens',
317 317 action='delete_auth_token', conditions={'method': ['DELETE']})
318 318
319 319 m.connect('edit_user_global_perms', '/users/{user_id}/edit/global_permissions',
320 320 action='edit_global_perms', conditions={'method': ['GET']})
321 321 m.connect('edit_user_global_perms', '/users/{user_id}/edit/global_permissions',
322 322 action='update_global_perms', conditions={'method': ['PUT']})
323 323
324 324 m.connect('edit_user_perms_summary', '/users/{user_id}/edit/permissions_summary',
325 325 action='edit_perms_summary', conditions={'method': ['GET']})
326 326
327 327 m.connect('edit_user_emails', '/users/{user_id}/edit/emails',
328 328 action='edit_emails', conditions={'method': ['GET']})
329 329 m.connect('edit_user_emails', '/users/{user_id}/edit/emails',
330 330 action='add_email', conditions={'method': ['PUT']})
331 331 m.connect('edit_user_emails', '/users/{user_id}/edit/emails',
332 332 action='delete_email', conditions={'method': ['DELETE']})
333 333
334 334 m.connect('edit_user_ips', '/users/{user_id}/edit/ips',
335 335 action='edit_ips', conditions={'method': ['GET']})
336 336 m.connect('edit_user_ips', '/users/{user_id}/edit/ips',
337 337 action='add_ip', conditions={'method': ['PUT']})
338 338 m.connect('edit_user_ips', '/users/{user_id}/edit/ips',
339 339 action='delete_ip', conditions={'method': ['DELETE']})
340 340
341 341 # ADMIN USER GROUPS REST ROUTES
342 342 with rmap.submapper(path_prefix=ADMIN_PREFIX,
343 343 controller='admin/user_groups') as m:
344 344 m.connect('users_groups', '/user_groups',
345 345 action='create', conditions={'method': ['POST']})
346 346 m.connect('users_groups', '/user_groups',
347 347 action='index', conditions={'method': ['GET']})
348 348 m.connect('new_users_group', '/user_groups/new',
349 349 action='new', conditions={'method': ['GET']})
350 350 m.connect('update_users_group', '/user_groups/{user_group_id}',
351 351 action='update', conditions={'method': ['PUT']})
352 352 m.connect('delete_users_group', '/user_groups/{user_group_id}',
353 353 action='delete', conditions={'method': ['DELETE']})
354 354 m.connect('edit_users_group', '/user_groups/{user_group_id}/edit',
355 355 action='edit', conditions={'method': ['GET']},
356 356 function=check_user_group)
357 357
358 358 # EXTRAS USER GROUP ROUTES
359 359 m.connect('edit_user_group_global_perms',
360 360 '/user_groups/{user_group_id}/edit/global_permissions',
361 361 action='edit_global_perms', conditions={'method': ['GET']})
362 362 m.connect('edit_user_group_global_perms',
363 363 '/user_groups/{user_group_id}/edit/global_permissions',
364 364 action='update_global_perms', conditions={'method': ['PUT']})
365 365 m.connect('edit_user_group_perms_summary',
366 366 '/user_groups/{user_group_id}/edit/permissions_summary',
367 367 action='edit_perms_summary', conditions={'method': ['GET']})
368 368
369 369 m.connect('edit_user_group_perms',
370 370 '/user_groups/{user_group_id}/edit/permissions',
371 371 action='edit_perms', conditions={'method': ['GET']})
372 372 m.connect('edit_user_group_perms',
373 373 '/user_groups/{user_group_id}/edit/permissions',
374 374 action='update_perms', conditions={'method': ['PUT']})
375 375
376 376 m.connect('edit_user_group_advanced',
377 377 '/user_groups/{user_group_id}/edit/advanced',
378 378 action='edit_advanced', conditions={'method': ['GET']})
379 379
380 380 m.connect('edit_user_group_members',
381 381 '/user_groups/{user_group_id}/edit/members', jsroute=True,
382 382 action='edit_members', conditions={'method': ['GET']})
383 383
384 384 # ADMIN PERMISSIONS ROUTES
385 385 with rmap.submapper(path_prefix=ADMIN_PREFIX,
386 386 controller='admin/permissions') as m:
387 387 m.connect('admin_permissions_application', '/permissions/application',
388 388 action='permission_application_update', conditions={'method': ['POST']})
389 389 m.connect('admin_permissions_application', '/permissions/application',
390 390 action='permission_application', conditions={'method': ['GET']})
391 391
392 392 m.connect('admin_permissions_global', '/permissions/global',
393 393 action='permission_global_update', conditions={'method': ['POST']})
394 394 m.connect('admin_permissions_global', '/permissions/global',
395 395 action='permission_global', conditions={'method': ['GET']})
396 396
397 397 m.connect('admin_permissions_object', '/permissions/object',
398 398 action='permission_objects_update', conditions={'method': ['POST']})
399 399 m.connect('admin_permissions_object', '/permissions/object',
400 400 action='permission_objects', conditions={'method': ['GET']})
401 401
402 402 m.connect('admin_permissions_ips', '/permissions/ips',
403 403 action='permission_ips', conditions={'method': ['POST']})
404 404 m.connect('admin_permissions_ips', '/permissions/ips',
405 405 action='permission_ips', conditions={'method': ['GET']})
406 406
407 407 m.connect('admin_permissions_overview', '/permissions/overview',
408 408 action='permission_perms', conditions={'method': ['GET']})
409 409
410 410 # ADMIN DEFAULTS REST ROUTES
411 411 with rmap.submapper(path_prefix=ADMIN_PREFIX,
412 412 controller='admin/defaults') as m:
413 413 m.connect('admin_defaults_repositories', '/defaults/repositories',
414 414 action='update_repository_defaults', conditions={'method': ['POST']})
415 415 m.connect('admin_defaults_repositories', '/defaults/repositories',
416 416 action='index', conditions={'method': ['GET']})
417 417
418 418 # ADMIN DEBUG STYLE ROUTES
419 419 if str2bool(config.get('debug_style')):
420 420 with rmap.submapper(path_prefix=ADMIN_PREFIX + '/debug_style',
421 421 controller='debug_style') as m:
422 422 m.connect('debug_style_home', '',
423 423 action='index', conditions={'method': ['GET']})
424 424 m.connect('debug_style_template', '/t/{t_path}',
425 425 action='template', conditions={'method': ['GET']})
426 426
427 427 # ADMIN SETTINGS ROUTES
428 428 with rmap.submapper(path_prefix=ADMIN_PREFIX,
429 429 controller='admin/settings') as m:
430 430
431 431 # default
432 432 m.connect('admin_settings', '/settings',
433 433 action='settings_global_update',
434 434 conditions={'method': ['POST']})
435 435 m.connect('admin_settings', '/settings',
436 436 action='settings_global', conditions={'method': ['GET']})
437 437
438 438 m.connect('admin_settings_vcs', '/settings/vcs',
439 439 action='settings_vcs_update',
440 440 conditions={'method': ['POST']})
441 441 m.connect('admin_settings_vcs', '/settings/vcs',
442 442 action='settings_vcs',
443 443 conditions={'method': ['GET']})
444 444 m.connect('admin_settings_vcs', '/settings/vcs',
445 445 action='delete_svn_pattern',
446 446 conditions={'method': ['DELETE']})
447 447
448 448 m.connect('admin_settings_mapping', '/settings/mapping',
449 449 action='settings_mapping_update',
450 450 conditions={'method': ['POST']})
451 451 m.connect('admin_settings_mapping', '/settings/mapping',
452 452 action='settings_mapping', conditions={'method': ['GET']})
453 453
454 454 m.connect('admin_settings_global', '/settings/global',
455 455 action='settings_global_update',
456 456 conditions={'method': ['POST']})
457 457 m.connect('admin_settings_global', '/settings/global',
458 458 action='settings_global', conditions={'method': ['GET']})
459 459
460 460 m.connect('admin_settings_visual', '/settings/visual',
461 461 action='settings_visual_update',
462 462 conditions={'method': ['POST']})
463 463 m.connect('admin_settings_visual', '/settings/visual',
464 464 action='settings_visual', conditions={'method': ['GET']})
465 465
466 466 m.connect('admin_settings_issuetracker',
467 467 '/settings/issue-tracker', action='settings_issuetracker',
468 468 conditions={'method': ['GET']})
469 469 m.connect('admin_settings_issuetracker_save',
470 470 '/settings/issue-tracker/save',
471 471 action='settings_issuetracker_save',
472 472 conditions={'method': ['POST']})
473 473 m.connect('admin_issuetracker_test', '/settings/issue-tracker/test',
474 474 action='settings_issuetracker_test',
475 475 conditions={'method': ['POST']})
476 476 m.connect('admin_issuetracker_delete',
477 477 '/settings/issue-tracker/delete',
478 478 action='settings_issuetracker_delete',
479 479 conditions={'method': ['DELETE']})
480 480
481 481 m.connect('admin_settings_email', '/settings/email',
482 482 action='settings_email_update',
483 483 conditions={'method': ['POST']})
484 484 m.connect('admin_settings_email', '/settings/email',
485 485 action='settings_email', conditions={'method': ['GET']})
486 486
487 487 m.connect('admin_settings_hooks', '/settings/hooks',
488 488 action='settings_hooks_update',
489 489 conditions={'method': ['POST', 'DELETE']})
490 490 m.connect('admin_settings_hooks', '/settings/hooks',
491 491 action='settings_hooks', conditions={'method': ['GET']})
492 492
493 493 m.connect('admin_settings_search', '/settings/search',
494 494 action='settings_search', conditions={'method': ['GET']})
495 495
496 496 m.connect('admin_settings_system', '/settings/system',
497 497 action='settings_system', conditions={'method': ['GET']})
498 498
499 499 m.connect('admin_settings_system_update', '/settings/system/updates',
500 500 action='settings_system_update', conditions={'method': ['GET']})
501 501
502 502 m.connect('admin_settings_supervisor', '/settings/supervisor',
503 503 action='settings_supervisor', conditions={'method': ['GET']})
504 504 m.connect('admin_settings_supervisor_log', '/settings/supervisor/{procid}/log',
505 505 action='settings_supervisor_log', conditions={'method': ['GET']})
506 506
507 507 m.connect('admin_settings_labs', '/settings/labs',
508 508 action='settings_labs_update',
509 509 conditions={'method': ['POST']})
510 510 m.connect('admin_settings_labs', '/settings/labs',
511 511 action='settings_labs', conditions={'method': ['GET']})
512 512
513 513 m.connect('admin_settings_open_source', '/settings/open_source',
514 514 action='settings_open_source',
515 515 conditions={'method': ['GET']})
516 516
517 517 # ADMIN MY ACCOUNT
518 518 with rmap.submapper(path_prefix=ADMIN_PREFIX,
519 519 controller='admin/my_account') as m:
520 520
521 521 m.connect('my_account', '/my_account',
522 522 action='my_account', conditions={'method': ['GET']})
523 523 m.connect('my_account_edit', '/my_account/edit',
524 524 action='my_account_edit', conditions={'method': ['GET']})
525 525 m.connect('my_account', '/my_account',
526 526 action='my_account_update', conditions={'method': ['POST']})
527 527
528 528 m.connect('my_account_password', '/my_account/password',
529 529 action='my_account_password', conditions={'method': ['GET']})
530 530 m.connect('my_account_password', '/my_account/password',
531 531 action='my_account_password_update', conditions={'method': ['POST']})
532 532
533 533 m.connect('my_account_repos', '/my_account/repos',
534 534 action='my_account_repos', conditions={'method': ['GET']})
535 535
536 536 m.connect('my_account_watched', '/my_account/watched',
537 537 action='my_account_watched', conditions={'method': ['GET']})
538 538
539 539 m.connect('my_account_pullrequests', '/my_account/pull_requests',
540 540 action='my_account_pullrequests', conditions={'method': ['GET']})
541 541
542 542 m.connect('my_account_perms', '/my_account/perms',
543 543 action='my_account_perms', conditions={'method': ['GET']})
544 544
545 545 m.connect('my_account_emails', '/my_account/emails',
546 546 action='my_account_emails', conditions={'method': ['GET']})
547 547 m.connect('my_account_emails', '/my_account/emails',
548 548 action='my_account_emails_add', conditions={'method': ['POST']})
549 549 m.connect('my_account_emails', '/my_account/emails',
550 550 action='my_account_emails_delete', conditions={'method': ['DELETE']})
551 551
552 552 m.connect('my_account_auth_tokens', '/my_account/auth_tokens',
553 553 action='my_account_auth_tokens', conditions={'method': ['GET']})
554 554 m.connect('my_account_auth_tokens', '/my_account/auth_tokens',
555 555 action='my_account_auth_tokens_add', conditions={'method': ['POST']})
556 556 m.connect('my_account_auth_tokens', '/my_account/auth_tokens',
557 557 action='my_account_auth_tokens_delete', conditions={'method': ['DELETE']})
558 558
559 559 # NOTIFICATION REST ROUTES
560 560 with rmap.submapper(path_prefix=ADMIN_PREFIX,
561 561 controller='admin/notifications') as m:
562 562 m.connect('notifications', '/notifications',
563 563 action='index', conditions={'method': ['GET']})
564 564 m.connect('notifications_mark_all_read', '/notifications/mark_all_read',
565 565 action='mark_all_read', conditions={'method': ['POST']})
566 566
567 567 m.connect('/notifications/{notification_id}',
568 568 action='update', conditions={'method': ['PUT']})
569 569 m.connect('/notifications/{notification_id}',
570 570 action='delete', conditions={'method': ['DELETE']})
571 571 m.connect('notification', '/notifications/{notification_id}',
572 572 action='show', conditions={'method': ['GET']})
573 573
574 574 # ADMIN GIST
575 575 with rmap.submapper(path_prefix=ADMIN_PREFIX,
576 576 controller='admin/gists') as m:
577 577 m.connect('gists', '/gists',
578 578 action='create', conditions={'method': ['POST']})
579 579 m.connect('gists', '/gists', jsroute=True,
580 580 action='index', conditions={'method': ['GET']})
581 581 m.connect('new_gist', '/gists/new', jsroute=True,
582 582 action='new', conditions={'method': ['GET']})
583 m.connect('gists', '/gists', jsroute=True,
584 action='index', conditions={'method': ['GET']})
583 585
584 586 m.connect('/gists/{gist_id}',
585 587 action='delete', conditions={'method': ['DELETE']})
586 588 m.connect('edit_gist', '/gists/{gist_id}/edit',
587 589 action='edit_form', conditions={'method': ['GET']})
588 590 m.connect('edit_gist', '/gists/{gist_id}/edit',
589 591 action='edit', conditions={'method': ['POST']})
590 592 m.connect(
591 593 'edit_gist_check_revision', '/gists/{gist_id}/edit/check_revision',
592 594 action='check_revision', conditions={'method': ['GET']})
593 595
594 596 m.connect('gist', '/gists/{gist_id}',
595 597 action='show', conditions={'method': ['GET']})
596 598 m.connect('gist_rev', '/gists/{gist_id}/{revision}',
597 599 revision='tip',
598 600 action='show', conditions={'method': ['GET']})
599 601 m.connect('formatted_gist', '/gists/{gist_id}/{revision}/{format}',
600 602 revision='tip',
601 603 action='show', conditions={'method': ['GET']})
602 604 m.connect('formatted_gist_file', '/gists/{gist_id}/{revision}/{format}/{f_path}',
603 605 revision='tip',
604 606 action='show', conditions={'method': ['GET']},
605 607 requirements=URL_NAME_REQUIREMENTS)
606 608
607 609 # ADMIN MAIN PAGES
608 610 with rmap.submapper(path_prefix=ADMIN_PREFIX,
609 611 controller='admin/admin') as m:
610 612 m.connect('admin_home', '', action='index')
611 613 m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}',
612 614 action='add_repo')
613 615 m.connect(
614 616 'pull_requests_global_0', '/pull_requests/{pull_request_id:[0-9]+}',
615 617 action='pull_requests')
616 618 m.connect(
617 619 'pull_requests_global', '/pull-requests/{pull_request_id:[0-9]+}',
618 620 action='pull_requests')
619 621
620 622
621 623 # USER JOURNAL
622 624 rmap.connect('journal', '%s/journal' % (ADMIN_PREFIX,),
623 625 controller='journal', action='index')
624 626 rmap.connect('journal_rss', '%s/journal/rss' % (ADMIN_PREFIX,),
625 627 controller='journal', action='journal_rss')
626 628 rmap.connect('journal_atom', '%s/journal/atom' % (ADMIN_PREFIX,),
627 629 controller='journal', action='journal_atom')
628 630
629 631 rmap.connect('public_journal', '%s/public_journal' % (ADMIN_PREFIX,),
630 632 controller='journal', action='public_journal')
631 633
632 634 rmap.connect('public_journal_rss', '%s/public_journal/rss' % (ADMIN_PREFIX,),
633 635 controller='journal', action='public_journal_rss')
634 636
635 637 rmap.connect('public_journal_rss_old', '%s/public_journal_rss' % (ADMIN_PREFIX,),
636 638 controller='journal', action='public_journal_rss')
637 639
638 640 rmap.connect('public_journal_atom',
639 641 '%s/public_journal/atom' % (ADMIN_PREFIX,), controller='journal',
640 642 action='public_journal_atom')
641 643
642 644 rmap.connect('public_journal_atom_old',
643 645 '%s/public_journal_atom' % (ADMIN_PREFIX,), controller='journal',
644 646 action='public_journal_atom')
645 647
646 648 rmap.connect('toggle_following', '%s/toggle_following' % (ADMIN_PREFIX,),
647 649 controller='journal', action='toggle_following', jsroute=True,
648 650 conditions={'method': ['POST']})
649 651
650 652 # FULL TEXT SEARCH
651 653 rmap.connect('search', '%s/search' % (ADMIN_PREFIX,),
652 654 controller='search')
653 655 rmap.connect('search_repo_home', '/{repo_name}/search',
654 656 controller='search',
655 657 action='index',
656 658 conditions={'function': check_repo},
657 659 requirements=URL_NAME_REQUIREMENTS)
658 660
659 661 # FEEDS
660 662 rmap.connect('rss_feed_home', '/{repo_name}/feed/rss',
661 663 controller='feed', action='rss',
662 664 conditions={'function': check_repo},
663 665 requirements=URL_NAME_REQUIREMENTS)
664 666
665 667 rmap.connect('atom_feed_home', '/{repo_name}/feed/atom',
666 668 controller='feed', action='atom',
667 669 conditions={'function': check_repo},
668 670 requirements=URL_NAME_REQUIREMENTS)
669 671
670 672 #==========================================================================
671 673 # REPOSITORY ROUTES
672 674 #==========================================================================
673 675
674 676 rmap.connect('repo_creating_home', '/{repo_name}/repo_creating',
675 677 controller='admin/repos', action='repo_creating',
676 678 requirements=URL_NAME_REQUIREMENTS)
677 679 rmap.connect('repo_check_home', '/{repo_name}/crepo_check',
678 680 controller='admin/repos', action='repo_check',
679 681 requirements=URL_NAME_REQUIREMENTS)
680 682
681 683 rmap.connect('repo_stats', '/{repo_name}/repo_stats/{commit_id}',
682 684 controller='summary', action='repo_stats',
683 685 conditions={'function': check_repo},
684 686 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
685 687
686 688 rmap.connect('repo_refs_data', '/{repo_name}/refs-data',
687 689 controller='summary', action='repo_refs_data', jsroute=True,
688 690 requirements=URL_NAME_REQUIREMENTS)
689 691 rmap.connect('repo_refs_changelog_data', '/{repo_name}/refs-data-changelog',
690 692 controller='summary', action='repo_refs_changelog_data',
691 693 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
692 694
693 695 rmap.connect('changeset_home', '/{repo_name}/changeset/{revision}',
694 696 controller='changeset', revision='tip', jsroute=True,
695 697 conditions={'function': check_repo},
696 698 requirements=URL_NAME_REQUIREMENTS)
697 699 rmap.connect('changeset_children', '/{repo_name}/changeset_children/{revision}',
698 700 controller='changeset', revision='tip', action='changeset_children',
699 701 conditions={'function': check_repo},
700 702 requirements=URL_NAME_REQUIREMENTS)
701 703 rmap.connect('changeset_parents', '/{repo_name}/changeset_parents/{revision}',
702 704 controller='changeset', revision='tip', action='changeset_parents',
703 705 conditions={'function': check_repo},
704 706 requirements=URL_NAME_REQUIREMENTS)
705 707
706 708 # repo edit options
707 709 rmap.connect('edit_repo', '/{repo_name}/settings', jsroute=True,
708 710 controller='admin/repos', action='edit',
709 711 conditions={'method': ['GET'], 'function': check_repo},
710 712 requirements=URL_NAME_REQUIREMENTS)
711 713
712 714 rmap.connect('edit_repo_perms', '/{repo_name}/settings/permissions',
713 715 jsroute=True,
714 716 controller='admin/repos', action='edit_permissions',
715 717 conditions={'method': ['GET'], 'function': check_repo},
716 718 requirements=URL_NAME_REQUIREMENTS)
717 719 rmap.connect('edit_repo_perms_update', '/{repo_name}/settings/permissions',
718 720 controller='admin/repos', action='edit_permissions_update',
719 721 conditions={'method': ['PUT'], 'function': check_repo},
720 722 requirements=URL_NAME_REQUIREMENTS)
721 723
722 724 rmap.connect('edit_repo_fields', '/{repo_name}/settings/fields',
723 725 controller='admin/repos', action='edit_fields',
724 726 conditions={'method': ['GET'], 'function': check_repo},
725 727 requirements=URL_NAME_REQUIREMENTS)
726 728 rmap.connect('create_repo_fields', '/{repo_name}/settings/fields/new',
727 729 controller='admin/repos', action='create_repo_field',
728 730 conditions={'method': ['PUT'], 'function': check_repo},
729 731 requirements=URL_NAME_REQUIREMENTS)
730 732 rmap.connect('delete_repo_fields', '/{repo_name}/settings/fields/{field_id}',
731 733 controller='admin/repos', action='delete_repo_field',
732 734 conditions={'method': ['DELETE'], 'function': check_repo},
733 735 requirements=URL_NAME_REQUIREMENTS)
734 736
735 737 rmap.connect('edit_repo_advanced', '/{repo_name}/settings/advanced',
736 738 controller='admin/repos', action='edit_advanced',
737 739 conditions={'method': ['GET'], 'function': check_repo},
738 740 requirements=URL_NAME_REQUIREMENTS)
739 741
740 742 rmap.connect('edit_repo_advanced_locking', '/{repo_name}/settings/advanced/locking',
741 743 controller='admin/repos', action='edit_advanced_locking',
742 744 conditions={'method': ['PUT'], 'function': check_repo},
743 745 requirements=URL_NAME_REQUIREMENTS)
744 746 rmap.connect('toggle_locking', '/{repo_name}/settings/advanced/locking_toggle',
745 747 controller='admin/repos', action='toggle_locking',
746 748 conditions={'method': ['GET'], 'function': check_repo},
747 749 requirements=URL_NAME_REQUIREMENTS)
748 750
749 751 rmap.connect('edit_repo_advanced_journal', '/{repo_name}/settings/advanced/journal',
750 752 controller='admin/repos', action='edit_advanced_journal',
751 753 conditions={'method': ['PUT'], 'function': check_repo},
752 754 requirements=URL_NAME_REQUIREMENTS)
753 755
754 756 rmap.connect('edit_repo_advanced_fork', '/{repo_name}/settings/advanced/fork',
755 757 controller='admin/repos', action='edit_advanced_fork',
756 758 conditions={'method': ['PUT'], 'function': check_repo},
757 759 requirements=URL_NAME_REQUIREMENTS)
758 760
759 761 rmap.connect('edit_repo_caches', '/{repo_name}/settings/caches',
760 762 controller='admin/repos', action='edit_caches_form',
761 763 conditions={'method': ['GET'], 'function': check_repo},
762 764 requirements=URL_NAME_REQUIREMENTS)
763 765 rmap.connect('edit_repo_caches', '/{repo_name}/settings/caches',
764 766 controller='admin/repos', action='edit_caches',
765 767 conditions={'method': ['PUT'], 'function': check_repo},
766 768 requirements=URL_NAME_REQUIREMENTS)
767 769
768 770 rmap.connect('edit_repo_remote', '/{repo_name}/settings/remote',
769 771 controller='admin/repos', action='edit_remote_form',
770 772 conditions={'method': ['GET'], 'function': check_repo},
771 773 requirements=URL_NAME_REQUIREMENTS)
772 774 rmap.connect('edit_repo_remote', '/{repo_name}/settings/remote',
773 775 controller='admin/repos', action='edit_remote',
774 776 conditions={'method': ['PUT'], 'function': check_repo},
775 777 requirements=URL_NAME_REQUIREMENTS)
776 778
777 779 rmap.connect('edit_repo_statistics', '/{repo_name}/settings/statistics',
778 780 controller='admin/repos', action='edit_statistics_form',
779 781 conditions={'method': ['GET'], 'function': check_repo},
780 782 requirements=URL_NAME_REQUIREMENTS)
781 783 rmap.connect('edit_repo_statistics', '/{repo_name}/settings/statistics',
782 784 controller='admin/repos', action='edit_statistics',
783 785 conditions={'method': ['PUT'], 'function': check_repo},
784 786 requirements=URL_NAME_REQUIREMENTS)
785 787 rmap.connect('repo_settings_issuetracker',
786 788 '/{repo_name}/settings/issue-tracker',
787 789 controller='admin/repos', action='repo_issuetracker',
788 790 conditions={'method': ['GET'], 'function': check_repo},
789 791 requirements=URL_NAME_REQUIREMENTS)
790 792 rmap.connect('repo_issuetracker_test',
791 793 '/{repo_name}/settings/issue-tracker/test',
792 794 controller='admin/repos', action='repo_issuetracker_test',
793 795 conditions={'method': ['POST'], 'function': check_repo},
794 796 requirements=URL_NAME_REQUIREMENTS)
795 797 rmap.connect('repo_issuetracker_delete',
796 798 '/{repo_name}/settings/issue-tracker/delete',
797 799 controller='admin/repos', action='repo_issuetracker_delete',
798 800 conditions={'method': ['DELETE'], 'function': check_repo},
799 801 requirements=URL_NAME_REQUIREMENTS)
800 802 rmap.connect('repo_issuetracker_save',
801 803 '/{repo_name}/settings/issue-tracker/save',
802 804 controller='admin/repos', action='repo_issuetracker_save',
803 805 conditions={'method': ['POST'], 'function': check_repo},
804 806 requirements=URL_NAME_REQUIREMENTS)
805 807 rmap.connect('repo_vcs_settings', '/{repo_name}/settings/vcs',
806 808 controller='admin/repos', action='repo_settings_vcs_update',
807 809 conditions={'method': ['POST'], 'function': check_repo},
808 810 requirements=URL_NAME_REQUIREMENTS)
809 811 rmap.connect('repo_vcs_settings', '/{repo_name}/settings/vcs',
810 812 controller='admin/repos', action='repo_settings_vcs',
811 813 conditions={'method': ['GET'], 'function': check_repo},
812 814 requirements=URL_NAME_REQUIREMENTS)
813 815 rmap.connect('repo_vcs_settings', '/{repo_name}/settings/vcs',
814 816 controller='admin/repos', action='repo_delete_svn_pattern',
815 817 conditions={'method': ['DELETE'], 'function': check_repo},
816 818 requirements=URL_NAME_REQUIREMENTS)
817 819
818 820 # still working url for backward compat.
819 821 rmap.connect('raw_changeset_home_depraced',
820 822 '/{repo_name}/raw-changeset/{revision}',
821 823 controller='changeset', action='changeset_raw',
822 824 revision='tip', conditions={'function': check_repo},
823 825 requirements=URL_NAME_REQUIREMENTS)
824 826
825 827 # new URLs
826 828 rmap.connect('changeset_raw_home',
827 829 '/{repo_name}/changeset-diff/{revision}',
828 830 controller='changeset', action='changeset_raw',
829 831 revision='tip', conditions={'function': check_repo},
830 832 requirements=URL_NAME_REQUIREMENTS)
831 833
832 834 rmap.connect('changeset_patch_home',
833 835 '/{repo_name}/changeset-patch/{revision}',
834 836 controller='changeset', action='changeset_patch',
835 837 revision='tip', conditions={'function': check_repo},
836 838 requirements=URL_NAME_REQUIREMENTS)
837 839
838 840 rmap.connect('changeset_download_home',
839 841 '/{repo_name}/changeset-download/{revision}',
840 842 controller='changeset', action='changeset_download',
841 843 revision='tip', conditions={'function': check_repo},
842 844 requirements=URL_NAME_REQUIREMENTS)
843 845
844 846 rmap.connect('changeset_comment',
845 847 '/{repo_name}/changeset/{revision}/comment', jsroute=True,
846 848 controller='changeset', revision='tip', action='comment',
847 849 conditions={'function': check_repo},
848 850 requirements=URL_NAME_REQUIREMENTS)
849 851
850 852 rmap.connect('changeset_comment_preview',
851 853 '/{repo_name}/changeset/comment/preview', jsroute=True,
852 854 controller='changeset', action='preview_comment',
853 855 conditions={'function': check_repo, 'method': ['POST']},
854 856 requirements=URL_NAME_REQUIREMENTS)
855 857
856 858 rmap.connect('changeset_comment_delete',
857 859 '/{repo_name}/changeset/comment/{comment_id}/delete',
858 860 controller='changeset', action='delete_comment',
859 861 conditions={'function': check_repo, 'method': ['DELETE']},
860 862 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
861 863
862 864 rmap.connect('changeset_info', '/changeset_info/{repo_name}/{revision}',
863 865 controller='changeset', action='changeset_info',
864 866 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
865 867
866 868 rmap.connect('compare_home',
867 869 '/{repo_name}/compare',
868 870 controller='compare', action='index',
869 871 conditions={'function': check_repo},
870 872 requirements=URL_NAME_REQUIREMENTS)
871 873
872 874 rmap.connect('compare_url',
873 875 '/{repo_name}/compare/{source_ref_type}@{source_ref:.*?}...{target_ref_type}@{target_ref:.*?}',
874 876 controller='compare', action='compare',
875 877 conditions={'function': check_repo},
876 878 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
877 879
878 880 rmap.connect('pullrequest_home',
879 881 '/{repo_name}/pull-request/new', controller='pullrequests',
880 882 action='index', conditions={'function': check_repo,
881 883 'method': ['GET']},
882 884 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
883 885
884 886 rmap.connect('pullrequest',
885 887 '/{repo_name}/pull-request/new', controller='pullrequests',
886 888 action='create', conditions={'function': check_repo,
887 889 'method': ['POST']},
888 890 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
889 891
890 892 rmap.connect('pullrequest_repo_refs',
891 893 '/{repo_name}/pull-request/refs/{target_repo_name:.*?[^/]}',
892 894 controller='pullrequests',
893 895 action='get_repo_refs',
894 896 conditions={'function': check_repo, 'method': ['GET']},
895 897 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
896 898
897 899 rmap.connect('pullrequest_repo_destinations',
898 900 '/{repo_name}/pull-request/repo-destinations',
899 901 controller='pullrequests',
900 902 action='get_repo_destinations',
901 903 conditions={'function': check_repo, 'method': ['GET']},
902 904 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
903 905
904 906 rmap.connect('pullrequest_show',
905 907 '/{repo_name}/pull-request/{pull_request_id}',
906 908 controller='pullrequests',
907 909 action='show', conditions={'function': check_repo,
908 910 'method': ['GET']},
909 911 requirements=URL_NAME_REQUIREMENTS)
910 912
911 913 rmap.connect('pullrequest_update',
912 914 '/{repo_name}/pull-request/{pull_request_id}',
913 915 controller='pullrequests',
914 916 action='update', conditions={'function': check_repo,
915 917 'method': ['PUT']},
916 918 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
917 919
918 920 rmap.connect('pullrequest_merge',
919 921 '/{repo_name}/pull-request/{pull_request_id}',
920 922 controller='pullrequests',
921 923 action='merge', conditions={'function': check_repo,
922 924 'method': ['POST']},
923 925 requirements=URL_NAME_REQUIREMENTS)
924 926
925 927 rmap.connect('pullrequest_delete',
926 928 '/{repo_name}/pull-request/{pull_request_id}',
927 929 controller='pullrequests',
928 930 action='delete', conditions={'function': check_repo,
929 931 'method': ['DELETE']},
930 932 requirements=URL_NAME_REQUIREMENTS)
931 933
932 934 rmap.connect('pullrequest_show_all',
933 935 '/{repo_name}/pull-request',
934 936 controller='pullrequests',
935 937 action='show_all', conditions={'function': check_repo,
936 938 'method': ['GET']},
937 939 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
938 940
939 941 rmap.connect('pullrequest_comment',
940 942 '/{repo_name}/pull-request-comment/{pull_request_id}',
941 943 controller='pullrequests',
942 944 action='comment', conditions={'function': check_repo,
943 945 'method': ['POST']},
944 946 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
945 947
946 948 rmap.connect('pullrequest_comment_delete',
947 949 '/{repo_name}/pull-request-comment/{comment_id}/delete',
948 950 controller='pullrequests', action='delete_comment',
949 951 conditions={'function': check_repo, 'method': ['DELETE']},
950 952 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
951 953
952 954 rmap.connect('summary_home_explicit', '/{repo_name}/summary',
953 955 controller='summary', conditions={'function': check_repo},
954 956 requirements=URL_NAME_REQUIREMENTS)
955 957
956 958 rmap.connect('branches_home', '/{repo_name}/branches',
957 959 controller='branches', conditions={'function': check_repo},
958 960 requirements=URL_NAME_REQUIREMENTS)
959 961
960 962 rmap.connect('tags_home', '/{repo_name}/tags',
961 963 controller='tags', conditions={'function': check_repo},
962 964 requirements=URL_NAME_REQUIREMENTS)
963 965
964 966 rmap.connect('bookmarks_home', '/{repo_name}/bookmarks',
965 967 controller='bookmarks', conditions={'function': check_repo},
966 968 requirements=URL_NAME_REQUIREMENTS)
967 969
968 970 rmap.connect('changelog_home', '/{repo_name}/changelog', jsroute=True,
969 971 controller='changelog', conditions={'function': check_repo},
970 972 requirements=URL_NAME_REQUIREMENTS)
971 973
972 974 rmap.connect('changelog_summary_home', '/{repo_name}/changelog_summary',
973 975 controller='changelog', action='changelog_summary',
974 976 conditions={'function': check_repo},
975 977 requirements=URL_NAME_REQUIREMENTS)
976 978
977 979 rmap.connect('changelog_file_home',
978 980 '/{repo_name}/changelog/{revision}/{f_path}',
979 981 controller='changelog', f_path=None,
980 982 conditions={'function': check_repo},
981 983 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
982 984
983 985 rmap.connect('changelog_details', '/{repo_name}/changelog_details/{cs}',
984 986 controller='changelog', action='changelog_details',
985 987 conditions={'function': check_repo},
986 988 requirements=URL_NAME_REQUIREMENTS)
987 989
988 990 rmap.connect('files_home', '/{repo_name}/files/{revision}/{f_path}',
989 991 controller='files', revision='tip', f_path='',
990 992 conditions={'function': check_repo},
991 993 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
992 994
993 995 rmap.connect('files_home_simple_catchrev',
994 996 '/{repo_name}/files/{revision}',
995 997 controller='files', revision='tip', f_path='',
996 998 conditions={'function': check_repo},
997 999 requirements=URL_NAME_REQUIREMENTS)
998 1000
999 1001 rmap.connect('files_home_simple_catchall',
1000 1002 '/{repo_name}/files',
1001 1003 controller='files', revision='tip', f_path='',
1002 1004 conditions={'function': check_repo},
1003 1005 requirements=URL_NAME_REQUIREMENTS)
1004 1006
1005 1007 rmap.connect('files_history_home',
1006 1008 '/{repo_name}/history/{revision}/{f_path}',
1007 1009 controller='files', action='history', revision='tip', f_path='',
1008 1010 conditions={'function': check_repo},
1009 1011 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1010 1012
1011 1013 rmap.connect('files_authors_home',
1012 1014 '/{repo_name}/authors/{revision}/{f_path}',
1013 1015 controller='files', action='authors', revision='tip', f_path='',
1014 1016 conditions={'function': check_repo},
1015 1017 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1016 1018
1017 1019 rmap.connect('files_diff_home', '/{repo_name}/diff/{f_path}',
1018 1020 controller='files', action='diff', f_path='',
1019 1021 conditions={'function': check_repo},
1020 1022 requirements=URL_NAME_REQUIREMENTS)
1021 1023
1022 1024 rmap.connect('files_diff_2way_home',
1023 1025 '/{repo_name}/diff-2way/{f_path}',
1024 1026 controller='files', action='diff_2way', f_path='',
1025 1027 conditions={'function': check_repo},
1026 1028 requirements=URL_NAME_REQUIREMENTS)
1027 1029
1028 1030 rmap.connect('files_rawfile_home',
1029 1031 '/{repo_name}/rawfile/{revision}/{f_path}',
1030 1032 controller='files', action='rawfile', revision='tip',
1031 1033 f_path='', conditions={'function': check_repo},
1032 1034 requirements=URL_NAME_REQUIREMENTS)
1033 1035
1034 1036 rmap.connect('files_raw_home',
1035 1037 '/{repo_name}/raw/{revision}/{f_path}',
1036 1038 controller='files', action='raw', revision='tip', f_path='',
1037 1039 conditions={'function': check_repo},
1038 1040 requirements=URL_NAME_REQUIREMENTS)
1039 1041
1040 1042 rmap.connect('files_render_home',
1041 1043 '/{repo_name}/render/{revision}/{f_path}',
1042 1044 controller='files', action='index', revision='tip', f_path='',
1043 1045 rendered=True, conditions={'function': check_repo},
1044 1046 requirements=URL_NAME_REQUIREMENTS)
1045 1047
1046 1048 rmap.connect('files_annotate_home',
1047 1049 '/{repo_name}/annotate/{revision}/{f_path}',
1048 1050 controller='files', action='index', revision='tip',
1049 1051 f_path='', annotate=True, conditions={'function': check_repo},
1050 1052 requirements=URL_NAME_REQUIREMENTS)
1051 1053
1052 1054 rmap.connect('files_edit',
1053 1055 '/{repo_name}/edit/{revision}/{f_path}',
1054 1056 controller='files', action='edit', revision='tip',
1055 1057 f_path='',
1056 1058 conditions={'function': check_repo, 'method': ['POST']},
1057 1059 requirements=URL_NAME_REQUIREMENTS)
1058 1060
1059 1061 rmap.connect('files_edit_home',
1060 1062 '/{repo_name}/edit/{revision}/{f_path}',
1061 1063 controller='files', action='edit_home', revision='tip',
1062 1064 f_path='', conditions={'function': check_repo},
1063 1065 requirements=URL_NAME_REQUIREMENTS)
1064 1066
1065 1067 rmap.connect('files_add',
1066 1068 '/{repo_name}/add/{revision}/{f_path}',
1067 1069 controller='files', action='add', revision='tip',
1068 1070 f_path='',
1069 1071 conditions={'function': check_repo, 'method': ['POST']},
1070 1072 requirements=URL_NAME_REQUIREMENTS)
1071 1073
1072 1074 rmap.connect('files_add_home',
1073 1075 '/{repo_name}/add/{revision}/{f_path}',
1074 1076 controller='files', action='add_home', revision='tip',
1075 1077 f_path='', conditions={'function': check_repo},
1076 1078 requirements=URL_NAME_REQUIREMENTS)
1077 1079
1078 1080 rmap.connect('files_delete',
1079 1081 '/{repo_name}/delete/{revision}/{f_path}',
1080 1082 controller='files', action='delete', revision='tip',
1081 1083 f_path='',
1082 1084 conditions={'function': check_repo, 'method': ['POST']},
1083 1085 requirements=URL_NAME_REQUIREMENTS)
1084 1086
1085 1087 rmap.connect('files_delete_home',
1086 1088 '/{repo_name}/delete/{revision}/{f_path}',
1087 1089 controller='files', action='delete_home', revision='tip',
1088 1090 f_path='', conditions={'function': check_repo},
1089 1091 requirements=URL_NAME_REQUIREMENTS)
1090 1092
1091 1093 rmap.connect('files_archive_home', '/{repo_name}/archive/{fname}',
1092 1094 controller='files', action='archivefile',
1093 1095 conditions={'function': check_repo},
1094 1096 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1095 1097
1096 1098 rmap.connect('files_nodelist_home',
1097 1099 '/{repo_name}/nodelist/{revision}/{f_path}',
1098 1100 controller='files', action='nodelist',
1099 1101 conditions={'function': check_repo},
1100 1102 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1101 1103
1102 1104 rmap.connect('files_metadata_list_home',
1103 1105 '/{repo_name}/metadata_list/{revision}/{f_path}',
1104 1106 controller='files', action='metadata_list',
1105 1107 conditions={'function': check_repo},
1106 1108 requirements=URL_NAME_REQUIREMENTS, jsroute=True)
1107 1109
1108 1110 rmap.connect('repo_fork_create_home', '/{repo_name}/fork',
1109 1111 controller='forks', action='fork_create',
1110 1112 conditions={'function': check_repo, 'method': ['POST']},
1111 1113 requirements=URL_NAME_REQUIREMENTS)
1112 1114
1113 1115 rmap.connect('repo_fork_home', '/{repo_name}/fork',
1114 1116 controller='forks', action='fork',
1115 1117 conditions={'function': check_repo},
1116 1118 requirements=URL_NAME_REQUIREMENTS)
1117 1119
1118 1120 rmap.connect('repo_forks_home', '/{repo_name}/forks',
1119 1121 controller='forks', action='forks',
1120 1122 conditions={'function': check_repo},
1121 1123 requirements=URL_NAME_REQUIREMENTS)
1122 1124
1123 1125 rmap.connect('repo_followers_home', '/{repo_name}/followers',
1124 1126 controller='followers', action='followers',
1125 1127 conditions={'function': check_repo},
1126 1128 requirements=URL_NAME_REQUIREMENTS)
1127 1129
1128 1130 # must be here for proper group/repo catching pattern
1129 1131 _connect_with_slash(
1130 1132 rmap, 'repo_group_home', '/{group_name}',
1131 1133 controller='home', action='index_repo_group',
1132 1134 conditions={'function': check_group},
1133 1135 requirements=URL_NAME_REQUIREMENTS)
1134 1136
1135 1137 # catch all, at the end
1136 1138 _connect_with_slash(
1137 1139 rmap, 'summary_home', '/{repo_name}', jsroute=True,
1138 1140 controller='summary', action='index',
1139 1141 conditions={'function': check_repo},
1140 1142 requirements=URL_NAME_REQUIREMENTS)
1141 1143
1142 1144 rmap.jsroutes()
1143 1145 return rmap
1144 1146
1145 1147
1146 1148 def _connect_with_slash(mapper, name, path, *args, **kwargs):
1147 1149 """
1148 1150 Connect a route with an optional trailing slash in `path`.
1149 1151 """
1150 1152 mapper.connect(name + '_slash', path + '/', *args, **kwargs)
1151 1153 mapper.connect(name, path, *args, **kwargs)
@@ -1,49 +1,51 b''
1
1 2 /******************************************************************************
2 3 * *
3 4 * DO NOT CHANGE THIS FILE MANUALLY *
4 5 * *
5 6 * *
6 7 * This file is automatically generated when the app starts up. *
7 8 * *
8 9 * To add a route here pass jsroute=True to the route definition in the app *
9 10 * *
10 11 ******************************************************************************/
11 12 function registerRCRoutes() {
12 13 // routes registration
13 14 pyroutes.register('home', '/', []);
14 15 pyroutes.register('user_autocomplete_data', '/_users', []);
15 16 pyroutes.register('new_repo', '/_admin/create_repository', []);
16 17 pyroutes.register('edit_user_group_members', '/_admin/user_groups/%(user_group_id)s/edit/members', ['user_group_id']);
17 18 pyroutes.register('gists', '/_admin/gists', []);
18 19 pyroutes.register('new_gist', '/_admin/gists/new', []);
20 pyroutes.register('gists', '/_admin/gists', []);
19 21 pyroutes.register('toggle_following', '/_admin/toggle_following', []);
20 22 pyroutes.register('repo_stats', '/%(repo_name)s/repo_stats/%(commit_id)s', ['repo_name', 'commit_id']);
21 23 pyroutes.register('repo_refs_data', '/%(repo_name)s/refs-data', ['repo_name']);
22 24 pyroutes.register('repo_refs_changelog_data', '/%(repo_name)s/refs-data-changelog', ['repo_name']);
23 25 pyroutes.register('changeset_home', '/%(repo_name)s/changeset/%(revision)s', ['repo_name', 'revision']);
24 26 pyroutes.register('edit_repo', '/%(repo_name)s/settings', ['repo_name']);
25 27 pyroutes.register('edit_repo_perms', '/%(repo_name)s/settings/permissions', ['repo_name']);
26 28 pyroutes.register('changeset_comment', '/%(repo_name)s/changeset/%(revision)s/comment', ['repo_name', 'revision']);
27 29 pyroutes.register('changeset_comment_preview', '/%(repo_name)s/changeset/comment/preview', ['repo_name']);
28 30 pyroutes.register('changeset_comment_delete', '/%(repo_name)s/changeset/comment/%(comment_id)s/delete', ['repo_name', 'comment_id']);
29 31 pyroutes.register('changeset_info', '/changeset_info/%(repo_name)s/%(revision)s', ['repo_name', 'revision']);
30 32 pyroutes.register('compare_url', '/%(repo_name)s/compare/%(source_ref_type)s@%(source_ref)s...%(target_ref_type)s@%(target_ref)s', ['repo_name', 'source_ref_type', 'source_ref', 'target_ref_type', 'target_ref']);
31 33 pyroutes.register('pullrequest_home', '/%(repo_name)s/pull-request/new', ['repo_name']);
32 34 pyroutes.register('pullrequest', '/%(repo_name)s/pull-request/new', ['repo_name']);
33 35 pyroutes.register('pullrequest_repo_refs', '/%(repo_name)s/pull-request/refs/%(target_repo_name)s', ['repo_name', 'target_repo_name']);
34 36 pyroutes.register('pullrequest_repo_destinations', '/%(repo_name)s/pull-request/repo-destinations', ['repo_name']);
35 37 pyroutes.register('pullrequest_update', '/%(repo_name)s/pull-request/%(pull_request_id)s', ['repo_name', 'pull_request_id']);
36 38 pyroutes.register('pullrequest_show_all', '/%(repo_name)s/pull-request', ['repo_name']);
37 39 pyroutes.register('pullrequest_comment', '/%(repo_name)s/pull-request-comment/%(pull_request_id)s', ['repo_name', 'pull_request_id']);
38 40 pyroutes.register('pullrequest_comment_delete', '/%(repo_name)s/pull-request-comment/%(comment_id)s/delete', ['repo_name', 'comment_id']);
39 41 pyroutes.register('changelog_home', '/%(repo_name)s/changelog', ['repo_name']);
40 42 pyroutes.register('changelog_file_home', '/%(repo_name)s/changelog/%(revision)s/%(f_path)s', ['repo_name', 'revision', 'f_path']);
41 43 pyroutes.register('files_home', '/%(repo_name)s/files/%(revision)s/%(f_path)s', ['repo_name', 'revision', 'f_path']);
42 44 pyroutes.register('files_history_home', '/%(repo_name)s/history/%(revision)s/%(f_path)s', ['repo_name', 'revision', 'f_path']);
43 45 pyroutes.register('files_authors_home', '/%(repo_name)s/authors/%(revision)s/%(f_path)s', ['repo_name', 'revision', 'f_path']);
44 46 pyroutes.register('files_archive_home', '/%(repo_name)s/archive/%(fname)s', ['repo_name', 'fname']);
45 47 pyroutes.register('files_nodelist_home', '/%(repo_name)s/nodelist/%(revision)s/%(f_path)s', ['repo_name', 'revision', 'f_path']);
46 48 pyroutes.register('files_metadata_list_home', '/%(repo_name)s/metadata_list/%(revision)s/%(f_path)s', ['repo_name', 'revision', 'f_path']);
47 49 pyroutes.register('summary_home_slash', '/%(repo_name)s/', ['repo_name']);
48 50 pyroutes.register('summary_home', '/%(repo_name)s', ['repo_name']);
49 } No newline at end of file
51 }
General Comments 0
You need to be logged in to leave comments. Login now