##// END OF EJS Templates
some extra fixes added docs string
marcink -
r824:ceb9f419 beta
parent child Browse files
Show More
@@ -1,305 +1,312 b''
1 #!/usr/bin/env python
2 # encoding: utf-8
3 # repos controller for pylons
4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5 #
1 # -*- coding: utf-8 -*-
2 """
3 rhodecode.controllers.admin.repos
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
6 Admin controller for RhodeCode
7
8 :created_on: Apr 7, 2010
9 :author: marcink
10 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
12 """
6 13 # This program is free software; you can redistribute it and/or
7 14 # modify it under the terms of the GNU General Public License
8 15 # as published by the Free Software Foundation; version 2
9 16 # of the License or (at your opinion) any later version of the license.
10 17 #
11 18 # This program is distributed in the hope that it will be useful,
12 19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 21 # GNU General Public License for more details.
15 22 #
16 23 # You should have received a copy of the GNU General Public License
17 24 # along with this program; if not, write to the Free Software
18 25 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 26 # MA 02110-1301, USA.
20 """
21 Created on April 7, 2010
22 admin controller for pylons
23 @author: marcink
24 """
27
28 import logging
29 import traceback
30 import formencode
31 from operator import itemgetter
25 32 from formencode import htmlfill
26 from operator import itemgetter
33
27 34 from paste.httpexceptions import HTTPInternalServerError
28 35 from pylons import request, response, session, tmpl_context as c, url
29 36 from pylons.controllers.util import abort, redirect
30 37 from pylons.i18n.translation import _
38
31 39 from rhodecode.lib import helpers as h
32 40 from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, \
33 41 HasPermissionAnyDecorator
34 42 from rhodecode.lib.base import BaseController, render
35 43 from rhodecode.lib.utils import invalidate_cache, action_logger
36 44 from rhodecode.model.db import User
37 45 from rhodecode.model.forms import RepoForm
38 46 from rhodecode.model.scm import ScmModel
39 47 from rhodecode.model.repo import RepoModel
40 import formencode
41 import logging
42 import traceback
48
43 49
44 50 log = logging.getLogger(__name__)
45 51
46 52 class ReposController(BaseController):
47 53 """REST Controller styled on the Atom Publishing Protocol"""
48 54 # To properly map this controller, ensure your config/routing.py
49 55 # file has a resource setup:
50 56 # map.resource('repo', 'repos')
51 57
52 58 @LoginRequired()
53 59 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
54 60 def __before__(self):
55 61 c.admin_user = session.get('admin_user')
56 62 c.admin_username = session.get('admin_username')
57 63 super(ReposController, self).__before__()
58 64
59 65 @HasPermissionAllDecorator('hg.admin')
60 66 def index(self, format='html'):
61 67 """GET /repos: All items in the collection"""
62 68 # url('repos')
63 69 cached_repo_list = ScmModel().get_repos()
64 70 c.repos_list = sorted(cached_repo_list, key=itemgetter('name_sort'))
65 71 return render('admin/repos/repos.html')
66 72
67 73 @HasPermissionAnyDecorator('hg.admin', 'hg.create.repository')
68 74 def create(self):
69 75 """POST /repos: Create a new item"""
70 76 # url('repos')
71 77 repo_model = RepoModel()
72 78 _form = RepoForm()()
73 79 form_result = {}
74 80 try:
75 81 form_result = _form.to_python(dict(request.POST))
76 82 repo_model.create(form_result, c.rhodecode_user)
77 83 h.flash(_('created repository %s') % form_result['repo_name'],
78 84 category='success')
79 85
80 86 if request.POST.get('user_created'):
81 87 action_logger(self.rhodecode_user, 'user_created_repo',
82 88 form_result['repo_name'], '', self.sa)
83 89 else:
84 90 action_logger(self.rhodecode_user, 'admin_created_repo',
85 91 form_result['repo_name'], '', self.sa)
86 92
87 93 except formencode.Invalid, errors:
88 94 c.new_repo = errors.value['repo_name']
89 95
90 96 if request.POST.get('user_created'):
91 97 r = render('admin/repos/repo_add_create_repository.html')
92 98 else:
93 99 r = render('admin/repos/repo_add.html')
94 100
95 101 return htmlfill.render(
96 102 r,
97 103 defaults=errors.value,
98 104 errors=errors.error_dict or {},
99 105 prefix_error=False,
100 106 encoding="UTF-8")
101 107
102 108 except Exception:
103 109 log.error(traceback.format_exc())
104 110 msg = _('error occured during creation of repository %s') \
105 111 % form_result.get('repo_name')
106 112 h.flash(msg, category='error')
107 113 if request.POST.get('user_created'):
108 114 return redirect(url('home'))
109 115 return redirect(url('repos'))
110 116
111 117 @HasPermissionAllDecorator('hg.admin')
112 118 def new(self, format='html'):
113 119 """GET /repos/new: Form to create a new item"""
114 120 new_repo = request.GET.get('repo', '')
115 121 c.new_repo = h.repo_name_slug(new_repo)
116 122
117 123 return render('admin/repos/repo_add.html')
118 124
119 125 @HasPermissionAllDecorator('hg.admin')
120 126 def update(self, repo_name):
121 127 """PUT /repos/repo_name: Update an existing item"""
122 128 # Forms posted to this method should contain a hidden field:
123 129 # <input type="hidden" name="_method" value="PUT" />
124 130 # Or using helpers:
125 131 # h.form(url('repo', repo_name=ID),
126 132 # method='put')
127 133 # url('repo', repo_name=ID)
128 134 repo_model = RepoModel()
129 135 changed_name = repo_name
130 136 _form = RepoForm(edit=True, old_data={'repo_name':repo_name})()
131 137
132 138 try:
133 139 form_result = _form.to_python(dict(request.POST))
134 140 repo_model.update(repo_name, form_result)
135 141 invalidate_cache('get_repo_cached_%s' % repo_name)
136 142 h.flash(_('Repository %s updated successfully' % repo_name),
137 143 category='success')
138 144 changed_name = form_result['repo_name']
139 145 action_logger(self.rhodecode_user, 'admin_updated_repo',
140 146 changed_name, '', self.sa)
141 147
142 148 except formencode.Invalid, errors:
143 149 c.repo_info = repo_model.get_by_repo_name(repo_name)
144 150 if c.repo_info.stats:
145 151 last_rev = c.repo_info.stats.stat_on_revision
146 152 else:
147 153 last_rev = 0
148 154 c.stats_revision = last_rev
149 155 r = ScmModel().get(repo_name)
150 156 c.repo_last_rev = r.revisions[-1] if r.revisions else 0
151 157
152 158 if last_rev == 0:
153 159 c.stats_percentage = 0
154 160 else:
155 161 c.stats_percentage = '%.2f' % ((float((last_rev)) /
156 162 c.repo_last_rev) * 100)
157 163
158 164 c.users_array = repo_model.get_users_js()
159 165 errors.value.update({'user':c.repo_info.user.username})
160 166 return htmlfill.render(
161 167 render('admin/repos/repo_edit.html'),
162 168 defaults=errors.value,
163 169 errors=errors.error_dict or {},
164 170 prefix_error=False,
165 171 encoding="UTF-8")
166 172
167 173 except Exception:
168 174 log.error(traceback.format_exc())
169 175 h.flash(_('error occurred during update of repository %s') \
170 176 % repo_name, category='error')
171 177
172 178 return redirect(url('edit_repo', repo_name=changed_name))
173 179
174 180 @HasPermissionAllDecorator('hg.admin')
175 181 def delete(self, repo_name):
176 182 """DELETE /repos/repo_name: Delete an existing item"""
177 183 # Forms posted to this method should contain a hidden field:
178 184 # <input type="hidden" name="_method" value="DELETE" />
179 185 # Or using helpers:
180 186 # h.form(url('repo', repo_name=ID),
181 187 # method='delete')
182 188 # url('repo', repo_name=ID)
183 189
184 190 repo_model = RepoModel()
185 191 repo = repo_model.get_by_repo_name(repo_name)
186 192 if not repo:
187 193 h.flash(_('%s repository is not mapped to db perhaps'
188 194 ' it was moved or renamed from the filesystem'
189 195 ' please run the application again'
190 196 ' in order to rescan repositories') % repo_name,
191 197 category='error')
192 198
193 199 return redirect(url('repos'))
194 200 try:
195 201 action_logger(self.rhodecode_user, 'admin_deleted_repo',
196 202 repo_name, '', self.sa)
197 203 repo_model.delete(repo)
198 204 invalidate_cache('get_repo_cached_%s' % repo_name)
199 205 h.flash(_('deleted repository %s') % repo_name, category='success')
200 206
201 207 except Exception, e:
202 208 log.error(traceback.format_exc())
203 209 h.flash(_('An error occured during deletion of %s') % repo_name,
204 210 category='error')
205 211
206 212 return redirect(url('repos'))
207 213
208 214 @HasPermissionAllDecorator('hg.admin')
209 215 def delete_perm_user(self, repo_name):
210 216 """
211 217 DELETE an existing repository permission user
212 218 :param repo_name:
213 219 """
214 220
215 221 try:
216 222 repo_model = RepoModel()
217 223 repo_model.delete_perm_user(request.POST, repo_name)
218 224 except Exception, e:
219 225 h.flash(_('An error occured during deletion of repository user'),
220 226 category='error')
221 227 raise HTTPInternalServerError()
222 228
223 229 @HasPermissionAllDecorator('hg.admin')
224 230 def repo_stats(self, repo_name):
225 231 """
226 232 DELETE an existing repository statistics
227 233 :param repo_name:
228 234 """
229 235
230 236 try:
231 237 repo_model = RepoModel()
232 238 repo_model.delete_stats(repo_name)
233 239 except Exception, e:
234 240 h.flash(_('An error occured during deletion of repository stats'),
235 241 category='error')
236 242 return redirect(url('edit_repo', repo_name=repo_name))
237 243
238 244 @HasPermissionAllDecorator('hg.admin')
239 245 def repo_cache(self, repo_name):
240 246 """
241 247 INVALIDATE exisitings repository cache
242 248 :param repo_name:
243 249 """
244 250
245 251 try:
246 252 ScmModel().mark_for_invalidation(repo_name)
247 253 except Exception, e:
248 254 h.flash(_('An error occurred during cache invalidation'),
249 255 category='error')
250 256 return redirect(url('edit_repo', repo_name=repo_name))
251 257
252 258 @HasPermissionAllDecorator('hg.admin')
253 259 def show(self, repo_name, format='html'):
254 260 """GET /repos/repo_name: Show a specific item"""
255 261 # url('repo', repo_name=ID)
256 262
257 263 @HasPermissionAllDecorator('hg.admin')
258 264 def edit(self, repo_name, format='html'):
259 265 """GET /repos/repo_name/edit: Form to edit an existing item"""
260 266 # url('edit_repo', repo_name=ID)
261 267 repo_model = RepoModel()
262 268 c.repo_info = repo_model.get_by_repo_name(repo_name)
263 269 if c.repo_info.stats:
264 270 last_rev = c.repo_info.stats.stat_on_revision
265 271 else:
266 272 last_rev = 0
267 273 c.stats_revision = last_rev
268 274 r = ScmModel().get(repo_name)
269 275 c.repo_last_rev = r.revisions[-1] if r.revisions else 0
270 276
271 277 if last_rev == 0:
272 278 c.stats_percentage = 0
273 279 else:
274 280 c.stats_percentage = '%.2f' % ((float((last_rev)) /
275 281 c.repo_last_rev) * 100)
276 282
277 283
278 284 if not c.repo_info:
279 285 h.flash(_('%s repository is not mapped to db perhaps'
280 286 ' it was created or renamed from the filesystem'
281 287 ' please run the application again'
282 288 ' in order to rescan repositories') % repo_name,
283 289 category='error')
284 290
285 291 return redirect(url('repos'))
292
286 293 defaults = c.repo_info.__dict__
287 294 if c.repo_info.user:
288 295 defaults.update({'user':c.repo_info.user.username})
289 296 else:
290 297 replacement_user = self.sa.query(User)\
291 298 .filter(User.admin == True).first().username
292 299 defaults.update({'user':replacement_user})
293 300
294 301 c.users_array = repo_model.get_users_js()
295 302
296 303 for p in c.repo_info.repo_to_perm:
297 304 defaults.update({'perm_%s' % p.user.username:
298 305 p.permission.permission_name})
299 306
300 307 return htmlfill.render(
301 308 render('admin/repos/repo_edit.html'),
302 309 defaults=defaults,
303 310 encoding="UTF-8",
304 311 force_defaults=False
305 312 )
General Comments 0
You need to be logged in to leave comments. Login now