##// END OF EJS Templates
repo-settings: add hidden view to force re-install hooks....
marcink -
r2678:b1263852 default
parent child Browse files
Show More
@@ -1,463 +1,467 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2016-2018 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 from rhodecode.apps._base import add_route_with_slash
21 21
22 22
23 23 def includeme(config):
24 24
25 25 # repo creating checks, special cases that aren't repo routes
26 26 config.add_route(
27 27 name='repo_creating',
28 28 pattern='/{repo_name:.*?[^/]}/repo_creating')
29 29
30 30 config.add_route(
31 31 name='repo_creating_check',
32 32 pattern='/{repo_name:.*?[^/]}/repo_creating_check')
33 33
34 34 # Summary
35 35 # NOTE(marcink): one additional route is defined in very bottom, catch
36 36 # all pattern
37 37 config.add_route(
38 38 name='repo_summary_explicit',
39 39 pattern='/{repo_name:.*?[^/]}/summary', repo_route=True)
40 40 config.add_route(
41 41 name='repo_summary_commits',
42 42 pattern='/{repo_name:.*?[^/]}/summary-commits', repo_route=True)
43 43
44 44 # Commits
45 45 config.add_route(
46 46 name='repo_commit',
47 47 pattern='/{repo_name:.*?[^/]}/changeset/{commit_id}', repo_route=True)
48 48
49 49 config.add_route(
50 50 name='repo_commit_children',
51 51 pattern='/{repo_name:.*?[^/]}/changeset_children/{commit_id}', repo_route=True)
52 52
53 53 config.add_route(
54 54 name='repo_commit_parents',
55 55 pattern='/{repo_name:.*?[^/]}/changeset_parents/{commit_id}', repo_route=True)
56 56
57 57 config.add_route(
58 58 name='repo_commit_raw',
59 59 pattern='/{repo_name:.*?[^/]}/changeset-diff/{commit_id}', repo_route=True)
60 60
61 61 config.add_route(
62 62 name='repo_commit_patch',
63 63 pattern='/{repo_name:.*?[^/]}/changeset-patch/{commit_id}', repo_route=True)
64 64
65 65 config.add_route(
66 66 name='repo_commit_download',
67 67 pattern='/{repo_name:.*?[^/]}/changeset-download/{commit_id}', repo_route=True)
68 68
69 69 config.add_route(
70 70 name='repo_commit_data',
71 71 pattern='/{repo_name:.*?[^/]}/changeset-data/{commit_id}', repo_route=True)
72 72
73 73 config.add_route(
74 74 name='repo_commit_comment_create',
75 75 pattern='/{repo_name:.*?[^/]}/changeset/{commit_id}/comment/create', repo_route=True)
76 76
77 77 config.add_route(
78 78 name='repo_commit_comment_preview',
79 79 pattern='/{repo_name:.*?[^/]}/changeset/{commit_id}/comment/preview', repo_route=True)
80 80
81 81 config.add_route(
82 82 name='repo_commit_comment_delete',
83 83 pattern='/{repo_name:.*?[^/]}/changeset/{commit_id}/comment/{comment_id}/delete', repo_route=True)
84 84
85 85 # still working url for backward compat.
86 86 config.add_route(
87 87 name='repo_commit_raw_deprecated',
88 88 pattern='/{repo_name:.*?[^/]}/raw-changeset/{commit_id}', repo_route=True)
89 89
90 90 # Files
91 91 config.add_route(
92 92 name='repo_archivefile',
93 93 pattern='/{repo_name:.*?[^/]}/archive/{fname}', repo_route=True)
94 94
95 95 config.add_route(
96 96 name='repo_files_diff',
97 97 pattern='/{repo_name:.*?[^/]}/diff/{f_path:.*}', repo_route=True)
98 98 config.add_route( # legacy route to make old links work
99 99 name='repo_files_diff_2way_redirect',
100 100 pattern='/{repo_name:.*?[^/]}/diff-2way/{f_path:.*}', repo_route=True)
101 101
102 102 config.add_route(
103 103 name='repo_files',
104 104 pattern='/{repo_name:.*?[^/]}/files/{commit_id}/{f_path:.*}', repo_route=True)
105 105 config.add_route(
106 106 name='repo_files:default_path',
107 107 pattern='/{repo_name:.*?[^/]}/files/{commit_id}/', repo_route=True)
108 108 config.add_route(
109 109 name='repo_files:default_commit',
110 110 pattern='/{repo_name:.*?[^/]}/files', repo_route=True)
111 111
112 112 config.add_route(
113 113 name='repo_files:rendered',
114 114 pattern='/{repo_name:.*?[^/]}/render/{commit_id}/{f_path:.*}', repo_route=True)
115 115
116 116 config.add_route(
117 117 name='repo_files:annotated',
118 118 pattern='/{repo_name:.*?[^/]}/annotate/{commit_id}/{f_path:.*}', repo_route=True)
119 119 config.add_route(
120 120 name='repo_files:annotated_previous',
121 121 pattern='/{repo_name:.*?[^/]}/annotate-previous/{commit_id}/{f_path:.*}', repo_route=True)
122 122
123 123 config.add_route(
124 124 name='repo_nodetree_full',
125 125 pattern='/{repo_name:.*?[^/]}/nodetree_full/{commit_id}/{f_path:.*}', repo_route=True)
126 126 config.add_route(
127 127 name='repo_nodetree_full:default_path',
128 128 pattern='/{repo_name:.*?[^/]}/nodetree_full/{commit_id}/', repo_route=True)
129 129
130 130 config.add_route(
131 131 name='repo_files_nodelist',
132 132 pattern='/{repo_name:.*?[^/]}/nodelist/{commit_id}/{f_path:.*}', repo_route=True)
133 133
134 134 config.add_route(
135 135 name='repo_file_raw',
136 136 pattern='/{repo_name:.*?[^/]}/raw/{commit_id}/{f_path:.*}', repo_route=True)
137 137
138 138 config.add_route(
139 139 name='repo_file_download',
140 140 pattern='/{repo_name:.*?[^/]}/download/{commit_id}/{f_path:.*}', repo_route=True)
141 141 config.add_route( # backward compat to keep old links working
142 142 name='repo_file_download:legacy',
143 143 pattern='/{repo_name:.*?[^/]}/rawfile/{commit_id}/{f_path:.*}',
144 144 repo_route=True)
145 145
146 146 config.add_route(
147 147 name='repo_file_history',
148 148 pattern='/{repo_name:.*?[^/]}/history/{commit_id}/{f_path:.*}', repo_route=True)
149 149
150 150 config.add_route(
151 151 name='repo_file_authors',
152 152 pattern='/{repo_name:.*?[^/]}/authors/{commit_id}/{f_path:.*}', repo_route=True)
153 153
154 154 config.add_route(
155 155 name='repo_files_remove_file',
156 156 pattern='/{repo_name:.*?[^/]}/remove_file/{commit_id}/{f_path:.*}',
157 157 repo_route=True)
158 158 config.add_route(
159 159 name='repo_files_delete_file',
160 160 pattern='/{repo_name:.*?[^/]}/delete_file/{commit_id}/{f_path:.*}',
161 161 repo_route=True)
162 162 config.add_route(
163 163 name='repo_files_edit_file',
164 164 pattern='/{repo_name:.*?[^/]}/edit_file/{commit_id}/{f_path:.*}',
165 165 repo_route=True)
166 166 config.add_route(
167 167 name='repo_files_update_file',
168 168 pattern='/{repo_name:.*?[^/]}/update_file/{commit_id}/{f_path:.*}',
169 169 repo_route=True)
170 170 config.add_route(
171 171 name='repo_files_add_file',
172 172 pattern='/{repo_name:.*?[^/]}/add_file/{commit_id}/{f_path:.*}',
173 173 repo_route=True)
174 174 config.add_route(
175 175 name='repo_files_create_file',
176 176 pattern='/{repo_name:.*?[^/]}/create_file/{commit_id}/{f_path:.*}',
177 177 repo_route=True)
178 178
179 179 # Refs data
180 180 config.add_route(
181 181 name='repo_refs_data',
182 182 pattern='/{repo_name:.*?[^/]}/refs-data', repo_route=True)
183 183
184 184 config.add_route(
185 185 name='repo_refs_changelog_data',
186 186 pattern='/{repo_name:.*?[^/]}/refs-data-changelog', repo_route=True)
187 187
188 188 config.add_route(
189 189 name='repo_stats',
190 190 pattern='/{repo_name:.*?[^/]}/repo_stats/{commit_id}', repo_route=True)
191 191
192 192 # Changelog
193 193 config.add_route(
194 194 name='repo_changelog',
195 195 pattern='/{repo_name:.*?[^/]}/changelog', repo_route=True)
196 196 config.add_route(
197 197 name='repo_changelog_file',
198 198 pattern='/{repo_name:.*?[^/]}/changelog/{commit_id}/{f_path:.*}', repo_route=True)
199 199 config.add_route(
200 200 name='repo_changelog_elements',
201 201 pattern='/{repo_name:.*?[^/]}/changelog_elements', repo_route=True)
202 202 config.add_route(
203 203 name='repo_changelog_elements_file',
204 204 pattern='/{repo_name:.*?[^/]}/changelog_elements/{commit_id}/{f_path:.*}', repo_route=True)
205 205
206 206 # Compare
207 207 config.add_route(
208 208 name='repo_compare_select',
209 209 pattern='/{repo_name:.*?[^/]}/compare', repo_route=True)
210 210
211 211 config.add_route(
212 212 name='repo_compare',
213 213 pattern='/{repo_name:.*?[^/]}/compare/{source_ref_type}@{source_ref:.*?}...{target_ref_type}@{target_ref:.*?}', repo_route=True)
214 214
215 215 # Tags
216 216 config.add_route(
217 217 name='tags_home',
218 218 pattern='/{repo_name:.*?[^/]}/tags', repo_route=True)
219 219
220 220 # Branches
221 221 config.add_route(
222 222 name='branches_home',
223 223 pattern='/{repo_name:.*?[^/]}/branches', repo_route=True)
224 224
225 225 # Bookmarks
226 226 config.add_route(
227 227 name='bookmarks_home',
228 228 pattern='/{repo_name:.*?[^/]}/bookmarks', repo_route=True)
229 229
230 230 # Forks
231 231 config.add_route(
232 232 name='repo_fork_new',
233 233 pattern='/{repo_name:.*?[^/]}/fork', repo_route=True,
234 234 repo_accepted_types=['hg', 'git'])
235 235
236 236 config.add_route(
237 237 name='repo_fork_create',
238 238 pattern='/{repo_name:.*?[^/]}/fork/create', repo_route=True,
239 239 repo_accepted_types=['hg', 'git'])
240 240
241 241 config.add_route(
242 242 name='repo_forks_show_all',
243 243 pattern='/{repo_name:.*?[^/]}/forks', repo_route=True,
244 244 repo_accepted_types=['hg', 'git'])
245 245 config.add_route(
246 246 name='repo_forks_data',
247 247 pattern='/{repo_name:.*?[^/]}/forks/data', repo_route=True,
248 248 repo_accepted_types=['hg', 'git'])
249 249
250 250 # Pull Requests
251 251 config.add_route(
252 252 name='pullrequest_show',
253 253 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}',
254 254 repo_route=True)
255 255
256 256 config.add_route(
257 257 name='pullrequest_show_all',
258 258 pattern='/{repo_name:.*?[^/]}/pull-request',
259 259 repo_route=True, repo_accepted_types=['hg', 'git'])
260 260
261 261 config.add_route(
262 262 name='pullrequest_show_all_data',
263 263 pattern='/{repo_name:.*?[^/]}/pull-request-data',
264 264 repo_route=True, repo_accepted_types=['hg', 'git'])
265 265
266 266 config.add_route(
267 267 name='pullrequest_repo_refs',
268 268 pattern='/{repo_name:.*?[^/]}/pull-request/refs/{target_repo_name:.*?[^/]}',
269 269 repo_route=True)
270 270
271 271 config.add_route(
272 272 name='pullrequest_repo_destinations',
273 273 pattern='/{repo_name:.*?[^/]}/pull-request/repo-destinations',
274 274 repo_route=True)
275 275
276 276 config.add_route(
277 277 name='pullrequest_new',
278 278 pattern='/{repo_name:.*?[^/]}/pull-request/new',
279 279 repo_route=True, repo_accepted_types=['hg', 'git'])
280 280
281 281 config.add_route(
282 282 name='pullrequest_create',
283 283 pattern='/{repo_name:.*?[^/]}/pull-request/create',
284 284 repo_route=True, repo_accepted_types=['hg', 'git'])
285 285
286 286 config.add_route(
287 287 name='pullrequest_update',
288 288 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/update',
289 289 repo_route=True)
290 290
291 291 config.add_route(
292 292 name='pullrequest_merge',
293 293 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/merge',
294 294 repo_route=True)
295 295
296 296 config.add_route(
297 297 name='pullrequest_delete',
298 298 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/delete',
299 299 repo_route=True)
300 300
301 301 config.add_route(
302 302 name='pullrequest_comment_create',
303 303 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/comment',
304 304 repo_route=True)
305 305
306 306 config.add_route(
307 307 name='pullrequest_comment_delete',
308 308 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/comment/{comment_id}/delete',
309 309 repo_route=True, repo_accepted_types=['hg', 'git'])
310 310
311 311 # Settings
312 312 config.add_route(
313 313 name='edit_repo',
314 314 pattern='/{repo_name:.*?[^/]}/settings', repo_route=True)
315 315 # update is POST on edit_repo
316 316
317 317 # Settings advanced
318 318 config.add_route(
319 319 name='edit_repo_advanced',
320 320 pattern='/{repo_name:.*?[^/]}/settings/advanced', repo_route=True)
321 321 config.add_route(
322 322 name='edit_repo_advanced_delete',
323 323 pattern='/{repo_name:.*?[^/]}/settings/advanced/delete', repo_route=True)
324 324 config.add_route(
325 325 name='edit_repo_advanced_locking',
326 326 pattern='/{repo_name:.*?[^/]}/settings/advanced/locking', repo_route=True)
327 327 config.add_route(
328 328 name='edit_repo_advanced_journal',
329 329 pattern='/{repo_name:.*?[^/]}/settings/advanced/journal', repo_route=True)
330 330 config.add_route(
331 331 name='edit_repo_advanced_fork',
332 332 pattern='/{repo_name:.*?[^/]}/settings/advanced/fork', repo_route=True)
333 333
334 config.add_route(
335 name='edit_repo_advanced_hooks',
336 pattern='/{repo_name:.*?[^/]}/settings/advanced/hooks', repo_route=True)
337
334 338 # Caches
335 339 config.add_route(
336 340 name='edit_repo_caches',
337 341 pattern='/{repo_name:.*?[^/]}/settings/caches', repo_route=True)
338 342
339 343 # Permissions
340 344 config.add_route(
341 345 name='edit_repo_perms',
342 346 pattern='/{repo_name:.*?[^/]}/settings/permissions', repo_route=True)
343 347
344 348 # Maintenance
345 349 config.add_route(
346 350 name='edit_repo_maintenance',
347 351 pattern='/{repo_name:.*?[^/]}/settings/maintenance', repo_route=True)
348 352
349 353 config.add_route(
350 354 name='edit_repo_maintenance_execute',
351 355 pattern='/{repo_name:.*?[^/]}/settings/maintenance/execute', repo_route=True)
352 356
353 357 # Fields
354 358 config.add_route(
355 359 name='edit_repo_fields',
356 360 pattern='/{repo_name:.*?[^/]}/settings/fields', repo_route=True)
357 361 config.add_route(
358 362 name='edit_repo_fields_create',
359 363 pattern='/{repo_name:.*?[^/]}/settings/fields/create', repo_route=True)
360 364 config.add_route(
361 365 name='edit_repo_fields_delete',
362 366 pattern='/{repo_name:.*?[^/]}/settings/fields/{field_id}/delete', repo_route=True)
363 367
364 368 # Locking
365 369 config.add_route(
366 370 name='repo_edit_toggle_locking',
367 371 pattern='/{repo_name:.*?[^/]}/settings/toggle_locking', repo_route=True)
368 372
369 373 # Remote
370 374 config.add_route(
371 375 name='edit_repo_remote',
372 376 pattern='/{repo_name:.*?[^/]}/settings/remote', repo_route=True)
373 377 config.add_route(
374 378 name='edit_repo_remote_pull',
375 379 pattern='/{repo_name:.*?[^/]}/settings/remote/pull', repo_route=True)
376 380 config.add_route(
377 381 name='edit_repo_remote_push',
378 382 pattern='/{repo_name:.*?[^/]}/settings/remote/push', repo_route=True)
379 383
380 384 # Statistics
381 385 config.add_route(
382 386 name='edit_repo_statistics',
383 387 pattern='/{repo_name:.*?[^/]}/settings/statistics', repo_route=True)
384 388 config.add_route(
385 389 name='edit_repo_statistics_reset',
386 390 pattern='/{repo_name:.*?[^/]}/settings/statistics/update', repo_route=True)
387 391
388 392 # Issue trackers
389 393 config.add_route(
390 394 name='edit_repo_issuetracker',
391 395 pattern='/{repo_name:.*?[^/]}/settings/issue_trackers', repo_route=True)
392 396 config.add_route(
393 397 name='edit_repo_issuetracker_test',
394 398 pattern='/{repo_name:.*?[^/]}/settings/issue_trackers/test', repo_route=True)
395 399 config.add_route(
396 400 name='edit_repo_issuetracker_delete',
397 401 pattern='/{repo_name:.*?[^/]}/settings/issue_trackers/delete', repo_route=True)
398 402 config.add_route(
399 403 name='edit_repo_issuetracker_update',
400 404 pattern='/{repo_name:.*?[^/]}/settings/issue_trackers/update', repo_route=True)
401 405
402 406 # VCS Settings
403 407 config.add_route(
404 408 name='edit_repo_vcs',
405 409 pattern='/{repo_name:.*?[^/]}/settings/vcs', repo_route=True)
406 410 config.add_route(
407 411 name='edit_repo_vcs_update',
408 412 pattern='/{repo_name:.*?[^/]}/settings/vcs/update', repo_route=True)
409 413
410 414 # svn pattern
411 415 config.add_route(
412 416 name='edit_repo_vcs_svn_pattern_delete',
413 417 pattern='/{repo_name:.*?[^/]}/settings/vcs/svn_pattern/delete', repo_route=True)
414 418
415 419 # Repo Review Rules (EE feature)
416 420 config.add_route(
417 421 name='repo_reviewers',
418 422 pattern='/{repo_name:.*?[^/]}/settings/review/rules', repo_route=True)
419 423
420 424 config.add_route(
421 425 name='repo_default_reviewers_data',
422 426 pattern='/{repo_name:.*?[^/]}/settings/review/default-reviewers', repo_route=True)
423 427
424 428 # Repo Automation (EE feature)
425 429 config.add_route(
426 430 name='repo_automation',
427 431 pattern='/{repo_name:.*?[^/]}/settings/automation', repo_route=True)
428 432
429 433 # Strip
430 434 config.add_route(
431 435 name='edit_repo_strip',
432 436 pattern='/{repo_name:.*?[^/]}/settings/strip', repo_route=True)
433 437
434 438 config.add_route(
435 439 name='strip_check',
436 440 pattern='/{repo_name:.*?[^/]}/settings/strip_check', repo_route=True)
437 441
438 442 config.add_route(
439 443 name='strip_execute',
440 444 pattern='/{repo_name:.*?[^/]}/settings/strip_execute', repo_route=True)
441 445
442 446 # Audit logs
443 447 config.add_route(
444 448 name='edit_repo_audit_logs',
445 449 pattern='/{repo_name:.*?[^/]}/settings/audit_logs', repo_route=True)
446 450
447 451 # ATOM/RSS Feed
448 452 config.add_route(
449 453 name='rss_feed_home',
450 454 pattern='/{repo_name:.*?[^/]}/feed/rss', repo_route=True)
451 455
452 456 config.add_route(
453 457 name='atom_feed_home',
454 458 pattern='/{repo_name:.*?[^/]}/feed/atom', repo_route=True)
455 459
456 460 # NOTE(marcink): needs to be at the end for catch-all
457 461 add_route_with_slash(
458 462 config,
459 463 name='repo_summary',
460 464 pattern='/{repo_name:.*?[^/]}', repo_route=True)
461 465
462 466 # Scan module for configuration decorators.
463 467 config.scan('.views', ignore='.tests')
@@ -1,233 +1,247 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2011-2018 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 import logging
22 22
23 23 from pyramid.view import view_config
24 24 from pyramid.httpexceptions import HTTPFound
25 25
26 26 from rhodecode.apps._base import RepoAppView
27 27 from rhodecode.lib import helpers as h
28 28 from rhodecode.lib import audit_logger
29 29 from rhodecode.lib.auth import (
30 30 LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired,
31 31 HasRepoPermissionAny)
32 32 from rhodecode.lib.exceptions import AttachedForksError
33 33 from rhodecode.lib.utils2 import safe_int
34 34 from rhodecode.lib.vcs import RepositoryError
35 35 from rhodecode.model.db import Session, UserFollowing, User, Repository
36 36 from rhodecode.model.repo import RepoModel
37 37 from rhodecode.model.scm import ScmModel
38 38
39 39 log = logging.getLogger(__name__)
40 40
41 41
42 42 class RepoSettingsView(RepoAppView):
43 43
44 44 def load_default_context(self):
45 45 c = self._get_local_tmpl_context()
46
47
48 46 return c
49 47
50 48 @LoginRequired()
51 49 @HasRepoPermissionAnyDecorator('repository.admin')
52 50 @view_config(
53 51 route_name='edit_repo_advanced', request_method='GET',
54 52 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
55 53 def edit_advanced(self):
56 54 c = self.load_default_context()
57 55 c.active = 'advanced'
58 56
59 57 c.default_user_id = User.get_default_user().user_id
60 58 c.in_public_journal = UserFollowing.query() \
61 59 .filter(UserFollowing.user_id == c.default_user_id) \
62 60 .filter(UserFollowing.follows_repository == self.db_repo).scalar()
63 61
64 62 c.has_origin_repo_read_perm = False
65 63 if self.db_repo.fork:
66 64 c.has_origin_repo_read_perm = h.HasRepoPermissionAny(
67 65 'repository.write', 'repository.read', 'repository.admin')(
68 66 self.db_repo.fork.repo_name, 'repo set as fork page')
69 67
70 68 return self._get_template_context(c)
71 69
72 70 @LoginRequired()
73 71 @HasRepoPermissionAnyDecorator('repository.admin')
74 72 @CSRFRequired()
75 73 @view_config(
76 74 route_name='edit_repo_advanced_delete', request_method='POST',
77 75 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
78 76 def edit_advanced_delete(self):
79 77 """
80 78 Deletes the repository, or shows warnings if deletion is not possible
81 79 because of attached forks or other errors.
82 80 """
83 81 _ = self.request.translate
84 82 handle_forks = self.request.POST.get('forks', None)
85 83
86 84 try:
87 85 _forks = self.db_repo.forks.count()
88 86 if _forks and handle_forks:
89 87 if handle_forks == 'detach_forks':
90 88 handle_forks = 'detach'
91 89 h.flash(_('Detached %s forks') % _forks, category='success')
92 90 elif handle_forks == 'delete_forks':
93 91 handle_forks = 'delete'
94 92 h.flash(_('Deleted %s forks') % _forks, category='success')
95 93
96 94 old_data = self.db_repo.get_api_data()
97 95 RepoModel().delete(self.db_repo, forks=handle_forks)
98 96
99 97 repo = audit_logger.RepoWrap(repo_id=None,
100 98 repo_name=self.db_repo.repo_name)
101 99 audit_logger.store_web(
102 100 'repo.delete', action_data={'old_data': old_data},
103 101 user=self._rhodecode_user, repo=repo)
104 102
105 103 ScmModel().mark_for_invalidation(self.db_repo_name, delete=True)
106 104 h.flash(
107 105 _('Deleted repository `%s`') % self.db_repo_name,
108 106 category='success')
109 107 Session().commit()
110 108 except AttachedForksError:
111 109 repo_advanced_url = h.route_path(
112 110 'edit_repo_advanced', repo_name=self.db_repo_name,
113 111 _anchor='advanced-delete')
114 112 delete_anchor = h.link_to(_('detach or delete'), repo_advanced_url)
115 113 h.flash(_('Cannot delete `{repo}` it still contains attached forks. '
116 114 'Try using {delete_or_detach} option.')
117 115 .format(repo=self.db_repo_name, delete_or_detach=delete_anchor),
118 116 category='warning')
119 117
120 118 # redirect to advanced for forks handle action ?
121 119 raise HTTPFound(repo_advanced_url)
122 120
123 121 except Exception:
124 122 log.exception("Exception during deletion of repository")
125 123 h.flash(_('An error occurred during deletion of `%s`')
126 124 % self.db_repo_name, category='error')
127 125 # redirect to advanced for more deletion options
128 126 raise HTTPFound(
129 127 h.route_path('edit_repo_advanced', repo_name=self.db_repo_name,
130 128 _anchor='advanced-delete'))
131 129
132 130 raise HTTPFound(h.route_path('home'))
133 131
134 132 @LoginRequired()
135 133 @HasRepoPermissionAnyDecorator('repository.admin')
136 134 @CSRFRequired()
137 135 @view_config(
138 136 route_name='edit_repo_advanced_journal', request_method='POST',
139 137 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
140 138 def edit_advanced_journal(self):
141 139 """
142 140 Set's this repository to be visible in public journal,
143 141 in other words making default user to follow this repo
144 142 """
145 143 _ = self.request.translate
146 144
147 145 try:
148 146 user_id = User.get_default_user().user_id
149 147 ScmModel().toggle_following_repo(self.db_repo.repo_id, user_id)
150 148 h.flash(_('Updated repository visibility in public journal'),
151 149 category='success')
152 150 Session().commit()
153 151 except Exception:
154 152 h.flash(_('An error occurred during setting this '
155 153 'repository in public journal'),
156 154 category='error')
157 155
158 156 raise HTTPFound(
159 157 h.route_path('edit_repo_advanced', repo_name=self.db_repo_name))
160 158
161 159 @LoginRequired()
162 160 @HasRepoPermissionAnyDecorator('repository.admin')
163 161 @CSRFRequired()
164 162 @view_config(
165 163 route_name='edit_repo_advanced_fork', request_method='POST',
166 164 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
167 165 def edit_advanced_fork(self):
168 166 """
169 167 Mark given repository as a fork of another
170 168 """
171 169 _ = self.request.translate
172 170
173 171 new_fork_id = safe_int(self.request.POST.get('id_fork_of'))
174 172
175 173 # valid repo, re-check permissions
176 174 if new_fork_id:
177 175 repo = Repository.get(new_fork_id)
178 176 # ensure we have at least read access to the repo we mark
179 177 perm_check = HasRepoPermissionAny(
180 178 'repository.read', 'repository.write', 'repository.admin')
181 179
182 180 if repo and perm_check(repo_name=repo.repo_name):
183 181 new_fork_id = repo.repo_id
184 182 else:
185 183 new_fork_id = None
186 184
187 185 try:
188 186 repo = ScmModel().mark_as_fork(
189 187 self.db_repo_name, new_fork_id, self._rhodecode_user.user_id)
190 188 fork = repo.fork.repo_name if repo.fork else _('Nothing')
191 189 Session().commit()
192 190 h.flash(
193 191 _('Marked repo %s as fork of %s') % (self.db_repo_name, fork),
194 192 category='success')
195 193 except RepositoryError as e:
196 194 log.exception("Repository Error occurred")
197 195 h.flash(str(e), category='error')
198 196 except Exception:
199 197 log.exception("Exception while editing fork")
200 198 h.flash(_('An error occurred during this operation'),
201 199 category='error')
202 200
203 201 raise HTTPFound(
204 202 h.route_path('edit_repo_advanced', repo_name=self.db_repo_name))
205 203
206 204 @LoginRequired()
207 205 @HasRepoPermissionAnyDecorator('repository.admin')
208 206 @CSRFRequired()
209 207 @view_config(
210 208 route_name='edit_repo_advanced_locking', request_method='POST',
211 209 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
212 210 def edit_advanced_locking(self):
213 211 """
214 212 Toggle locking of repository
215 213 """
216 214 _ = self.request.translate
217 215 set_lock = self.request.POST.get('set_lock')
218 216 set_unlock = self.request.POST.get('set_unlock')
219 217
220 218 try:
221 219 if set_lock:
222 220 Repository.lock(self.db_repo, self._rhodecode_user.user_id,
223 221 lock_reason=Repository.LOCK_WEB)
224 222 h.flash(_('Locked repository'), category='success')
225 223 elif set_unlock:
226 224 Repository.unlock(self.db_repo)
227 225 h.flash(_('Unlocked repository'), category='success')
228 226 except Exception as e:
229 227 log.exception("Exception during unlocking")
230 228 h.flash(_('An error occurred during unlocking'), category='error')
231 229
232 230 raise HTTPFound(
233 231 h.route_path('edit_repo_advanced', repo_name=self.db_repo_name))
232
233 @LoginRequired()
234 @HasRepoPermissionAnyDecorator('repository.admin')
235 @view_config(
236 route_name='edit_repo_advanced_hooks', request_method='GET',
237 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
238 def edit_advanced_install_hooks(self):
239 """
240 Install Hooks for repository
241 """
242 _ = self.request.translate
243 self.load_default_context()
244 self.rhodecode_vcs_repo.install_hooks(force=True)
245 h.flash(_('installed hooks repository'), category='success')
246 raise HTTPFound(
247 h.route_path('edit_repo_advanced', repo_name=self.db_repo_name))
General Comments 0
You need to be logged in to leave comments. Login now