@@ -106,6 +106,41 @@ class UsersGroupsController(BaseControll
# method='put')
# url('users_group', id=ID)
users_group_model = UsersGroupModel()
c.users_group = users_group_model.get(id)
c.group_members = [(x.user_id, x.user.username) for x in
c.users_group.members]
c.available_members = [(x.user_id, x.username) for x in
self.sa.query(User).all()]
users_group_form = UsersGroupForm(edit=True,
old_data=c.users_group.get_dict(),
available_members=[str(x[0]) for x
in c.available_members])()
try:
form_result = users_group_form.to_python(request.POST)
users_group_model.update(id, form_result)
h.flash(_('updated users group %s') % form_result['users_group_name'],
category='success')
#action_logger(self.rhodecode_user, 'new_user', '', '', self.sa)
except formencode.Invalid, errors:
return htmlfill.render(
render('admin/users_groups/users_group_edit.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 update of users group %s') \
% request.POST.get('users_group_name'), category='error')
return redirect(url('users_groups'))
def delete(self, id):
"""DELETE /users_groups/id: Delete an existing item"""
# Forms posted to this method should contain a hidden field:
@@ -122,3 +157,22 @@ class UsersGroupsController(BaseControll
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 = self.sa.query(UsersGroup).get(id)
if not c.users_group:
c.users_group.permissions = {}
print c.group_members, 'x' * 100
defaults = c.users_group.get_dict()
defaults=defaults,
encoding="UTF-8",
force_defaults=False
)
@@ -29,7 +29,7 @@ import datetime
from sqlalchemy import *
from sqlalchemy.exc import DatabaseError
from sqlalchemy.orm import relation, backref, class_mapper
from sqlalchemy.orm import relationship, backref, class_mapper
from sqlalchemy.orm.session import Session
from rhodecode.model.meta import Base
@@ -107,11 +107,11 @@ class User(Base, BaseModel):
last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
is_ldap = Column("is_ldap", Boolean(), nullable=False, unique=None, default=False)
user_log = relation('UserLog', cascade='all')
user_perms = relation('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
user_log = relationship('UserLog', cascade='all')
user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
repositories = relation('Repository')
user_followers = relation('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
repositories = relationship('Repository')
user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
@property
def full_contact(self):
@@ -150,8 +150,8 @@ class UserLog(Base, BaseModel):
action = Column("action", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
user = relation('User')
repository = relation('Repository')
user = relationship('User')
repository = relationship('Repository')
class UsersGroup(Base, BaseModel):
@@ -162,7 +162,7 @@ class UsersGroup(Base, BaseModel):
users_group_name = Column("users_group_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
members = relation('UsersGroupMember')
members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan")
class UsersGroupMember(Base, BaseModel):
__tablename__ = 'users_groups_members'
@@ -172,8 +172,12 @@ class UsersGroupMember(Base, BaseModel):
users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
users_group = relation('UsersGroup')
users_group = relationship('UsersGroup')
def __init__(self, gr_id, u_id):
self.users_group_id = gr_id
self.user_id = u_id
class Repository(Base, BaseModel):
__tablename__ = 'repositories'
@@ -189,13 +193,13 @@ class Repository(Base, BaseModel):
fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
fork = relation('Repository', remote_side=repo_id)
group = relation('Group')
repo_to_perm = relation('RepoToPerm', cascade='all')
stats = relation('Statistics', cascade='all', uselist=False)
fork = relationship('Repository', remote_side=repo_id)
group = relationship('Group')
repo_to_perm = relationship('RepoToPerm', cascade='all')
stats = relationship('Statistics', cascade='all', uselist=False)
repo_followers = relation('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
repo_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
def __repr__(self):
return "<%s('%s:%s')>" % (self.__class__.__name__,
@@ -209,7 +213,7 @@ class Group(Base, BaseModel):
group_name = Column("group_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
parent_group = relation('Group', remote_side=group_id)
parent_group = relationship('Group', remote_side=group_id)
def __init__(self, group_name='', parent_group=None):
@@ -239,9 +243,9 @@ class RepoToPerm(Base, BaseModel):
permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
permission = relation('Permission')
permission = relationship('Permission')
class UserToPerm(Base, BaseModel):
__tablename__ = 'user_to_perm'
@@ -250,8 +254,8 @@ class UserToPerm(Base, BaseModel):
class UsersGroupToPerm(Base, BaseModel):
__tablename__ = 'users_group_to_perm'
@@ -260,8 +264,8 @@ class UsersGroupToPerm(Base, BaseModel):
class GroupToPerm(Base, BaseModel):
__tablename__ = 'group_to_perm'
@@ -272,9 +276,9 @@ class GroupToPerm(Base, BaseModel):
group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
class Statistics(Base, BaseModel):
__tablename__ = 'statistics'
@@ -286,7 +290,7 @@ class Statistics(Base, BaseModel):
commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
languages = Column("languages", LargeBinary(), nullable=False)#JSON data
repository = relation('Repository', single_parent=True)
repository = relationship('Repository', single_parent=True)
class UserFollowing(Base, BaseModel):
__tablename__ = 'user_followings'
@@ -299,10 +303,10 @@ class UserFollowing(Base, BaseModel):
follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
user = relation('User', primaryjoin='User.user_id==UserFollowing.user_id')
user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
follows_user = relation('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
follows_repository = relation('Repository')
follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
follows_repository = relationship('Repository')
class CacheInvalidation(Base, BaseModel):
__tablename__ = 'cache_invalidation'
@@ -26,7 +26,7 @@ import logging
import formencode
from formencode import All
from formencode.validators import UnicodeString, OneOf, Int, Number, Regex, \
Email, Bool, StringBoolean
Email, Bool, StringBoolean, Set
from pylons.i18n.translation import _
@@ -99,11 +99,12 @@ def ValidUsersGroup(edit, old_data):
if value in ['default']:
raise formencode.Invalid(_('Invalid group name'), value, state)
#check if group is unique
old_un = None
old_ugname = None
if edit:
old_un = UserModel().get(old_data.get('users_group_id')).username
old_ugname = UsersGroupModel()\
.get(old_data.get('users_group_id')).users_group_name
if old_un != value or not edit:
if old_ugname != value or not edit:
if UsersGroupModel().get_by_groupname(value, cache=False,
case_insensitive=True):
raise formencode.Invalid(_('This users group already exists') ,
@@ -402,7 +403,7 @@ def UserForm(edit=False, old_data={}):
return _UserForm
def UsersGroupForm(edit=False, old_data={}):
def UsersGroupForm(edit=False, old_data={}, available_members=[]):
class _UsersGroupForm(formencode.Schema):
allow_extra_fields = True
filter_extra_fields = True
@@ -412,6 +413,11 @@ def UsersGroupForm(edit=False, old_data=
users_group_active = StringBoolean(if_missing=False)
users_group_members = OneOf(available_members, hideList=False,
testValueList=True,
if_missing=None, not_empty=False)
return _UsersGroupForm
def RegisterForm(edit=False, old_data={}):
@@ -32,9 +32,7 @@ from pylons.i18n.translation import _
from rhodecode.model import BaseModel
from rhodecode.model.caching_query import FromCache
from rhodecode.model.db import UsersGroup
from rhodecode.lib.exceptions import DefaultUserException, UserOwnsReposException
from rhodecode.model.db import UsersGroup, UsersGroupMember
@@ -51,7 +49,8 @@ class UsersGroupModel(BaseModel):
return users_group.get(users_group_id)
def get_by_groupname(self, users_group_name, cache=False, case_insensitive=False):
def get_by_groupname(self, users_group_name, cache=False,
case_insensitive=False):
if case_insensitive:
user = self.sa.query(UsersGroup)\
@@ -77,3 +76,26 @@ class UsersGroupModel(BaseModel):
self.sa.rollback()
raise
def update(self, users_group_id, form_data):
users_group = self.get(users_group_id, cache=False)
for k, v in form_data.items():
if k == 'users_group_members':
users_group.members = []
self.sa.flush()
members_list = []
if v:
for u_id in set(v):
members_list.append(UsersGroupMember(users_group_id,
u_id))
setattr(users_group, 'members', members_list)
setattr(users_group, k, v)
self.sa.add(users_group)
self.sa.commit()
except:
## -*- coding: utf-8 -*-
<%inherit file="/base/base.html"/>
<%def name="title()">
${_('Edit users group')} ${c.users_group.users_group_name} - ${c.rhodecode_name}
</%def>
<%def name="breadcrumbs_links()">
${h.link_to(_('Admin'),h.url('admin_home'))}
»
${h.link_to(_('UsersGroups'),h.url('users_groups'))}
${_('edit')} "${c.users_group.users_group_name}"
<%def name="page_nav()">
${self.menu('admin')}
<%def name="main()">
<div class="box">
<!-- box / title -->
<div class="title">
${self.breadcrumbs()}
</div>
<!-- end box / title -->
${h.form(url('users_group', id=c.users_group.users_group_id),method='put', id='edit_users_group')}
<div class="form">
<!-- fields -->
<div class="fields">
<div class="field">
<div class="label">
<label for="users_group_name">${_('Group name')}:</label>
<div class="input">
${h.text('users_group_name',class_='small')}
<div class="label label-checkbox">
<label for="users_group_active">${_('Active')}:</label>
<div class="checkboxes">
${h.checkbox('users_group_active',value=True)}
<label for="users_group_active">${_('Members')}:</label>
<table>
<tr>
<td>
<div>
<div style="float:left">
<div class="text">${_('Group members')}</div>
${h.select('users_group_members',[x[0] for x in c.group_members],c.group_members,multiple=True,size=8,style="min-width:210px")}
<div style="float:left;width:20px;padding-top:50px">
<img alt="add" id="add_element"
style="padding:2px;cursor:pointer"
src="/images/icons/arrow_left.png">
<br />
<img alt="remove" id="remove_element"
src="/images/icons/arrow_right.png">
<div class="text">${_('Available members')}</div>
${h.select('available_members',[],c.available_members,multiple=True,size=8,style="min-width:210px")}
</td>
</tr>
</table>
<div class="buttons">
${h.submit('save','save',class_="ui-button")}
${h.end_form()}
<script type="text/javascript">
YAHOO.util.Event.onDOMReady(function(){
var D = YAHOO.util.Dom;
var E = YAHOO.util.Event;
//definition of containers ID's
var available_container = 'available_members';
var selected_container = 'users_group_members';
//form containing containers id
var form_id = 'edit_users_group';
//temp container for storage.
var cache = new Array();
var c = D.get(selected_container);
//get only selected options for further fullfilment
for(var i = 0;node =c.options[i];i++){
if(node.selected){
//push selected to my temp storage left overs :)
cache.push(node);
}
//clear 'selected' select
c.options.length = 0;
//fill it with remembered options
for(var i = 0;node = cache[i];i++){
c.options[i]=new Option(node.text, node.value, false, false);
function prompts_action_callback(e){
var choosen = D.get(selected_container);
var availible = D.get(available_container);
if (this.id=='add_element'){
for(var i=0; node = availible.options[i];i++){
choosen.appendChild(new Option(node.text, node.value, false, false));
else if (this.id=='remove_element'){
cache = new Array();
for(var i = 0;node = choosen.options[i];i++){
if(!node.selected){
//push left overs :)
//clear select
choosen.options.length = 0;
choosen.options[i]=new Option(node.text, node.value, false, false);
else{
E.addListener(['add_element','remove_element'],'click',prompts_action_callback)
E.addListener(form_id,'submit',function(){
for (var i = 0; i < choosen.options.length; i++) {
choosen.options[i].selected = 'selected';
})
});
</script>
\ No newline at end of file
Status change: