comparison pylons_app/controllers/admin/repos.py @ 412:ca54622e39a1

Added separate create repository views for non administrative users. Fixed permission issue with private repos
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 01 Aug 2010 17:08:58 +0200
parents 7fbf81447c6c
children 905c4f049c9e f5c1eec9f376
comparison
equal deleted inserted replaced
411:86a25ad59766 412:ca54622e39a1
27 from paste.httpexceptions import HTTPInternalServerError 27 from paste.httpexceptions import HTTPInternalServerError
28 from pylons import request, response, session, tmpl_context as c, url 28 from pylons import request, response, session, tmpl_context as c, url
29 from pylons.controllers.util import abort, redirect 29 from pylons.controllers.util import abort, redirect
30 from pylons.i18n.translation import _ 30 from pylons.i18n.translation import _
31 from pylons_app.lib import helpers as h 31 from pylons_app.lib import helpers as h
32 from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator 32 from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator, \
33 HasPermissionAnyDecorator
33 from pylons_app.lib.base import BaseController, render 34 from pylons_app.lib.base import BaseController, render
34 from pylons_app.lib.utils import invalidate_cache 35 from pylons_app.lib.utils import invalidate_cache
35 from pylons_app.model.db import User 36 from pylons_app.model.db import User
36 from pylons_app.model.forms import RepoForm 37 from pylons_app.model.forms import RepoForm
37 from pylons_app.model.hg_model import HgModel 38 from pylons_app.model.hg_model import HgModel
47 # To properly map this controller, ensure your config/routing.py 48 # To properly map this controller, ensure your config/routing.py
48 # file has a resource setup: 49 # file has a resource setup:
49 # map.resource('repo', 'repos') 50 # map.resource('repo', 'repos')
50 51
51 @LoginRequired() 52 @LoginRequired()
52 @HasPermissionAllDecorator('hg.admin') 53 @HasPermissionAnyDecorator('hg.admin', 'repository.create')
53 def __before__(self): 54 def __before__(self):
54 c.admin_user = session.get('admin_user') 55 c.admin_user = session.get('admin_user')
55 c.admin_username = session.get('admin_username') 56 c.admin_username = session.get('admin_username')
56 super(ReposController, self).__before__() 57 super(ReposController, self).__before__()
57 58
59 @HasPermissionAllDecorator('hg.admin')
58 def index(self, format='html'): 60 def index(self, format='html'):
59 """GET /repos: All items in the collection""" 61 """GET /repos: All items in the collection"""
60 # url('repos') 62 # url('repos')
61 cached_repo_list = HgModel().get_repos() 63 cached_repo_list = HgModel().get_repos()
62 c.repos_list = sorted(cached_repo_list, key=itemgetter('name_sort')) 64 c.repos_list = sorted(cached_repo_list, key=itemgetter('name_sort'))
63 return render('admin/repos/repos.html') 65 return render('admin/repos/repos.html')
64 66
67 @HasPermissionAnyDecorator('hg.admin', 'repository.create')
65 def create(self): 68 def create(self):
66 """POST /repos: Create a new item""" 69 """POST /repos: Create a new item"""
67 # url('repos') 70 # url('repos')
68 repo_model = RepoModel() 71 repo_model = RepoModel()
69 _form = RepoForm()() 72 _form = RepoForm()()
75 h.flash(_('created repository %s') % form_result['repo_name'], 78 h.flash(_('created repository %s') % form_result['repo_name'],
76 category='success') 79 category='success')
77 80
78 except formencode.Invalid as errors: 81 except formencode.Invalid as errors:
79 c.new_repo = errors.value['repo_name'] 82 c.new_repo = errors.value['repo_name']
83
84 if request.POST.get('user_created'):
85 r = render('admin/repos/repo_add_create_repository.html')
86 else:
87 r = render('admin/repos/repo_add.html')
88
80 return htmlfill.render( 89 return htmlfill.render(
81 render('admin/repos/repo_add.html'), 90 r,
82 defaults=errors.value, 91 defaults=errors.value,
83 errors=errors.error_dict or {}, 92 errors=errors.error_dict or {},
84 prefix_error=False, 93 prefix_error=False,
85 encoding="UTF-8") 94 encoding="UTF-8")
86 95
87 except Exception: 96 except Exception:
88 log.error(traceback.format_exc()) 97 log.error(traceback.format_exc())
89 msg = _('error occured during creation of repository %s') \ 98 msg = _('error occured during creation of repository %s') \
90 % form_result.get('repo_name') 99 % form_result.get('repo_name')
91 h.flash(msg, category='error') 100 h.flash(msg, category='error')
92 101 if request.POST.get('user_created'):
93 return redirect('repos') 102 return redirect(url('hg_home'))
94 103 return redirect(url('repos'))
104
105 @HasPermissionAllDecorator('hg.admin')
95 def new(self, format='html'): 106 def new(self, format='html'):
96 """GET /repos/new: Form to create a new item""" 107 """GET /repos/new: Form to create a new item"""
97 new_repo = request.GET.get('repo', '') 108 new_repo = request.GET.get('repo', '')
98 c.new_repo = h.repo_name_slug(new_repo) 109 c.new_repo = h.repo_name_slug(new_repo)
99 110
100 return render('admin/repos/repo_add.html') 111 return render('admin/repos/repo_add.html')
101 112
113 @HasPermissionAllDecorator('hg.admin')
102 def update(self, repo_name): 114 def update(self, repo_name):
103 """PUT /repos/repo_name: Update an existing item""" 115 """PUT /repos/repo_name: Update an existing item"""
104 # Forms posted to this method should contain a hidden field: 116 # Forms posted to this method should contain a hidden field:
105 # <input type="hidden" name="_method" value="PUT" /> 117 # <input type="hidden" name="_method" value="PUT" />
106 # Or using helpers: 118 # Or using helpers:
134 h.flash(_('error occured during update of repository %s') \ 146 h.flash(_('error occured during update of repository %s') \
135 % repo_name, category='error') 147 % repo_name, category='error')
136 148
137 return redirect(url('edit_repo', repo_name=changed_name)) 149 return redirect(url('edit_repo', repo_name=changed_name))
138 150
151 @HasPermissionAllDecorator('hg.admin')
139 def delete(self, repo_name): 152 def delete(self, repo_name):
140 """DELETE /repos/repo_name: Delete an existing item""" 153 """DELETE /repos/repo_name: Delete an existing item"""
141 # Forms posted to this method should contain a hidden field: 154 # Forms posted to this method should contain a hidden field:
142 # <input type="hidden" name="_method" value="DELETE" /> 155 # <input type="hidden" name="_method" value="DELETE" />
143 # Or using helpers: 156 # Or using helpers:
162 except Exception: 175 except Exception:
163 h.flash(_('An error occured during deletion of %s') % repo_name, 176 h.flash(_('An error occured during deletion of %s') % repo_name,
164 category='error') 177 category='error')
165 178
166 return redirect(url('repos')) 179 return redirect(url('repos'))
167 180
181 @HasPermissionAllDecorator('hg.admin')
168 def delete_perm_user(self, repo_name): 182 def delete_perm_user(self, repo_name):
169 """ 183 """
170 DELETE an existing repository permission user 184 DELETE an existing repository permission user
171 @param repo_name: 185 @param repo_name:
172 """ 186 """
176 repo_model.delete_perm_user(request.POST, repo_name) 190 repo_model.delete_perm_user(request.POST, repo_name)
177 except Exception as e: 191 except Exception as e:
178 h.flash(_('An error occured during deletion of repository user'), 192 h.flash(_('An error occured during deletion of repository user'),
179 category='error') 193 category='error')
180 raise HTTPInternalServerError() 194 raise HTTPInternalServerError()
181 195
196 @HasPermissionAllDecorator('hg.admin')
182 def show(self, repo_name, format='html'): 197 def show(self, repo_name, format='html'):
183 """GET /repos/repo_name: Show a specific item""" 198 """GET /repos/repo_name: Show a specific item"""
184 # url('repo', repo_name=ID) 199 # url('repo', repo_name=ID)
185 200
201 @HasPermissionAllDecorator('hg.admin')
186 def edit(self, repo_name, format='html'): 202 def edit(self, repo_name, format='html'):
187 """GET /repos/repo_name/edit: Form to edit an existing item""" 203 """GET /repos/repo_name/edit: Form to edit an existing item"""
188 # url('edit_repo', repo_name=ID) 204 # url('edit_repo', repo_name=ID)
189 repo_model = RepoModel() 205 repo_model = RepoModel()
190 c.repo_info = repo = repo_model.get(repo_name) 206 c.repo_info = repo = repo_model.get(repo_name)