comparison rhodecode/controllers/settings.py @ 2031:82a88013a3fd

merge 1.3 into stable
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 26 Feb 2012 17:25:09 +0200
parents 95c3e33ef32e 89efedac4e6c
children 63e58ef80ef1
comparison
equal deleted inserted replaced
2005:ab0e122b38a7 2031:82a88013a3fd
5 5
6 Settings controller for rhodecode 6 Settings controller for rhodecode
7 7
8 :created_on: Jun 30, 2010 8 :created_on: Jun 30, 2010
9 :author: marcink 9 :author: marcink
10 :copyright: (C) 2009-2011 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
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 35
36 import rhodecode.lib.helpers as h 36 import rhodecode.lib.helpers as h
37 37
38 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAllDecorator, \ 38 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAllDecorator
39 HasRepoPermissionAnyDecorator, NotAnonymous
40 from rhodecode.lib.base import BaseRepoController, render 39 from rhodecode.lib.base import BaseRepoController, render
41 from rhodecode.lib.utils import invalidate_cache, action_logger 40 from rhodecode.lib.utils import invalidate_cache, action_logger
42 41
43 from rhodecode.model.forms import RepoSettingsForm, RepoForkForm 42 from rhodecode.model.forms import RepoSettingsForm
44 from rhodecode.model.repo import RepoModel 43 from rhodecode.model.repo import RepoModel
45 from rhodecode.model.db import Group 44 from rhodecode.model.db import RepoGroup
45 from rhodecode.model.meta import Session
46 46
47 log = logging.getLogger(__name__) 47 log = logging.getLogger(__name__)
48 48
49 49
50 class SettingsController(BaseRepoController): 50 class SettingsController(BaseRepoController):
51 51
52 @LoginRequired() 52 @LoginRequired()
53 def __before__(self): 53 def __before__(self):
54 super(SettingsController, self).__before__() 54 super(SettingsController, self).__before__()
55 55
56 def __load_defaults(self): 56 def __load_defaults(self):
57 c.repo_groups = Group.groups_choices() 57 c.repo_groups = RepoGroup.groups_choices()
58 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups) 58 c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
59 59
60 repo_model = RepoModel() 60 repo_model = RepoModel()
61 c.users_array = repo_model.get_users_js() 61 c.users_array = repo_model.get_users_js()
62 c.users_groups_array = repo_model.get_users_groups_js() 62 c.users_groups_array = repo_model.get_users_groups_js()
63 63
64 @HasRepoPermissionAllDecorator('repository.admin') 64 @HasRepoPermissionAllDecorator('repository.admin')
65 def index(self, repo_name): 65 def index(self, repo_name):
66 repo_model = RepoModel() 66 repo_model = RepoModel()
67 c.repo_info = repo = repo_model.get_by_repo_name(repo_name) 67 c.repo_info = repo = repo_model.get_by_repo_name(repo_name)
68 if not repo: 68 if not repo:
87 87
88 @HasRepoPermissionAllDecorator('repository.admin') 88 @HasRepoPermissionAllDecorator('repository.admin')
89 def update(self, repo_name): 89 def update(self, repo_name):
90 repo_model = RepoModel() 90 repo_model = RepoModel()
91 changed_name = repo_name 91 changed_name = repo_name
92 92
93 self.__load_defaults() 93 self.__load_defaults()
94 94
95 _form = RepoSettingsForm(edit=True, 95 _form = RepoSettingsForm(edit=True,
96 old_data={'repo_name': repo_name}, 96 old_data={'repo_name': repo_name},
97 repo_groups=c.repo_groups_choices)() 97 repo_groups=c.repo_groups_choices)()
98 try: 98 try:
99 form_result = _form.to_python(dict(request.POST)) 99 form_result = _form.to_python(dict(request.POST))
100 100
101 repo_model.update(repo_name, form_result) 101 repo_model.update(repo_name, form_result)
102 invalidate_cache('get_repo_cached_%s' % repo_name) 102 invalidate_cache('get_repo_cached_%s' % repo_name)
103 h.flash(_('Repository %s updated successfully' % repo_name), 103 h.flash(_('Repository %s updated successfully' % repo_name),
104 category='success') 104 category='success')
105 changed_name = form_result['repo_name_full'] 105 changed_name = form_result['repo_name_full']
106 action_logger(self.rhodecode_user, 'user_updated_repo', 106 action_logger(self.rhodecode_user, 'user_updated_repo',
107 changed_name, '', self.sa) 107 changed_name, '', self.sa)
108 Session.commit()
108 except formencode.Invalid, errors: 109 except formencode.Invalid, errors:
109 c.repo_info = repo_model.get_by_repo_name(repo_name) 110 c.repo_info = repo_model.get_by_repo_name(repo_name)
110 c.users_array = repo_model.get_users_js() 111 c.users_array = repo_model.get_users_js()
111 errors.value.update({'user': c.repo_info.user.username}) 112 errors.value.update({'user': c.repo_info.user.username})
112 return htmlfill.render( 113 return htmlfill.render(
146 action_logger(self.rhodecode_user, 'user_deleted_repo', 147 action_logger(self.rhodecode_user, 'user_deleted_repo',
147 repo_name, '', self.sa) 148 repo_name, '', self.sa)
148 repo_model.delete(repo) 149 repo_model.delete(repo)
149 invalidate_cache('get_repo_cached_%s' % repo_name) 150 invalidate_cache('get_repo_cached_%s' % repo_name)
150 h.flash(_('deleted repository %s') % repo_name, category='success') 151 h.flash(_('deleted repository %s') % repo_name, category='success')
152 Session.commit()
151 except Exception: 153 except Exception:
152 log.error(traceback.format_exc()) 154 log.error(traceback.format_exc())
153 h.flash(_('An error occurred during deletion of %s') % repo_name, 155 h.flash(_('An error occurred during deletion of %s') % repo_name,
154 category='error') 156 category='error')
155 157
156 return redirect(url('home')) 158 return redirect(url('home'))
157
158 @NotAnonymous()
159 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
160 'repository.admin')
161 def fork(self, repo_name):
162 repo_model = RepoModel()
163 c.repo_info = repo = repo_model.get_by_repo_name(repo_name)
164 if not repo:
165 h.flash(_('%s repository is not mapped to db perhaps'
166 ' it was created or renamed from the file system'
167 ' please run the application again'
168 ' in order to rescan repositories') % repo_name,
169 category='error')
170
171 return redirect(url('home'))
172
173 return render('settings/repo_fork.html')
174
175 @NotAnonymous()
176 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
177 'repository.admin')
178 def fork_create(self, repo_name):
179 repo_model = RepoModel()
180 c.repo_info = repo_model.get_by_repo_name(repo_name)
181 _form = RepoForkForm(old_data={'repo_type': c.repo_info.repo_type})()
182 form_result = {}
183 try:
184 form_result = _form.to_python(dict(request.POST))
185 form_result.update({'repo_name': repo_name})
186 repo_model.create_fork(form_result, self.rhodecode_user)
187 h.flash(_('forked %s repository as %s') \
188 % (repo_name, form_result['fork_name']),
189 category='success')
190 action_logger(self.rhodecode_user,
191 'user_forked_repo:%s' % form_result['fork_name'],
192 repo_name, '', self.sa)
193 except formencode.Invalid, errors:
194 c.new_repo = errors.value['fork_name']
195 r = render('settings/repo_fork.html')
196
197 return htmlfill.render(
198 r,
199 defaults=errors.value,
200 errors=errors.error_dict or {},
201 prefix_error=False,
202 encoding="UTF-8")
203 except Exception:
204 log.error(traceback.format_exc())
205 h.flash(_('An error occurred during repository forking %s') %
206 repo_name, category='error')
207
208 return redirect(url('home'))