@@ -19,52 +19,54 @@
# 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/>.
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 _
from rhodecode.lib import helpers as h
from rhodecode.lib.exceptions import UsersGroupsAssignedException
from rhodecode.lib.utils2 import safe_unicode, str2bool
from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
from rhodecode.lib.base import BaseController, render
from rhodecode.model.users_group import UsersGroupModel
from rhodecode.model.db import User, UsersGroup
from rhodecode.model.db import User, UsersGroup, UsersGroupToPerm,\
UsersGroupRepoToPerm, UsersGroupRepoGroupToPerm
from rhodecode.model.forms import UsersGroupForm
from rhodecode.model.meta import Session
from rhodecode.lib.utils import action_logger
from sqlalchemy.orm import joinedload
log = logging.getLogger(__name__)
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()
@HasPermissionAllDecorator('hg.admin')
def __before__(self):
c.admin_user = session.get('admin_user')
c.admin_username = session.get('admin_username')
super(UsersGroupsController, self).__before__()
c.available_permissions = config['available_permissions']
def index(self, format='html'):
"""GET /users_groups: All items in the collection"""
# url('users_groups')
c.users_groups_list = UsersGroup().query().all()
return render('admin/users_groups/users_groups.html')
@@ -81,64 +83,91 @@ class UsersGroupsController(BaseControll
action_logger(self.rhodecode_user,
'admin_created_users_group:%s' % gr,
None, self.ip_addr, self.sa)
h.flash(_('created users group %s') % gr, category='success')
Session().commit()
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())
h.flash(_('error occurred during creation of users group %s') \
% request.POST.get('users_group_name'), category='error')
return redirect(url('users_groups'))
def new(self, format='html'):
"""GET /users_groups/new: Form to create a new item"""
# url('new_users_group')
return render('admin/users_groups/users_group_add.html')
def _load_data(self, id):
c.users_group.permissions = {
'repositories': {},
'repositories_groups': {}
}
ugroup_repo_perms = UsersGroupRepoToPerm.query()\
.options(joinedload(UsersGroupRepoToPerm.permission))\
.options(joinedload(UsersGroupRepoToPerm.repository))\
.filter(UsersGroupRepoToPerm.users_group_id == id)\
.all()
for gr in ugroup_repo_perms:
c.users_group.permissions['repositories'][gr.repository.repo_name] \
= gr.permission.permission_name
ugroup_group_perms = UsersGroupRepoGroupToPerm.query()\
.options(joinedload(UsersGroupRepoGroupToPerm.permission))\
.options(joinedload(UsersGroupRepoGroupToPerm.group))\
.filter(UsersGroupRepoGroupToPerm.users_group_id == id)\
for gr in ugroup_group_perms:
c.users_group.permissions['repositories_groups'][gr.group.group_name] \
c.group_members_obj = [x.user for x in c.users_group.members]
c.group_members = [(x.user_id, x.username) for x in
c.group_members_obj]
c.available_members = [(x.user_id, x.username) for x in
User.query().all()]
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)
c.users_group = UsersGroup.get(id)
c.users_group = UsersGroup.get_or_404(id)
self._load_data(id)
available_members = [safe_unicode(x[0]) for x in c.available_members]
users_group_form = UsersGroupForm(edit=True,
old_data=c.users_group.get_dict(),
available_members=available_members)()
try:
form_result = users_group_form.to_python(request.POST)
UsersGroupModel().update(c.users_group, form_result)
gr = form_result['users_group_name']
'admin_updated_users_group:%s' % gr,
h.flash(_('updated users group %s') % gr, category='success')
ug_model = UsersGroupModel()
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,
@@ -168,55 +197,50 @@ class UsersGroupsController(BaseControll
# method='delete')
usr_gr = UsersGroup.get_or_404(id)
UsersGroupModel().delete(usr_gr)
h.flash(_('successfully deleted users group'), category='success')
except UsersGroupsAssignedException, e:
h.flash(e, category='error')
h.flash(_('An error occurred during deletion of users group'),
category='error')
def show(self, id, format='html'):
"""GET /users_groups/id: Show a specific item"""
def edit(self, id, format='html'):
"""GET /users_groups/id/edit: Form to edit an existing item"""
# url('edit_users_group', id=ID)
c.users_group.permissions = {}
defaults = c.users_group.get_dict()
'create_repo_perm': ug_model.has_perm(c.users_group,
'fork_repo_perm': ug_model.has_perm(c.users_group,
'hg.fork.repository'),
})
render('admin/users_groups/users_group_edit.html'),
defaults=defaults,
encoding="UTF-8",
force_defaults=False
)
def update_perm(self, id):
"""PUT /users_perm/id: Update an existing item"""
# url('users_group_perm', id=ID, method='put')
users_group = UsersGroup.get_or_404(id)
grant_create_perm = str2bool(request.POST.get('create_repo_perm'))
grant_fork_perm = str2bool(request.POST.get('fork_repo_perm'))
inherit_perms = str2bool(request.POST.get('inherit_default_permissions'))
@@ -3914,54 +3914,55 @@ div#legend_container table td,div#legend
height: 20px !important;
padding: 0 !important;
.q_filter_box {
-webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
border: 0 none;
color: #AAAAAA;
margin-bottom: -4px;
margin-top: -4px;
padding-left: 3px;
#node_filter {
border: 0px solid #545454;
.group_members_wrap{
min-height: 85px;
padding-left: 20px;
.group_members .group_member{
height: 30px;
padding:0px 0px 0px 10px;
padding:0px 0px 0px 0px;
.reviewers_member{
height: 15px;
.emails_wrap{
padding: 0px 20px;
.emails_wrap .email_entry{
.emails_wrap .email_entry .email{
float: left
.emails_wrap .email_entry .email_action{
/*README STYLE*/
@@ -124,42 +124,105 @@ ${h.end_form()}
</div>
<div class="field">
<div class="label label-checkbox">
<label for="fork_repo_perm">${_('Fork repositories')}:</label>
<div class="checkboxes">
${h.checkbox('fork_repo_perm',value=True)}
<div class="buttons">
${h.submit('save',_('Save'),class_="ui-btn large")}
${h.reset('reset',_('Reset'),class_="ui-btn large")}
${h.end_form()}
<div class="box box-right">
<!-- box / title -->
<div class="title">
<h5>${_('Group members')}</h5>
<div class="group_members_wrap">
% if c.group_members_obj:
<ul class="group_members">
%for user in c.group_members_obj:
<li>
<div class="group_member">
<div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(user.email,24)}"/> </div>
<div>${user.username}</div>
<div>${h.link_to(user.username, h.url('edit_user',id=user.user_id))}</div>
<div>${user.full_name}</div>
</li>
%endfor
</ul>
%else:
<span class="empty_data">${_('No members yet')}</span>
%endif
<div class="box box-left">
<h5>${_('Permissions defined for this group')}</h5>
## permissions overview
<div id="perms" class="table">
%for section in sorted(c.users_group.permissions.keys()):
<div class="perms_section_head">${section.replace("_"," ").capitalize()}</div>
%if not c.users_group.permissions:
<span class="empty_data">${_('No permissions set yet')}</span>
<div id='tbl_list_wrap_${section}' class="yui-skin-sam">
<table id="tbl_list_repository">
<thead>
<tr>
<th class="left">${_('Name')}</th>
<th class="left">${_('Permission')}</th>
<th class="left">${_('Edit Permission')}</th>
</thead>
<tbody>
%for k in c.users_group.permissions[section]:
<%
section_perm = c.users_group.permissions[section].get(k)
_perm = section_perm.split('.')[-1]
%>
<td>
%if section == 'repositories':
<a href="${h.url('summary_home',repo_name=k)}">${k}</a>
%elif section == 'repositories_groups':
<a href="${h.url('repos_group_home',group_name=k)}">${k}</a>
</td>
<span class="perm_tag ${_perm}">${section_perm}</span>
<a href="${h.url('edit_repo',repo_name=k,anchor='permissions_manage')}">${_('edit')}</a>
<a href="${h.url('edit_repos_group',id=k,anchor='permissions_manage')}">${_('edit')}</a>
--
</tr>
</tbody>
</table>
<script type="text/javascript">
MultiSelectWidget('users_group_members','available_members','edit_users_group');
</script>
</%def>
Status change: