##// END OF EJS Templates
permission fixes for forking
marcink -
r1060:97ed582e beta
parent child Browse files
Show More
@@ -1,206 +1,208 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.controllers.settings
4 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 5
6 6 Settings controller for rhodecode
7 7
8 8 :created_on: Jun 30, 2010
9 9 :author: marcink
10 10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 11 :license: GPLv3, see COPYING for more details.
12 12 """
13 13 # This program is free software; you can redistribute it and/or
14 14 # modify it under the terms of the GNU General Public License
15 15 # as published by the Free Software Foundation; version 2
16 16 # of the License or (at your opinion) any later version of the license.
17 17 #
18 18 # This program is distributed in the hope that it will be useful,
19 19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 21 # GNU General Public License for more details.
22 22 #
23 23 # You should have received a copy of the GNU General Public License
24 24 # along with this program; if not, write to the Free Software
25 25 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
26 26 # MA 02110-1301, USA.
27 27
28 28 import logging
29 29 import traceback
30 30
31 31 import formencode
32 32
33 33 from pylons import tmpl_context as c, request, url
34 34 from pylons.controllers.util import redirect
35 35 from pylons.i18n.translation import _
36 36
37 37 import rhodecode.lib.helpers as h
38 38
39 39 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAllDecorator, \
40 NotAnonymous
40 HasRepoPermissionAnyDecorator, NotAnonymous
41 41 from rhodecode.lib.base import BaseRepoController, render
42 42 from rhodecode.lib.utils import invalidate_cache, action_logger
43 43
44 44 from rhodecode.model.forms import RepoSettingsForm, RepoForkForm
45 45 from rhodecode.model.repo import RepoModel
46 46 from rhodecode.model.db import User
47 47
48 48 log = logging.getLogger(__name__)
49 49
50 50 class SettingsController(BaseRepoController):
51 51
52 52 @LoginRequired()
53 53 def __before__(self):
54 54 super(SettingsController, self).__before__()
55 55
56 56 @HasRepoPermissionAllDecorator('repository.admin')
57 57 def index(self, repo_name):
58 58 repo_model = RepoModel()
59 59 c.repo_info = repo = repo_model.get_by_repo_name(repo_name)
60 60 if not repo:
61 61 h.flash(_('%s repository is not mapped to db perhaps'
62 62 ' it was created or renamed from the file system'
63 63 ' please run the application again'
64 64 ' in order to rescan repositories') % repo_name,
65 65 category='error')
66 66
67 67 return redirect(url('home'))
68 68
69 69 c.users_array = repo_model.get_users_js()
70 70 c.users_groups_array = repo_model.get_users_groups_js()
71 71
72 72 defaults = c.repo_info.get_dict()
73 73
74 74 #fill owner
75 75 if c.repo_info.user:
76 76 defaults.update({'user':c.repo_info.user.username})
77 77 else:
78 78 replacement_user = self.sa.query(User)\
79 79 .filter(User.admin == True).first().username
80 80 defaults.update({'user':replacement_user})
81 81
82 82 #fill repository users
83 83 for p in c.repo_info.repo_to_perm:
84 84 defaults.update({'u_perm_%s' % p.user.username:
85 85 p.permission.permission_name})
86 86
87 87 #fill repository groups
88 88 for p in c.repo_info.users_group_to_perm:
89 89 defaults.update({'g_perm_%s' % p.users_group.users_group_name:
90 90 p.permission.permission_name})
91 91
92 92 return formencode.htmlfill.render(
93 93 render('settings/repo_settings.html'),
94 94 defaults=defaults,
95 95 encoding="UTF-8",
96 96 force_defaults=False
97 97 )
98 98
99 99 @HasRepoPermissionAllDecorator('repository.admin')
100 100 def update(self, repo_name):
101 101 repo_model = RepoModel()
102 102 changed_name = repo_name
103 103 _form = RepoSettingsForm(edit=True, old_data={'repo_name':repo_name})()
104 104 try:
105 105 form_result = _form.to_python(dict(request.POST))
106 106 repo_model.update(repo_name, form_result)
107 107 invalidate_cache('get_repo_cached_%s' % repo_name)
108 108 h.flash(_('Repository %s updated successfully' % repo_name),
109 109 category='success')
110 110 changed_name = form_result['repo_name']
111 111 action_logger(self.rhodecode_user, 'user_updated_repo',
112 112 changed_name, '', self.sa)
113 113 except formencode.Invalid, errors:
114 114 c.repo_info = repo_model.get_by_repo_name(repo_name)
115 115 c.users_array = repo_model.get_users_js()
116 116 errors.value.update({'user':c.repo_info.user.username})
117 117 return formencode.htmlfill.render(
118 118 render('settings/repo_settings.html'),
119 119 defaults=errors.value,
120 120 errors=errors.error_dict or {},
121 121 prefix_error=False,
122 122 encoding="UTF-8")
123 123 except Exception:
124 124 log.error(traceback.format_exc())
125 125 h.flash(_('error occurred during update of repository %s') \
126 126 % repo_name, category='error')
127 127
128 128 return redirect(url('repo_settings_home', repo_name=changed_name))
129 129
130 130
131 131 @HasRepoPermissionAllDecorator('repository.admin')
132 132 def delete(self, repo_name):
133 133 """DELETE /repos/repo_name: Delete an existing item"""
134 134 # Forms posted to this method should contain a hidden field:
135 135 # <input type="hidden" name="_method" value="DELETE" />
136 136 # Or using helpers:
137 137 # h.form(url('repo_settings_delete', repo_name=ID),
138 138 # method='delete')
139 139 # url('repo_settings_delete', repo_name=ID)
140 140
141 141 repo_model = RepoModel()
142 142 repo = repo_model.get_by_repo_name(repo_name)
143 143 if not repo:
144 144 h.flash(_('%s repository is not mapped to db perhaps'
145 145 ' it was moved or renamed from the filesystem'
146 146 ' please run the application again'
147 147 ' in order to rescan repositories') % repo_name,
148 148 category='error')
149 149
150 150 return redirect(url('home'))
151 151 try:
152 152 action_logger(self.rhodecode_user, 'user_deleted_repo',
153 153 repo_name, '', self.sa)
154 154 repo_model.delete(repo)
155 155 invalidate_cache('get_repo_cached_%s' % repo_name)
156 156 h.flash(_('deleted repository %s') % repo_name, category='success')
157 157 except Exception:
158 158 h.flash(_('An error occurred during deletion of %s') % repo_name,
159 159 category='error')
160 160
161 161 return redirect(url('home'))
162 162
163 163 @NotAnonymous()
164 @HasRepoPermissionAllDecorator('repository.read')
164 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
165 'repository.admin')
165 166 def fork(self, repo_name):
166 167 repo_model = RepoModel()
167 168 c.repo_info = repo = repo_model.get_by_repo_name(repo_name)
168 169 if not repo:
169 170 h.flash(_('%s repository is not mapped to db perhaps'
170 171 ' it was created or renamed from the file system'
171 172 ' please run the application again'
172 173 ' in order to rescan repositories') % repo_name,
173 174 category='error')
174 175
175 176 return redirect(url('home'))
176 177
177 178 return render('settings/repo_fork.html')
178 179
179 180 @NotAnonymous()
180 @HasRepoPermissionAllDecorator('repository.read')
181 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
182 'repository.admin')
181 183 def fork_create(self, repo_name):
182 184 repo_model = RepoModel()
183 185 c.repo_info = repo_model.get_by_repo_name(repo_name)
184 186 _form = RepoForkForm(old_data={'repo_type':c.repo_info.repo_type})()
185 187 form_result = {}
186 188 try:
187 189 form_result = _form.to_python(dict(request.POST))
188 190 form_result.update({'repo_name':repo_name})
189 191 repo_model.create_fork(form_result, c.rhodecode_user)
190 192 h.flash(_('forked %s repository as %s') \
191 193 % (repo_name, form_result['fork_name']),
192 194 category='success')
193 195 action_logger(self.rhodecode_user,
194 196 'user_forked_repo:%s' % form_result['fork_name'],
195 197 repo_name, '', self.sa)
196 198 except formencode.Invalid, errors:
197 199 c.new_repo = errors.value['fork_name']
198 200 r = render('settings/repo_fork.html')
199 201
200 202 return formencode.htmlfill.render(
201 203 r,
202 204 defaults=errors.value,
203 205 errors=errors.error_dict or {},
204 206 prefix_error=False,
205 207 encoding="UTF-8")
206 208 return redirect(url('home'))
General Comments 0
You need to be logged in to leave comments. Login now