##// END OF EJS Templates
redirect to summary page after repo was created
marcink -
r2660:98532710 beta
parent child Browse files
Show More
@@ -1,448 +1,448 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.controllers.admin.repos
3 rhodecode.controllers.admin.repos
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 Repositories controller for RhodeCode
6 Repositories controller for RhodeCode
7
7
8 :created_on: Apr 7, 2010
8 :created_on: Apr 7, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation, either version 3 of the License, or
15 # the Free Software Foundation, either version 3 of the License, or
16 # (at your option) any later version.
16 # (at your option) any later version.
17 #
17 #
18 # This program is distributed in the hope that it will be useful,
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
21 # GNU General Public License for more details.
22 #
22 #
23 # You should have received a copy of the GNU General Public License
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25
25
26 import logging
26 import logging
27 import traceback
27 import traceback
28 import formencode
28 import formencode
29 from formencode import htmlfill
29 from formencode import htmlfill
30
30
31 from webob.exc import HTTPInternalServerError
31 from webob.exc import HTTPInternalServerError
32 from pylons import request, session, tmpl_context as c, url
32 from pylons import request, session, tmpl_context as c, url
33 from pylons.controllers.util import redirect
33 from pylons.controllers.util import redirect
34 from pylons.i18n.translation import _
34 from pylons.i18n.translation import _
35 from sqlalchemy.exc import IntegrityError
35 from sqlalchemy.exc import IntegrityError
36
36
37 from rhodecode.lib import helpers as h
37 from rhodecode.lib import helpers as h
38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
38 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
39 HasPermissionAnyDecorator, HasRepoPermissionAllDecorator
39 HasPermissionAnyDecorator, HasRepoPermissionAllDecorator
40 from rhodecode.lib.base import BaseController, render
40 from rhodecode.lib.base import BaseController, render
41 from rhodecode.lib.utils import invalidate_cache, action_logger, repo_name_slug
41 from rhodecode.lib.utils import invalidate_cache, action_logger, repo_name_slug
42 from rhodecode.lib.helpers import get_token
42 from rhodecode.lib.helpers import get_token
43 from rhodecode.model.meta import Session
43 from rhodecode.model.meta import Session
44 from rhodecode.model.db import User, Repository, UserFollowing, RepoGroup
44 from rhodecode.model.db import User, Repository, UserFollowing, RepoGroup
45 from rhodecode.model.forms import RepoForm
45 from rhodecode.model.forms import RepoForm
46 from rhodecode.model.scm import ScmModel
46 from rhodecode.model.scm import ScmModel
47 from rhodecode.model.repo import RepoModel
47 from rhodecode.model.repo import RepoModel
48
48
49 log = logging.getLogger(__name__)
49 log = logging.getLogger(__name__)
50
50
51
51
52 class ReposController(BaseController):
52 class ReposController(BaseController):
53 """
53 """
54 REST Controller styled on the Atom Publishing Protocol"""
54 REST Controller styled on the Atom Publishing Protocol"""
55 # To properly map this controller, ensure your config/routing.py
55 # To properly map this controller, ensure your config/routing.py
56 # file has a resource setup:
56 # file has a resource setup:
57 # map.resource('repo', 'repos')
57 # map.resource('repo', 'repos')
58
58
59 @LoginRequired()
59 @LoginRequired()
60 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
60 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
61 def __before__(self):
61 def __before__(self):
62 c.admin_user = session.get('admin_user')
62 c.admin_user = session.get('admin_user')
63 c.admin_username = session.get('admin_username')
63 c.admin_username = session.get('admin_username')
64 super(ReposController, self).__before__()
64 super(ReposController, self).__before__()
65
65
66 def __load_defaults(self):
66 def __load_defaults(self):
67 c.repo_groups = RepoGroup.groups_choices()
67 c.repo_groups = RepoGroup.groups_choices()
68 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
68 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
69
69
70 repo_model = RepoModel()
70 repo_model = RepoModel()
71 c.users_array = repo_model.get_users_js()
71 c.users_array = repo_model.get_users_js()
72 c.users_groups_array = repo_model.get_users_groups_js()
72 c.users_groups_array = repo_model.get_users_groups_js()
73 choices, c.landing_revs = ScmModel().get_repo_landing_revs()
73 choices, c.landing_revs = ScmModel().get_repo_landing_revs()
74 c.landing_revs_choices = choices
74 c.landing_revs_choices = choices
75
75
76 def __load_data(self, repo_name=None):
76 def __load_data(self, repo_name=None):
77 """
77 """
78 Load defaults settings for edit, and update
78 Load defaults settings for edit, and update
79
79
80 :param repo_name:
80 :param repo_name:
81 """
81 """
82 self.__load_defaults()
82 self.__load_defaults()
83
83
84 c.repo_info = db_repo = Repository.get_by_repo_name(repo_name)
84 c.repo_info = db_repo = Repository.get_by_repo_name(repo_name)
85 repo = db_repo.scm_instance
85 repo = db_repo.scm_instance
86
86
87 if c.repo_info is None:
87 if c.repo_info is None:
88 h.flash(_('%s repository is not mapped to db perhaps'
88 h.flash(_('%s repository is not mapped to db perhaps'
89 ' it was created or renamed from the filesystem'
89 ' it was created or renamed from the filesystem'
90 ' please run the application again'
90 ' please run the application again'
91 ' in order to rescan repositories') % repo_name,
91 ' in order to rescan repositories') % repo_name,
92 category='error')
92 category='error')
93
93
94 return redirect(url('repos'))
94 return redirect(url('repos'))
95
95
96 choices, c.landing_revs = ScmModel().get_repo_landing_revs(c.repo_info)
96 choices, c.landing_revs = ScmModel().get_repo_landing_revs(c.repo_info)
97 c.landing_revs_choices = choices
97 c.landing_revs_choices = choices
98
98
99 c.default_user_id = User.get_by_username('default').user_id
99 c.default_user_id = User.get_by_username('default').user_id
100 c.in_public_journal = UserFollowing.query()\
100 c.in_public_journal = UserFollowing.query()\
101 .filter(UserFollowing.user_id == c.default_user_id)\
101 .filter(UserFollowing.user_id == c.default_user_id)\
102 .filter(UserFollowing.follows_repository == c.repo_info).scalar()
102 .filter(UserFollowing.follows_repository == c.repo_info).scalar()
103
103
104 if c.repo_info.stats:
104 if c.repo_info.stats:
105 # this is on what revision we ended up so we add +1 for count
105 # this is on what revision we ended up so we add +1 for count
106 last_rev = c.repo_info.stats.stat_on_revision + 1
106 last_rev = c.repo_info.stats.stat_on_revision + 1
107 else:
107 else:
108 last_rev = 0
108 last_rev = 0
109 c.stats_revision = last_rev
109 c.stats_revision = last_rev
110
110
111 c.repo_last_rev = repo.count() if repo.revisions else 0
111 c.repo_last_rev = repo.count() if repo.revisions else 0
112
112
113 if last_rev == 0 or c.repo_last_rev == 0:
113 if last_rev == 0 or c.repo_last_rev == 0:
114 c.stats_percentage = 0
114 c.stats_percentage = 0
115 else:
115 else:
116 c.stats_percentage = '%.2f' % ((float((last_rev)) /
116 c.stats_percentage = '%.2f' % ((float((last_rev)) /
117 c.repo_last_rev) * 100)
117 c.repo_last_rev) * 100)
118
118
119 defaults = RepoModel()._get_defaults(repo_name)
119 defaults = RepoModel()._get_defaults(repo_name)
120
120
121 c.repos_list = [('', _('--REMOVE FORK--'))]
121 c.repos_list = [('', _('--REMOVE FORK--'))]
122 c.repos_list += [(x.repo_id, x.repo_name) for x in
122 c.repos_list += [(x.repo_id, x.repo_name) for x in
123 Repository.query().order_by(Repository.repo_name).all()
123 Repository.query().order_by(Repository.repo_name).all()
124 if x.repo_id != c.repo_info.repo_id]
124 if x.repo_id != c.repo_info.repo_id]
125
125
126 defaults['id_fork_of'] = db_repo.fork.repo_id if db_repo.fork else ''
126 defaults['id_fork_of'] = db_repo.fork.repo_id if db_repo.fork else ''
127 return defaults
127 return defaults
128
128
129 @HasPermissionAllDecorator('hg.admin')
129 @HasPermissionAllDecorator('hg.admin')
130 def index(self, format='html'):
130 def index(self, format='html'):
131 """GET /repos: All items in the collection"""
131 """GET /repos: All items in the collection"""
132 # url('repos')
132 # url('repos')
133
133
134 c.repos_list = ScmModel().get_repos(Repository.query()
134 c.repos_list = ScmModel().get_repos(Repository.query()
135 .order_by(Repository.repo_name)
135 .order_by(Repository.repo_name)
136 .all(), sort_key='name_sort')
136 .all(), sort_key='name_sort')
137 return render('admin/repos/repos.html')
137 return render('admin/repos/repos.html')
138
138
139 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
139 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
140 def create(self):
140 def create(self):
141 """
141 """
142 POST /repos: Create a new item"""
142 POST /repos: Create a new item"""
143 # url('repos')
143 # url('repos')
144
144
145 self.__load_defaults()
145 self.__load_defaults()
146 form_result = {}
146 form_result = {}
147 try:
147 try:
148 form_result = RepoForm(repo_groups=c.repo_groups_choices,
148 form_result = RepoForm(repo_groups=c.repo_groups_choices,
149 landing_revs=c.landing_revs_choices)()\
149 landing_revs=c.landing_revs_choices)()\
150 .to_python(dict(request.POST))
150 .to_python(dict(request.POST))
151 RepoModel().create(form_result, self.rhodecode_user.user_id)
151 new_repo = RepoModel().create(form_result,
152 self.rhodecode_user.user_id)
152 if form_result['clone_uri']:
153 if form_result['clone_uri']:
153 h.flash(_('created repository %s from %s') \
154 h.flash(_('created repository %s from %s') \
154 % (form_result['repo_name'], form_result['clone_uri']),
155 % (form_result['repo_name'], form_result['clone_uri']),
155 category='success')
156 category='success')
156 else:
157 else:
157 h.flash(_('created repository %s') % form_result['repo_name'],
158 h.flash(_('created repository %s') % form_result['repo_name'],
158 category='success')
159 category='success')
159
160
160 if request.POST.get('user_created'):
161 if request.POST.get('user_created'):
161 # created by regular non admin user
162 # created by regular non admin user
162 action_logger(self.rhodecode_user, 'user_created_repo',
163 action_logger(self.rhodecode_user, 'user_created_repo',
163 form_result['repo_name_full'], self.ip_addr,
164 form_result['repo_name_full'], self.ip_addr,
164 self.sa)
165 self.sa)
165 else:
166 else:
166 action_logger(self.rhodecode_user, 'admin_created_repo',
167 action_logger(self.rhodecode_user, 'admin_created_repo',
167 form_result['repo_name_full'], self.ip_addr,
168 form_result['repo_name_full'], self.ip_addr,
168 self.sa)
169 self.sa)
169 Session.commit()
170 Session.commit()
170 except formencode.Invalid, errors:
171 except formencode.Invalid, errors:
171
172
172 c.new_repo = errors.value['repo_name']
173 c.new_repo = errors.value['repo_name']
173
174
174 if request.POST.get('user_created'):
175 if request.POST.get('user_created'):
175 r = render('admin/repos/repo_add_create_repository.html')
176 r = render('admin/repos/repo_add_create_repository.html')
176 else:
177 else:
177 r = render('admin/repos/repo_add.html')
178 r = render('admin/repos/repo_add.html')
178
179
179 return htmlfill.render(
180 return htmlfill.render(
180 r,
181 r,
181 defaults=errors.value,
182 defaults=errors.value,
182 errors=errors.error_dict or {},
183 errors=errors.error_dict or {},
183 prefix_error=False,
184 prefix_error=False,
184 encoding="UTF-8")
185 encoding="UTF-8")
185
186
186 except Exception:
187 except Exception:
187 log.error(traceback.format_exc())
188 log.error(traceback.format_exc())
188 msg = _('error occurred during creation of repository %s') \
189 msg = _('error occurred during creation of repository %s') \
189 % form_result.get('repo_name')
190 % form_result.get('repo_name')
190 h.flash(msg, category='error')
191 h.flash(msg, category='error')
191 if request.POST.get('user_created'):
192 #redirect to our new repo !
192 return redirect(url('home'))
193 return redirect(url('summary_home', repo_name=new_repo.repo_name))
193 return redirect(url('repos'))
194
194
195 @HasPermissionAllDecorator('hg.admin')
195 @HasPermissionAllDecorator('hg.admin')
196 def new(self, format='html'):
196 def new(self, format='html'):
197 """GET /repos/new: Form to create a new item"""
197 """GET /repos/new: Form to create a new item"""
198 new_repo = request.GET.get('repo', '')
198 new_repo = request.GET.get('repo', '')
199 c.new_repo = repo_name_slug(new_repo)
199 c.new_repo = repo_name_slug(new_repo)
200 self.__load_defaults()
200 self.__load_defaults()
201 return render('admin/repos/repo_add.html')
201 return render('admin/repos/repo_add.html')
202
202
203 @HasPermissionAllDecorator('hg.admin')
203 @HasPermissionAllDecorator('hg.admin')
204 def update(self, repo_name):
204 def update(self, repo_name):
205 """
205 """
206 PUT /repos/repo_name: Update an existing item"""
206 PUT /repos/repo_name: Update an existing item"""
207 # Forms posted to this method should contain a hidden field:
207 # Forms posted to this method should contain a hidden field:
208 # <input type="hidden" name="_method" value="PUT" />
208 # <input type="hidden" name="_method" value="PUT" />
209 # Or using helpers:
209 # Or using helpers:
210 # h.form(url('repo', repo_name=ID),
210 # h.form(url('repo', repo_name=ID),
211 # method='put')
211 # method='put')
212 # url('repo', repo_name=ID)
212 # url('repo', repo_name=ID)
213 self.__load_defaults()
213 self.__load_defaults()
214 repo_model = RepoModel()
214 repo_model = RepoModel()
215 changed_name = repo_name
215 changed_name = repo_name
216 #override the choices with extracted revisions !
216 #override the choices with extracted revisions !
217 choices, c.landing_revs = ScmModel().get_repo_landing_revs(repo_name)
217 choices, c.landing_revs = ScmModel().get_repo_landing_revs(repo_name)
218 c.landing_revs_choices = choices
218 c.landing_revs_choices = choices
219
219
220 _form = RepoForm(edit=True, old_data={'repo_name': repo_name},
220 _form = RepoForm(edit=True, old_data={'repo_name': repo_name},
221 repo_groups=c.repo_groups_choices,
221 repo_groups=c.repo_groups_choices,
222 landing_revs=c.landing_revs_choices)()
222 landing_revs=c.landing_revs_choices)()
223 try:
223 try:
224 form_result = _form.to_python(dict(request.POST))
224 form_result = _form.to_python(dict(request.POST))
225 repo = repo_model.update(repo_name, form_result)
225 repo = repo_model.update(repo_name, form_result)
226 invalidate_cache('get_repo_cached_%s' % repo_name)
226 invalidate_cache('get_repo_cached_%s' % repo_name)
227 h.flash(_('Repository %s updated successfully') % repo_name,
227 h.flash(_('Repository %s updated successfully') % repo_name,
228 category='success')
228 category='success')
229 changed_name = repo.repo_name
229 changed_name = repo.repo_name
230 action_logger(self.rhodecode_user, 'admin_updated_repo',
230 action_logger(self.rhodecode_user, 'admin_updated_repo',
231 changed_name, self.ip_addr, self.sa)
231 changed_name, self.ip_addr, self.sa)
232 Session.commit()
232 Session.commit()
233 except formencode.Invalid, errors:
233 except formencode.Invalid, errors:
234 defaults = self.__load_data(repo_name)
234 defaults = self.__load_data(repo_name)
235 defaults.update(errors.value)
235 defaults.update(errors.value)
236 return htmlfill.render(
236 return htmlfill.render(
237 render('admin/repos/repo_edit.html'),
237 render('admin/repos/repo_edit.html'),
238 defaults=defaults,
238 defaults=defaults,
239 errors=errors.error_dict or {},
239 errors=errors.error_dict or {},
240 prefix_error=False,
240 prefix_error=False,
241 encoding="UTF-8")
241 encoding="UTF-8")
242
242
243 except Exception:
243 except Exception:
244 log.error(traceback.format_exc())
244 log.error(traceback.format_exc())
245 h.flash(_('error occurred during update of repository %s') \
245 h.flash(_('error occurred during update of repository %s') \
246 % repo_name, category='error')
246 % repo_name, category='error')
247 return redirect(url('edit_repo', repo_name=changed_name))
247 return redirect(url('edit_repo', repo_name=changed_name))
248
248
249 @HasPermissionAllDecorator('hg.admin')
249 @HasPermissionAllDecorator('hg.admin')
250 def delete(self, repo_name):
250 def delete(self, repo_name):
251 """
251 """
252 DELETE /repos/repo_name: Delete an existing item"""
252 DELETE /repos/repo_name: Delete an existing item"""
253 # Forms posted to this method should contain a hidden field:
253 # Forms posted to this method should contain a hidden field:
254 # <input type="hidden" name="_method" value="DELETE" />
254 # <input type="hidden" name="_method" value="DELETE" />
255 # Or using helpers:
255 # Or using helpers:
256 # h.form(url('repo', repo_name=ID),
256 # h.form(url('repo', repo_name=ID),
257 # method='delete')
257 # method='delete')
258 # url('repo', repo_name=ID)
258 # url('repo', repo_name=ID)
259
259
260 repo_model = RepoModel()
260 repo_model = RepoModel()
261 repo = repo_model.get_by_repo_name(repo_name)
261 repo = repo_model.get_by_repo_name(repo_name)
262 if not repo:
262 if not repo:
263 h.flash(_('%s repository is not mapped to db perhaps'
263 h.flash(_('%s repository is not mapped to db perhaps'
264 ' it was moved or renamed from the filesystem'
264 ' it was moved or renamed from the filesystem'
265 ' please run the application again'
265 ' please run the application again'
266 ' in order to rescan repositories') % repo_name,
266 ' in order to rescan repositories') % repo_name,
267 category='error')
267 category='error')
268
268
269 return redirect(url('repos'))
269 return redirect(url('repos'))
270 try:
270 try:
271 action_logger(self.rhodecode_user, 'admin_deleted_repo',
271 action_logger(self.rhodecode_user, 'admin_deleted_repo',
272 repo_name, self.ip_addr, self.sa)
272 repo_name, self.ip_addr, self.sa)
273 repo_model.delete(repo)
273 repo_model.delete(repo)
274 invalidate_cache('get_repo_cached_%s' % repo_name)
274 invalidate_cache('get_repo_cached_%s' % repo_name)
275 h.flash(_('deleted repository %s') % repo_name, category='success')
275 h.flash(_('deleted repository %s') % repo_name, category='success')
276 Session.commit()
276 Session.commit()
277 except IntegrityError, e:
277 except IntegrityError, e:
278 if e.message.find('repositories_fork_id_fkey') != -1:
278 if e.message.find('repositories_fork_id_fkey') != -1:
279 log.error(traceback.format_exc())
279 log.error(traceback.format_exc())
280 h.flash(_('Cannot delete %s it still contains attached '
280 h.flash(_('Cannot delete %s it still contains attached '
281 'forks') % repo_name,
281 'forks') % repo_name,
282 category='warning')
282 category='warning')
283 else:
283 else:
284 log.error(traceback.format_exc())
284 log.error(traceback.format_exc())
285 h.flash(_('An error occurred during '
285 h.flash(_('An error occurred during '
286 'deletion of %s') % repo_name,
286 'deletion of %s') % repo_name,
287 category='error')
287 category='error')
288
288
289 except Exception, e:
289 except Exception, e:
290 log.error(traceback.format_exc())
290 log.error(traceback.format_exc())
291 h.flash(_('An error occurred during deletion of %s') % repo_name,
291 h.flash(_('An error occurred during deletion of %s') % repo_name,
292 category='error')
292 category='error')
293
293
294 return redirect(url('repos'))
294 return redirect(url('repos'))
295
295
296 @HasRepoPermissionAllDecorator('repository.admin')
296 @HasRepoPermissionAllDecorator('repository.admin')
297 def delete_perm_user(self, repo_name):
297 def delete_perm_user(self, repo_name):
298 """
298 """
299 DELETE an existing repository permission user
299 DELETE an existing repository permission user
300
300
301 :param repo_name:
301 :param repo_name:
302 """
302 """
303 try:
303 try:
304 RepoModel().revoke_user_permission(repo=repo_name,
304 RepoModel().revoke_user_permission(repo=repo_name,
305 user=request.POST['user_id'])
305 user=request.POST['user_id'])
306 Session.commit()
306 Session.commit()
307 except Exception:
307 except Exception:
308 log.error(traceback.format_exc())
308 log.error(traceback.format_exc())
309 h.flash(_('An error occurred during deletion of repository user'),
309 h.flash(_('An error occurred during deletion of repository user'),
310 category='error')
310 category='error')
311 raise HTTPInternalServerError()
311 raise HTTPInternalServerError()
312
312
313 @HasRepoPermissionAllDecorator('repository.admin')
313 @HasRepoPermissionAllDecorator('repository.admin')
314 def delete_perm_users_group(self, repo_name):
314 def delete_perm_users_group(self, repo_name):
315 """
315 """
316 DELETE an existing repository permission users group
316 DELETE an existing repository permission users group
317
317
318 :param repo_name:
318 :param repo_name:
319 """
319 """
320
320
321 try:
321 try:
322 RepoModel().revoke_users_group_permission(
322 RepoModel().revoke_users_group_permission(
323 repo=repo_name, group_name=request.POST['users_group_id']
323 repo=repo_name, group_name=request.POST['users_group_id']
324 )
324 )
325 Session.commit()
325 Session.commit()
326 except Exception:
326 except Exception:
327 log.error(traceback.format_exc())
327 log.error(traceback.format_exc())
328 h.flash(_('An error occurred during deletion of repository'
328 h.flash(_('An error occurred during deletion of repository'
329 ' users groups'),
329 ' users groups'),
330 category='error')
330 category='error')
331 raise HTTPInternalServerError()
331 raise HTTPInternalServerError()
332
332
333 @HasPermissionAllDecorator('hg.admin')
333 @HasPermissionAllDecorator('hg.admin')
334 def repo_stats(self, repo_name):
334 def repo_stats(self, repo_name):
335 """
335 """
336 DELETE an existing repository statistics
336 DELETE an existing repository statistics
337
337
338 :param repo_name:
338 :param repo_name:
339 """
339 """
340
340
341 try:
341 try:
342 RepoModel().delete_stats(repo_name)
342 RepoModel().delete_stats(repo_name)
343 Session.commit()
343 Session.commit()
344 except Exception, e:
344 except Exception, e:
345 h.flash(_('An error occurred during deletion of repository stats'),
345 h.flash(_('An error occurred during deletion of repository stats'),
346 category='error')
346 category='error')
347 return redirect(url('edit_repo', repo_name=repo_name))
347 return redirect(url('edit_repo', repo_name=repo_name))
348
348
349 @HasPermissionAllDecorator('hg.admin')
349 @HasPermissionAllDecorator('hg.admin')
350 def repo_cache(self, repo_name):
350 def repo_cache(self, repo_name):
351 """
351 """
352 INVALIDATE existing repository cache
352 INVALIDATE existing repository cache
353
353
354 :param repo_name:
354 :param repo_name:
355 """
355 """
356
356
357 try:
357 try:
358 ScmModel().mark_for_invalidation(repo_name)
358 ScmModel().mark_for_invalidation(repo_name)
359 Session.commit()
359 Session.commit()
360 except Exception, e:
360 except Exception, e:
361 h.flash(_('An error occurred during cache invalidation'),
361 h.flash(_('An error occurred during cache invalidation'),
362 category='error')
362 category='error')
363 return redirect(url('edit_repo', repo_name=repo_name))
363 return redirect(url('edit_repo', repo_name=repo_name))
364
364
365 @HasPermissionAllDecorator('hg.admin')
365 @HasPermissionAllDecorator('hg.admin')
366 def repo_public_journal(self, repo_name):
366 def repo_public_journal(self, repo_name):
367 """
367 """
368 Set's this repository to be visible in public journal,
368 Set's this repository to be visible in public journal,
369 in other words assing default user to follow this repo
369 in other words assing default user to follow this repo
370
370
371 :param repo_name:
371 :param repo_name:
372 """
372 """
373
373
374 cur_token = request.POST.get('auth_token')
374 cur_token = request.POST.get('auth_token')
375 token = get_token()
375 token = get_token()
376 if cur_token == token:
376 if cur_token == token:
377 try:
377 try:
378 repo_id = Repository.get_by_repo_name(repo_name).repo_id
378 repo_id = Repository.get_by_repo_name(repo_name).repo_id
379 user_id = User.get_by_username('default').user_id
379 user_id = User.get_by_username('default').user_id
380 self.scm_model.toggle_following_repo(repo_id, user_id)
380 self.scm_model.toggle_following_repo(repo_id, user_id)
381 h.flash(_('Updated repository visibility in public journal'),
381 h.flash(_('Updated repository visibility in public journal'),
382 category='success')
382 category='success')
383 Session.commit()
383 Session.commit()
384 except:
384 except:
385 h.flash(_('An error occurred during setting this'
385 h.flash(_('An error occurred during setting this'
386 ' repository in public journal'),
386 ' repository in public journal'),
387 category='error')
387 category='error')
388
388
389 else:
389 else:
390 h.flash(_('Token mismatch'), category='error')
390 h.flash(_('Token mismatch'), category='error')
391 return redirect(url('edit_repo', repo_name=repo_name))
391 return redirect(url('edit_repo', repo_name=repo_name))
392
392
393 @HasPermissionAllDecorator('hg.admin')
393 @HasPermissionAllDecorator('hg.admin')
394 def repo_pull(self, repo_name):
394 def repo_pull(self, repo_name):
395 """
395 """
396 Runs task to update given repository with remote changes,
396 Runs task to update given repository with remote changes,
397 ie. make pull on remote location
397 ie. make pull on remote location
398
398
399 :param repo_name:
399 :param repo_name:
400 """
400 """
401 try:
401 try:
402 ScmModel().pull_changes(repo_name, self.rhodecode_user.username)
402 ScmModel().pull_changes(repo_name, self.rhodecode_user.username)
403 h.flash(_('Pulled from remote location'), category='success')
403 h.flash(_('Pulled from remote location'), category='success')
404 except Exception, e:
404 except Exception, e:
405 h.flash(_('An error occurred during pull from remote location'),
405 h.flash(_('An error occurred during pull from remote location'),
406 category='error')
406 category='error')
407
407
408 return redirect(url('edit_repo', repo_name=repo_name))
408 return redirect(url('edit_repo', repo_name=repo_name))
409
409
410 @HasPermissionAllDecorator('hg.admin')
410 @HasPermissionAllDecorator('hg.admin')
411 def repo_as_fork(self, repo_name):
411 def repo_as_fork(self, repo_name):
412 """
412 """
413 Mark given repository as a fork of another
413 Mark given repository as a fork of another
414
414
415 :param repo_name:
415 :param repo_name:
416 """
416 """
417 try:
417 try:
418 fork_id = request.POST.get('id_fork_of')
418 fork_id = request.POST.get('id_fork_of')
419 repo = ScmModel().mark_as_fork(repo_name, fork_id,
419 repo = ScmModel().mark_as_fork(repo_name, fork_id,
420 self.rhodecode_user.username)
420 self.rhodecode_user.username)
421 fork = repo.fork.repo_name if repo.fork else _('Nothing')
421 fork = repo.fork.repo_name if repo.fork else _('Nothing')
422 Session().commit()
422 Session().commit()
423 h.flash(_('Marked repo %s as fork of %s') % (repo_name, fork),
423 h.flash(_('Marked repo %s as fork of %s') % (repo_name, fork),
424 category='success')
424 category='success')
425 except Exception, e:
425 except Exception, e:
426 log.error(traceback.format_exc())
426 log.error(traceback.format_exc())
427 h.flash(_('An error occurred during this operation'),
427 h.flash(_('An error occurred during this operation'),
428 category='error')
428 category='error')
429
429
430 return redirect(url('edit_repo', repo_name=repo_name))
430 return redirect(url('edit_repo', repo_name=repo_name))
431
431
432 @HasPermissionAllDecorator('hg.admin')
432 @HasPermissionAllDecorator('hg.admin')
433 def show(self, repo_name, format='html'):
433 def show(self, repo_name, format='html'):
434 """GET /repos/repo_name: Show a specific item"""
434 """GET /repos/repo_name: Show a specific item"""
435 # url('repo', repo_name=ID)
435 # url('repo', repo_name=ID)
436
436
437 @HasPermissionAllDecorator('hg.admin')
437 @HasPermissionAllDecorator('hg.admin')
438 def edit(self, repo_name, format='html'):
438 def edit(self, repo_name, format='html'):
439 """GET /repos/repo_name/edit: Form to edit an existing item"""
439 """GET /repos/repo_name/edit: Form to edit an existing item"""
440 # url('edit_repo', repo_name=ID)
440 # url('edit_repo', repo_name=ID)
441 defaults = self.__load_data(repo_name)
441 defaults = self.__load_data(repo_name)
442
442
443 return htmlfill.render(
443 return htmlfill.render(
444 render('admin/repos/repo_edit.html'),
444 render('admin/repos/repo_edit.html'),
445 defaults=defaults,
445 defaults=defaults,
446 encoding="UTF-8",
446 encoding="UTF-8",
447 force_defaults=False
447 force_defaults=False
448 )
448 )
General Comments 0
You need to be logged in to leave comments. Login now