comparison rhodecode/controllers/settings.py @ 1722:e7eef7a1db6a beta

#235 forking page repo group selection - group is selected as parent repo - refactoring of session behavior to get more atomic operations in models
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 26 Nov 2011 00:11:32 +0200
parents 2c0d35e336b5
children 8ecc6b8229a5
comparison
equal deleted inserted replaced
1721:05dbebede0d8 1722:e7eef7a1db6a
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 RepoGroup 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 = RepoGroup.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'))