##// END OF EJS Templates
codingstyle: trivial whitespace fixes...
codingstyle: trivial whitespace fixes Reported by flake8.

File last commit:

r6789:76912908 default
r6789:76912908 default
Show More
user_groups.py
426 lines | 17.1 KiB | text/x-python | PythonLexer
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 # -*- coding: utf-8 -*-
# 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.
#
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Mads Kiilerich
cleanup: make module self-naming consistent...
r5376 kallithea.controllers.admin.user_groups
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
Thomas De Schampheleire
Turbogears2 migration: remove some references to Pylons in comments...
r6178 User Groups crud controller
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
Bradley M. Kuhn
RhodeCode GmbH is not the sole author of this work
r4211 This file was forked by the Kallithea project in July 2014.
Original author and date, and relevant copyright and licensing information is below:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 :created_on: Jan 25, 2011
:author: marcink
Bradley M. Kuhn
RhodeCode GmbH is not the sole author of this work
r4211 :copyright: (c) 2013 RhodeCode GmbH, and others.
Bradley M. Kuhn
Correct licensing information in individual files....
r4208 :license: GPLv3, see LICENSE.md for more details.
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 """
import logging
import traceback
import formencode
from formencode import htmlfill
Alessandro Molina
backend: replace Pylons with TurboGears2...
r6522 from tg import request, tmpl_context as c, config, app_globals
Mads Kiilerich
tg: minimize future diff by some mocking and replacing some pylons imports with tg...
r6508 from tg.i18n import ugettext as _
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 from webob.exc import HTTPFound
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
from sqlalchemy.orm import joinedload
from sqlalchemy.sql.expression import func
from webob.exc import HTTPInternalServerError
import kallithea
Thomas De Schampheleire
Turbogears2 migration: replace pylons.url by kallithea.config.routing.url...
r6182 from kallithea.config.routing import url
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 from kallithea.lib import helpers as h
Mads Kiilerich
cleanup: remove unused imports...
r5397 from kallithea.lib.exceptions import UserGroupsAssignedException, \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 RepoGroupAssignmentError
Mads Kiilerich
cleanup: remove unused Python imports, found with pyflakes
r4422 from kallithea.lib.utils2 import safe_unicode, safe_int
Mads Kiilerich
cleanup: remove unused imports...
r5397 from kallithea.lib.auth import LoginRequired, \
Søren Løvborg
auth: simplify user group permission checks...
r6473 HasUserGroupPermissionLevelDecorator, HasPermissionAnyDecorator
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 from kallithea.lib.base import BaseController, render
from kallithea.model.scm import UserGroupList
from kallithea.model.user_group import UserGroupModel
from kallithea.model.repo import RepoModel
Mads Kiilerich
cleanup: remove unused imports...
r5397 from kallithea.model.db import User, UserGroup, UserGroupToPerm, \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 UserGroupRepoToPerm, UserGroupRepoGroupToPerm
Mads Kiilerich
cleanup: remove unused imports...
r5397 from kallithea.model.forms import UserGroupForm, UserGroupPermsForm, \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 CustomDefaultPermissionsForm
from kallithea.model.meta import Session
from kallithea.lib.utils import action_logger
log = logging.getLogger(__name__)
class UserGroupsController(BaseController):
"""REST Controller styled on the Atom Publishing Protocol"""
@LoginRequired()
Thomas De Schampheleire
controllers: rename __before__ to _before in preparation of TurboGears2...
r6513 def _before(self, *args, **kwargs):
super(UserGroupsController, self)._before(*args, **kwargs)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 c.available_permissions = config['available_permissions']
def __load_data(self, user_group_id):
c.group_members_obj = sorted((x.user for x in c.user_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())
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()
return data
def index(self, format='html'):
Mads Kiilerich
cleanup: consistent space before line continuation backslash
r5585 _list = UserGroup.query() \
.order_by(func.lower(UserGroup.users_group_name)) \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 .all()
Søren Løvborg
auth: simplify user group permission checks...
r6473 group_iter = UserGroupList(_list, perm_level='admin')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 user_groups_data = []
total_records = len(group_iter)
Alessandro Molina
backend: replace Pylons with TurboGears2...
r6522 _tmpl_lookup = app_globals.mako_lookup
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 template = _tmpl_lookup.get_template('data_table/_dt_elements.html')
user_group_name = lambda user_group_id, user_group_name: (
template.get_def("user_group_name")
.render(user_group_id, user_group_name, _=_, h=h, c=c)
)
user_group_actions = lambda user_group_id, user_group_name: (
template.get_def("user_group_actions")
.render(user_group_id, user_group_name, _=_, h=h, c=c)
)
for user_gr in group_iter:
user_groups_data.append({
"raw_name": user_gr.users_group_name,
"group_name": user_group_name(user_gr.users_group_id,
user_gr.users_group_name),
Nick High
security: Fix HTML and JavaScript injection....
r5008 "desc": h.escape(user_gr.user_group_description),
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 "members": len(user_gr.members),
"active": h.boolicon(user_gr.users_group_active),
Søren Løvborg
db: PullRequest/Repository/RepoGroup/UserGroup: change 'user' to 'owner'...
r6193 "owner": h.person(user_gr.owner.username),
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 "action": user_group_actions(user_gr.users_group_id, user_gr.users_group_name)
})
Søren Løvborg
templates: properly escape inline JavaScript values...
r6492 c.data = {
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 "totalRecords": total_records,
"startIndex": 0,
"sort": None,
"dir": "asc",
"records": user_groups_data
Søren Løvborg
templates: properly escape inline JavaScript values...
r6492 }
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
return render('admin/user_groups/user_groups.html')
@HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true')
def create(self):
users_group_form = UserGroupForm()()
try:
form_result = users_group_form.to_python(dict(request.POST))
Mads Kiilerich
admin: show links to created users and groups
r4708 ug = UserGroupModel().create(name=form_result['users_group_name'],
description=form_result['user_group_description'],
Mads Kiilerich
controllers: avoid setting request state in controller instances - set it in the thread global request variable...
r6412 owner=request.authuser.user_id,
Mads Kiilerich
admin: show links to created users and groups
r4708 active=form_result['users_group_active'])
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
gr = form_result['users_group_name']
Mads Kiilerich
controllers: avoid setting request state in controller instances - set it in the thread global request variable...
r6412 action_logger(request.authuser,
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 'admin_created_users_group:%s' % gr,
Søren Løvborg
cleanup: remove SQLAlchemy session argument to action_logger...
r6480 None, request.ip_addr)
Mads Kiilerich
admin: show links to created users and groups
r4708 h.flash(h.literal(_('Created user group %s') % h.link_to(h.escape(gr), url('edit_users_group', id=ug.users_group_id))),
category='success')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 Session().commit()
Mads Kiilerich
cleanup: consistently use 'except ... as ...:'...
r5374 except formencode.Invalid as errors:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 return htmlfill.render(
render('admin/user_groups/user_group_add.html'),
defaults=errors.value,
errors=errors.error_dict or {},
prefix_error=False,
Mads Kiilerich
controllers: consistently use formfill.render with force_defaults=False...
r4941 encoding="UTF-8",
force_defaults=False)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 except Exception:
log.error(traceback.format_exc())
Lars Kruse
codingstyle: trivial whitespace fixes...
r6789 h.flash(_('Error occurred during creation of user group %s')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 % request.POST.get('users_group_name'), category='error')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('users_groups'))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
@HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true')
def new(self, format='html'):
return render('admin/user_groups/user_group_add.html')
Søren Løvborg
auth: simplify user group permission checks...
r6473 @HasUserGroupPermissionLevelDecorator('admin')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 def update(self, id):
c.user_group = UserGroup.get_or_404(id)
c.active = 'settings'
self.__load_data(id)
available_members = [safe_unicode(x[0]) for x in c.available_members]
users_group_form = UserGroupForm(edit=True,
old_data=c.user_group.get_dict(),
available_members=available_members)()
try:
form_result = users_group_form.to_python(request.POST)
UserGroupModel().update(c.user_group, form_result)
gr = form_result['users_group_name']
Mads Kiilerich
controllers: avoid setting request state in controller instances - set it in the thread global request variable...
r6412 action_logger(request.authuser,
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 'admin_updated_users_group:%s' % gr,
Søren Løvborg
cleanup: remove SQLAlchemy session argument to action_logger...
r6480 None, request.ip_addr)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 h.flash(_('Updated user group %s') % gr, category='success')
Session().commit()
Mads Kiilerich
cleanup: consistently use 'except ... as ...:'...
r5374 except formencode.Invalid as errors:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 ug_model = UserGroupModel()
defaults = errors.value
e = errors.error_dict or {}
defaults.update({
'create_repo_perm': ug_model.has_perm(id,
'hg.create.repository'),
'fork_repo_perm': ug_model.has_perm(id,
'hg.fork.repository'),
})
return htmlfill.render(
render('admin/user_groups/user_group_edit.html'),
defaults=defaults,
errors=e,
prefix_error=False,
Mads Kiilerich
controllers: consistently use formfill.render with force_defaults=False...
r4941 encoding="UTF-8",
force_defaults=False)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 except Exception:
log.error(traceback.format_exc())
Lars Kruse
codingstyle: trivial whitespace fixes...
r6789 h.flash(_('Error occurred during update of user group %s')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 % request.POST.get('users_group_name'), category='error')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('edit_users_group', id=id))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
Søren Løvborg
auth: simplify user group permission checks...
r6473 @HasUserGroupPermissionLevelDecorator('admin')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 def delete(self, id):
usr_gr = UserGroup.get_or_404(id)
try:
UserGroupModel().delete(usr_gr)
Session().commit()
h.flash(_('Successfully deleted user group'), category='success')
Mads Kiilerich
cleanup: consistently use 'except ... as ...:'...
r5374 except UserGroupsAssignedException as e:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 h.flash(e, category='error')
except Exception:
log.error(traceback.format_exc())
h.flash(_('An error occurred during deletion of user group'),
category='error')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('users_groups'))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
Søren Løvborg
auth: simplify user group permission checks...
r6473 @HasUserGroupPermissionLevelDecorator('admin')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 def edit(self, id, format='html'):
c.user_group = UserGroup.get_or_404(id)
c.active = 'settings'
self.__load_data(id)
defaults = self.__load_defaults(id)
return htmlfill.render(
render('admin/user_groups/user_group_edit.html'),
defaults=defaults,
encoding="UTF-8",
force_defaults=False
)
Søren Løvborg
auth: simplify user group permission checks...
r6473 @HasUserGroupPermissionLevelDecorator('admin')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 def edit_perms(self, id):
c.user_group = UserGroup.get_or_404(id)
c.active = 'perms'
repo_model = RepoModel()
c.users_array = repo_model.get_users_js()
c.user_groups_array = repo_model.get_user_groups_js()
defaults = {}
# fill user group users
for p in c.user_group.user_user_group_to_perm:
defaults.update({'u_perm_%s' % p.user.username:
p.permission.permission_name})
for p in c.user_group.user_group_user_group_to_perm:
defaults.update({'g_perm_%s' % p.user_group.users_group_name:
p.permission.permission_name})
return htmlfill.render(
render('admin/user_groups/user_group_edit.html'),
defaults=defaults,
encoding="UTF-8",
force_defaults=False
)
Søren Løvborg
auth: simplify user group permission checks...
r6473 @HasUserGroupPermissionLevelDecorator('admin')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 def update_perms(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 !
try:
UserGroupModel()._update_permissions(user_group, form['perms_new'],
form['perms_updates'])
except RepoGroupAssignmentError:
h.flash(_('Target group cannot be the same'), category='error')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('edit_user_group_perms', id=id))
Lars Kruse
codingstyle: trivial whitespace fixes...
r6789 # TODO: implement this
Mads Kiilerich
controllers: avoid setting request state in controller instances - set it in the thread global request variable...
r6412 #action_logger(request.authuser, 'admin_changed_repo_permissions',
Søren Løvborg
cleanup: remove SQLAlchemy session argument to action_logger...
r6480 # repo_name, request.ip_addr)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 Session().commit()
Søren Løvborg
spelling: fix inappropriate use of title case...
r5424 h.flash(_('User group permissions updated'), category='success')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('edit_user_group_perms', id=id))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
Søren Løvborg
auth: simplify user group permission checks...
r6473 @HasUserGroupPermissionLevelDecorator('admin')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 def delete_perms(self, id):
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'))
Mads Kiilerich
controllers: avoid setting request state in controller instances - set it in the thread global request variable...
r6412 if not request.authuser.is_admin:
if obj_type == 'user' and request.authuser.user_id == obj_id:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 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':
UserGroupModel().revoke_user_group_permission(target_user_group=id,
user_group=obj_id)
Session().commit()
except Exception:
log.error(traceback.format_exc())
h.flash(_('An error occurred during revoking of permission'),
category='error')
raise HTTPInternalServerError()
Søren Løvborg
auth: simplify user group permission checks...
r6473 @HasUserGroupPermissionLevelDecorator('admin')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 def edit_default_perms(self, id):
c.user_group = UserGroup.get_or_404(id)
c.active = 'default_perms'
permissions = {
'repositories': {},
'repositories_groups': {}
}
Mads Kiilerich
cleanup: consistent space before line continuation backslash
r5585 ugroup_repo_perms = UserGroupRepoToPerm.query() \
.options(joinedload(UserGroupRepoToPerm.permission)) \
.options(joinedload(UserGroupRepoToPerm.repository)) \
.filter(UserGroupRepoToPerm.users_group_id == id) \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 .all()
for gr in ugroup_repo_perms:
permissions['repositories'][gr.repository.repo_name] \
= gr.permission.permission_name
Mads Kiilerich
cleanup: consistent space before line continuation backslash
r5585 ugroup_group_perms = UserGroupRepoGroupToPerm.query() \
.options(joinedload(UserGroupRepoGroupToPerm.permission)) \
.options(joinedload(UserGroupRepoGroupToPerm.group)) \
.filter(UserGroupRepoGroupToPerm.users_group_id == id) \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 .all()
for gr in ugroup_group_perms:
permissions['repositories_groups'][gr.group.group_name] \
= gr.permission.permission_name
c.permissions = permissions
ug_model = UserGroupModel()
defaults = c.user_group.get_dict()
defaults.update({
'create_repo_perm': ug_model.has_perm(c.user_group,
'hg.create.repository'),
'create_user_group_perm': ug_model.has_perm(c.user_group,
'hg.usergroup.create.true'),
'fork_repo_perm': ug_model.has_perm(c.user_group,
'hg.fork.repository'),
})
return htmlfill.render(
render('admin/user_groups/user_group_edit.html'),
defaults=defaults,
encoding="UTF-8",
force_defaults=False
)
Søren Løvborg
auth: simplify user group permission checks...
r6473 @HasUserGroupPermissionLevelDecorator('admin')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 def update_default_perms(self, id):
user_group = UserGroup.get_or_404(id)
try:
form = CustomDefaultPermissionsForm()()
form_result = form.to_python(request.POST)
inherit_perms = form_result['inherit_default_permissions']
user_group.inherit_default_permissions = inherit_perms
usergroup_model = UserGroupModel()
Mads Kiilerich
cleanup: consistent space before line continuation backslash
r5585 defs = UserGroupToPerm.query() \
.filter(UserGroupToPerm.users_group == user_group) \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 .all()
for ug in defs:
Session().delete(ug)
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')
else:
usergroup_model.grant_perm(id, 'hg.usergroup.create.false')
if form_result['fork_repo_perm']:
usergroup_model.grant_perm(id, 'hg.fork.repository')
else:
usergroup_model.grant_perm(id, 'hg.fork.none')
h.flash(_("Updated permissions"), category='success')
Session().commit()
except Exception:
log.error(traceback.format_exc())
h.flash(_('An error occurred during permissions saving'),
category='error')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('edit_user_group_default_perms', id=id))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
Søren Løvborg
auth: simplify user group permission checks...
r6473 @HasUserGroupPermissionLevelDecorator('admin')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 def edit_advanced(self, id):
c.user_group = UserGroup.get_or_404(id)
c.active = 'advanced'
c.group_members_obj = sorted((x.user for x in c.user_group.members),
key=lambda u: u.username.lower())
return render('admin/user_groups/user_group_edit.html')
Søren Løvborg
auth: simplify user group permission checks...
r6473 @HasUserGroupPermissionLevelDecorator('admin')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 def edit_members(self, id):
c.user_group = UserGroup.get_or_404(id)
c.active = 'members'
c.group_members_obj = sorted((x.user for x in c.user_group.members),
key=lambda u: u.username.lower())
c.group_members = [(x.user_id, x.username) for x in c.group_members_obj]
return render('admin/user_groups/user_group_edit.html')