##// END OF EJS Templates
implemented usergroup permissions checks....
implemented usergroup permissions checks. - each user who has now explicit or inherited permissions can create usersgrous - user is automatically an admin of that usergroup, and can manage it

File last commit:

r3737:46b17730 beta
r3737:46b17730 beta
Show More
users_groups.py
368 lines | 14.8 KiB | text/x-python | PythonLexer
started working on issue #56
r956 # -*- coding: utf-8 -*-
"""
rhodecode.controllers.admin.users_groups
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mads Kiilerich
"Users groups" is grammatically incorrect English - rename to "user groups"...
r3410 User Groups crud controller for pylons
source code cleanup: remove trailing white space, normalize file endings
r1203
started working on issue #56
r956 :created_on: Jan 25, 2011
:author: marcink
2012 copyrights
r1824 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
started working on issue #56
r956 :license: GPLv3, see COPYING for more details.
"""
fixed license issue #149
r1206 # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
source code cleanup: remove trailing white space, normalize file endings
r1203 #
started working on issue #56
r956 # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
source code cleanup: remove trailing white space, normalize file endings
r1203 #
started working on issue #56
r956 # You should have received a copy of the GNU General Public License
fixed license issue #149
r1206 # along with this program. If not, see <http://www.gnu.org/licenses/>.
started working on issue #56
r956
import logging
import traceback
import formencode
from formencode import htmlfill
from pylons import request, session, tmpl_context as c, url, config
from pylons.controllers.util import abort, redirect
from pylons.i18n.translation import _
utils/conf...
r2109 from rhodecode.lib import helpers as h
Mads Kiilerich
further cleanup of UsersGroup...
r3417 from rhodecode.lib.exceptions import UserGroupsAssignedException
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int
from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator,\
implemented usergroup permissions checks....
r3737 HasUserGroupPermissionAnyDecorator, HasPermissionAnyDecorator
started working on issue #56
r956 from rhodecode.lib.base import BaseController, render
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 from rhodecode.model.scm import UserGroupList
Mads Kiilerich
further cleanup of UsersGroup...
r3417 from rhodecode.model.users_group import UserGroupModel
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 from rhodecode.model.repo import RepoModel
Mads Kiilerich
further cleanup of UsersGroup...
r3417 from rhodecode.model.db import User, UserGroup, UserGroupToPerm,\
UserGroupRepoToPerm, UserGroupRepoGroupToPerm
Iteration on default permissions...
r3736 from rhodecode.model.forms import UserGroupForm, UserGroupPermsForm,\
CustomDefaultPermissionsForm
commit less models...
r1749 from rhodecode.model.meta import Session
Implemented #467 Journal logs comments on changesets...
r2375 from rhodecode.lib.utils import action_logger
Implemented #638 permissions overview to groups
r2987 from sqlalchemy.orm import joinedload
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 from webob.exc import HTTPInternalServerError
started working on issue #56
r956
log = logging.getLogger(__name__)
PEP8ify - controllers
r1245
started working on issue #56
r956 class UsersGroupsController(BaseController):
"""REST Controller styled on the Atom Publishing Protocol"""
# To properly map this controller, ensure your config/routing.py
# file has a resource setup:
# map.resource('users_group', 'users_groups')
@LoginRequired()
def __before__(self):
super(UsersGroupsController, self).__before__()
c.available_permissions = config['available_permissions']
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 def __load_data(self, user_group_id):
ugroup_repo_perms = UserGroupRepoToPerm.query()\
.options(joinedload(UserGroupRepoToPerm.permission))\
.options(joinedload(UserGroupRepoToPerm.repository))\
.filter(UserGroupRepoToPerm.users_group_id == user_group_id)\
.all()
for gr in ugroup_repo_perms:
c.users_group.permissions['repositories'][gr.repository.repo_name] \
= gr.permission.permission_name
ugroup_group_perms = UserGroupRepoGroupToPerm.query()\
.options(joinedload(UserGroupRepoGroupToPerm.permission))\
.options(joinedload(UserGroupRepoGroupToPerm.group))\
.filter(UserGroupRepoGroupToPerm.users_group_id == user_group_id)\
.all()
for gr in ugroup_group_perms:
c.users_group.permissions['repositories_groups'][gr.group.group_name] \
= gr.permission.permission_name
c.group_members_obj = sorted((x.user for x in c.users_group.members),
key=lambda u: u.username.lower())
c.group_members = [(x.user_id, x.username) for x in c.group_members_obj]
c.available_members = sorted(((x.user_id, x.username) for x in
User.query().all()),
key=lambda u: u[1].lower())
repo_model = RepoModel()
c.users_array = repo_model.get_users_js()
# commented out due to not now supporting assignment for user group
# on user group
c.users_groups_array = "[]" # repo_model.get_users_groups_js()
c.available_permissions = config['available_permissions']
def __load_defaults(self, user_group_id):
"""
Load defaults settings for edit, and update
:param user_group_id:
"""
user_group = UserGroup.get_or_404(user_group_id)
data = user_group.get_dict()
ug_model = UserGroupModel()
data.update({
'create_repo_perm': ug_model.has_perm(user_group,
'hg.create.repository'),
Iteration on default permissions...
r3736 'create_user_group_perm': ug_model.has_perm(user_group,
'hg.usergroup.create.true'),
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 'fork_repo_perm': ug_model.has_perm(user_group,
'hg.fork.repository'),
})
# fill user group users
for p in user_group.user_user_group_to_perm:
data.update({'u_perm_%s' % p.user.username:
p.permission.permission_name})
return data
started working on issue #56
r956 def index(self, format='html'):
"""GET /users_groups: All items in the collection"""
# url('users_groups')
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714
group_iter = UserGroupList(UserGroup().query().all(),
perm_set=['usergroup.admin'])
sk = lambda g: g.users_group_name
c.users_groups_list = sorted(group_iter, key=sk)
started working on issue #56
r956 return render('admin/users_groups/users_groups.html')
implemented usergroup permissions checks....
r3737 @HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true')
started working on issue #56
r956 def create(self):
"""POST /users_groups: Create a new item"""
# url('users_groups')
removed users_group controller in replace for model methods,...
r1436
Mads Kiilerich
further cleanup of UsersGroup...
r3417 users_group_form = UserGroupForm()()
#56 fixed found bugs, implemented adding of new group + forms+validators...
r959 try:
form_result = users_group_form.to_python(dict(request.POST))
Mads Kiilerich
further cleanup of UsersGroup...
r3417 UserGroupModel().create(name=form_result['users_group_name'],
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 owner=self.rhodecode_user.user_id,
active=form_result['users_group_active'])
Implemented #467 Journal logs comments on changesets...
r2375 gr = form_result['users_group_name']
action_logger(self.rhodecode_user,
'admin_created_users_group:%s' % gr,
None, self.ip_addr, self.sa)
Mads Kiilerich
consistently capitalize initial letter in flash messages
r3565 h.flash(_('Created user group %s') % gr, category='success')
sqlalchemy sessions cleanup in admin...
r2662 Session().commit()
#56 fixed found bugs, implemented adding of new group + forms+validators...
r959 except formencode.Invalid, errors:
return htmlfill.render(
render('admin/users_groups/users_group_add.html'),
defaults=errors.value,
errors=errors.error_dict or {},
prefix_error=False,
encoding="UTF-8")
except Exception:
log.error(traceback.format_exc())
Mads Kiilerich
consistently capitalize initial letter in flash messages
r3565 h.flash(_('Error occurred during creation of user group %s') \
#56 fixed found bugs, implemented adding of new group + forms+validators...
r959 % request.POST.get('users_group_name'), category='error')
return redirect(url('users_groups'))
started working on issue #56
r956
implemented usergroup permissions checks....
r3737 @HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true')
started working on issue #56
r956 def new(self, format='html'):
"""GET /users_groups/new: Form to create a new item"""
# url('new_users_group')
#56 fixed found bugs, implemented adding of new group + forms+validators...
r959 return render('admin/users_groups/users_group_add.html')
started working on issue #56
r956
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 @HasUserGroupPermissionAnyDecorator('usergroup.admin')
started working on issue #56
r956 def update(self, id):
"""PUT /users_groups/id: Update an existing item"""
# Forms posted to this method should contain a hidden field:
# <input type="hidden" name="_method" value="PUT" />
# Or using helpers:
# h.form(url('users_group', id=ID),
# method='put')
# url('users_group', id=ID)
Mads Kiilerich
further cleanup of UsersGroup...
r3417 c.users_group = UserGroup.get_or_404(id)
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 self.__load_data(id)
auto white-space removal
r1818
commit less models...
r1749 available_members = [safe_unicode(x[0]) for x in c.available_members]
auto white-space removal
r1818
Mads Kiilerich
further cleanup of UsersGroup...
r3417 users_group_form = UserGroupForm(edit=True,
#56 implemented users groups editing,...
r972 old_data=c.users_group.get_dict(),
commit less models...
r1749 available_members=available_members)()
#56 implemented users groups editing,...
r972
try:
form_result = users_group_form.to_python(request.POST)
Mads Kiilerich
further cleanup of UsersGroup...
r3417 UserGroupModel().update(c.users_group, form_result)
Implemented #467 Journal logs comments on changesets...
r2375 gr = form_result['users_group_name']
action_logger(self.rhodecode_user,
'admin_updated_users_group:%s' % gr,
None, self.ip_addr, self.sa)
Mads Kiilerich
consistently capitalize initial letter in flash messages
r3565 h.flash(_('Updated user group %s') % gr, category='success')
sqlalchemy sessions cleanup in admin...
r2662 Session().commit()
#56 implemented users groups editing,...
r972 except formencode.Invalid, errors:
Mads Kiilerich
further cleanup of UsersGroup...
r3417 ug_model = UserGroupModel()
RhodeCode now has a option to explicitly set forking permissions. ref #508...
r2709 defaults = errors.value
Fixed permissions for users groups, group can have create repo permission now....
r1271 e = errors.error_dict or {}
RhodeCode now has a option to explicitly set forking permissions. ref #508...
r2709 defaults.update({
'create_repo_perm': ug_model.has_perm(id,
'hg.create.repository'),
'fork_repo_perm': ug_model.has_perm(id,
'hg.fork.repository'),
'_method': 'put'
})
Fixed permissions for users groups, group can have create repo permission now....
r1271
#56 implemented users groups editing,...
r972 return htmlfill.render(
render('admin/users_groups/users_group_edit.html'),
RhodeCode now has a option to explicitly set forking permissions. ref #508...
r2709 defaults=defaults,
Fixed permissions for users groups, group can have create repo permission now....
r1271 errors=e,
#56 implemented users groups editing,...
r972 prefix_error=False,
encoding="UTF-8")
except Exception:
log.error(traceback.format_exc())
Mads Kiilerich
consistently capitalize initial letter in flash messages
r3565 h.flash(_('Error occurred during update of user group %s') \
#56 implemented users groups editing,...
r972 % request.POST.get('users_group_name'), category='error')
RhodeCode now has a option to explicitly set forking permissions. ref #508...
r2709 return redirect(url('edit_users_group', id=id))
#56 implemented users groups editing,...
r972
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 @HasUserGroupPermissionAnyDecorator('usergroup.admin')
started working on issue #56
r956 def delete(self, id):
"""DELETE /users_groups/id: Delete an existing item"""
# Forms posted to this method should contain a hidden field:
# <input type="hidden" name="_method" value="DELETE" />
# Or using helpers:
# h.form(url('users_group', id=ID),
# method='delete')
# url('users_group', id=ID)
Mads Kiilerich
further cleanup of UsersGroup...
r3417 usr_gr = UserGroup.get_or_404(id)
#56 implemented users groups deletes
r973 try:
Mads Kiilerich
further cleanup of UsersGroup...
r3417 UserGroupModel().delete(usr_gr)
sqlalchemy sessions cleanup in admin...
r2662 Session().commit()
Mads Kiilerich
consistently capitalize initial letter in flash messages
r3565 h.flash(_('Successfully deleted user group'), category='success')
Mads Kiilerich
further cleanup of UsersGroup...
r3417 except UserGroupsAssignedException, e:
fixes #228 - added detection of assigned groups to prevent errors on sqlite
r1435 h.flash(e, category='error')
#56 implemented users groups deletes
r973 except Exception:
fixed #373 missing cascade drop on user_group_to_perm table
r2063 log.error(traceback.format_exc())
Mads Kiilerich
"Users groups" is grammatically incorrect English - rename to "user groups"...
r3410 h.flash(_('An error occurred during deletion of user group'),
#56 implemented users groups deletes
r973 category='error')
return redirect(url('users_groups'))
started working on issue #56
r956
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 @HasUserGroupPermissionAnyDecorator('usergroup.admin')
def set_user_group_perm_member(self, id):
"""
grant permission for given usergroup
:param id:
"""
user_group = UserGroup.get_or_404(id)
form = UserGroupPermsForm()().to_python(request.POST)
# set the permissions !
UserGroupModel()._update_permissions(user_group, form['perms_new'],
form['perms_updates'])
#TODO: implement this
#action_logger(self.rhodecode_user, 'admin_changed_repo_permissions',
# repo_name, self.ip_addr, self.sa)
Session().commit()
h.flash(_('User Group permissions updated'), category='success')
return redirect(url('edit_users_group', id=id))
@HasUserGroupPermissionAnyDecorator('usergroup.admin')
def delete_user_group_perm_member(self, id):
"""
DELETE an existing repository group permission user
:param group_name:
"""
try:
obj_type = request.POST.get('obj_type')
obj_id = None
if obj_type == 'user':
obj_id = safe_int(request.POST.get('user_id'))
elif obj_type == 'user_group':
obj_id = safe_int(request.POST.get('user_group_id'))
if not c.rhodecode_user.is_admin:
if obj_type == 'user' and c.rhodecode_user.user_id == obj_id:
msg = _('Cannot revoke permission for yourself as admin')
h.flash(msg, category='warning')
raise Exception('revoke admin permission on self')
if obj_type == 'user':
UserGroupModel().revoke_user_permission(user_group=id,
user=obj_id)
elif obj_type == 'user_group':
pass
Session().commit()
except Exception:
log.error(traceback.format_exc())
consistent handling of grant/revoke of permissions widgets...
r3715 h.flash(_('An error occurred during revoking of permission'),
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 category='error')
raise HTTPInternalServerError()
started working on issue #56
r956 def show(self, id, format='html'):
"""GET /users_groups/id: Show a specific item"""
# url('users_group', id=ID)
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 @HasUserGroupPermissionAnyDecorator('usergroup.admin')
started working on issue #56
r956 def edit(self, id, format='html'):
"""GET /users_groups/id/edit: Form to edit an existing item"""
# url('edit_users_group', id=ID)
#56 implemented users groups editing,...
r972
Mads Kiilerich
further cleanup of UsersGroup...
r3417 c.users_group = UserGroup.get_or_404(id)
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 self.__load_data(id)
#56 implemented users groups editing,...
r972
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 defaults = self.__load_defaults(id)
RhodeCode now has a option to explicitly set forking permissions. ref #508...
r2709
#56 implemented users groups editing,...
r972 return htmlfill.render(
render('admin/users_groups/users_group_edit.html'),
defaults=defaults,
encoding="UTF-8",
force_defaults=False
)
Fixed permissions for users groups, group can have create repo permission now....
r1271
- Manage User’s Groups: create, delete, rename, add/remove users inside....
r3714 @HasUserGroupPermissionAnyDecorator('usergroup.admin')
Fixed permissions for users groups, group can have create repo permission now....
r1271 def update_perm(self, id):
"""PUT /users_perm/id: Update an existing item"""
# url('users_group_perm', id=ID, method='put')
Mads Kiilerich
further cleanup of UsersGroup...
r3417 users_group = UserGroup.get_or_404(id)
RhodeCode now has a option to explicitly set forking permissions. ref #508...
r2709
try:
Iteration on default permissions...
r3736 form = CustomDefaultPermissionsForm()()
form_result = form.to_python(request.POST)
inherit_perms = form_result['inherit_default_permissions']
RhodeCode now has a option to explicitly set forking permissions. ref #508...
r2709 users_group.inherit_default_permissions = inherit_perms
Session().add(users_group)
Iteration on default permissions...
r3736 usergroup_model = UserGroupModel()
Fixed permissions for users groups, group can have create repo permission now....
r1271
Iteration on default permissions...
r3736 defs = UserGroupToPerm.query()\
.filter(UserGroupToPerm.users_group == users_group)\
.all()
for ug in defs:
Session().delete(ug)
Fixed permissions for users groups, group can have create repo permission now....
r1271
Iteration on default permissions...
r3736 if form_result['create_repo_perm']:
usergroup_model.grant_perm(id, 'hg.create.repository')
else:
usergroup_model.grant_perm(id, 'hg.create.none')
if form_result['create_user_group_perm']:
usergroup_model.grant_perm(id, 'hg.usergroup.create.true')
RhodeCode now has a option to explicitly set forking permissions. ref #508...
r2709 else:
Iteration on default permissions...
r3736 usergroup_model.grant_perm(id, 'hg.usergroup.create.false')
if form_result['fork_repo_perm']:
usergroup_model.grant_perm(id, 'hg.fork.repository')
else:
Mads Kiilerich
further cleanup of UsersGroup...
r3417 usergroup_model.grant_perm(id, 'hg.fork.none')
auto white-space removal
r1818
Iteration on default permissions...
r3736 h.flash(_("Updated permissions"), category='success')
sqlalchemy sessions cleanup in admin...
r2662 Session().commit()
RhodeCode now has a option to explicitly set forking permissions. ref #508...
r2709 except Exception:
log.error(traceback.format_exc())
h.flash(_('An error occurred during permissions saving'),
category='error')
Fixed permissions for users groups, group can have create repo permission now....
r1271
return redirect(url('edit_users_group', id=id))