##// END OF EJS Templates
#56 implemented users groups editing,...
marcink -
r972:2c8fd849 beta
parent child Browse files
Show More
@@ -106,6 +106,41 b' class UsersGroupsController(BaseControll'
106 106 # method='put')
107 107 # url('users_group', id=ID)
108 108
109
110 users_group_model = UsersGroupModel()
111 c.users_group = users_group_model.get(id)
112 c.group_members = [(x.user_id, x.user.username) for x in
113 c.users_group.members]
114
115 c.available_members = [(x.user_id, x.username) for x in
116 self.sa.query(User).all()]
117 users_group_form = UsersGroupForm(edit=True,
118 old_data=c.users_group.get_dict(),
119 available_members=[str(x[0]) for x
120 in c.available_members])()
121
122 try:
123 form_result = users_group_form.to_python(request.POST)
124 users_group_model.update(id, form_result)
125 h.flash(_('updated users group %s') % form_result['users_group_name'],
126 category='success')
127 #action_logger(self.rhodecode_user, 'new_user', '', '', self.sa)
128 except formencode.Invalid, errors:
129 return htmlfill.render(
130 render('admin/users_groups/users_group_edit.html'),
131 defaults=errors.value,
132 errors=errors.error_dict or {},
133 prefix_error=False,
134 encoding="UTF-8")
135 except Exception:
136 log.error(traceback.format_exc())
137 h.flash(_('error occurred during update of users group %s') \
138 % request.POST.get('users_group_name'), category='error')
139
140 return redirect(url('users_groups'))
141
142
143
109 144 def delete(self, id):
110 145 """DELETE /users_groups/id: Delete an existing item"""
111 146 # Forms posted to this method should contain a hidden field:
@@ -122,3 +157,22 b' class UsersGroupsController(BaseControll'
122 157 def edit(self, id, format='html'):
123 158 """GET /users_groups/id/edit: Form to edit an existing item"""
124 159 # url('edit_users_group', id=ID)
160
161 c.users_group = self.sa.query(UsersGroup).get(id)
162 if not c.users_group:
163 return redirect(url('users_groups'))
164
165 c.users_group.permissions = {}
166 c.group_members = [(x.user_id, x.user.username) for x in
167 c.users_group.members]
168 print c.group_members, 'x' * 100
169 c.available_members = [(x.user_id, x.username) for x in
170 self.sa.query(User).all()]
171 defaults = c.users_group.get_dict()
172
173 return htmlfill.render(
174 render('admin/users_groups/users_group_edit.html'),
175 defaults=defaults,
176 encoding="UTF-8",
177 force_defaults=False
178 )
@@ -29,7 +29,7 b' import datetime'
29 29
30 30 from sqlalchemy import *
31 31 from sqlalchemy.exc import DatabaseError
32 from sqlalchemy.orm import relation, backref, class_mapper
32 from sqlalchemy.orm import relationship, backref, class_mapper
33 33 from sqlalchemy.orm.session import Session
34 34
35 35 from rhodecode.model.meta import Base
@@ -107,11 +107,11 b' class User(Base, BaseModel):'
107 107 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
108 108 is_ldap = Column("is_ldap", Boolean(), nullable=False, unique=None, default=False)
109 109
110 user_log = relation('UserLog', cascade='all')
111 user_perms = relation('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
110 user_log = relationship('UserLog', cascade='all')
111 user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
112 112
113 repositories = relation('Repository')
114 user_followers = relation('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
113 repositories = relationship('Repository')
114 user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
115 115
116 116 @property
117 117 def full_contact(self):
@@ -150,8 +150,8 b' class UserLog(Base, BaseModel):'
150 150 action = Column("action", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
151 151 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
152 152
153 user = relation('User')
154 repository = relation('Repository')
153 user = relationship('User')
154 repository = relationship('Repository')
155 155
156 156
157 157 class UsersGroup(Base, BaseModel):
@@ -162,7 +162,7 b' class UsersGroup(Base, BaseModel):'
162 162 users_group_name = Column("users_group_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
163 163 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
164 164
165 members = relation('UsersGroupMember')
165 members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan")
166 166
167 167 class UsersGroupMember(Base, BaseModel):
168 168 __tablename__ = 'users_groups_members'
@@ -172,8 +172,12 b' class UsersGroupMember(Base, BaseModel):'
172 172 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
173 173 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
174 174
175 user = relation('User')
176 users_group = relation('UsersGroup')
175 user = relationship('User')
176 users_group = relationship('UsersGroup')
177
178 def __init__(self, gr_id, u_id):
179 self.users_group_id = gr_id
180 self.user_id = u_id
177 181
178 182 class Repository(Base, BaseModel):
179 183 __tablename__ = 'repositories'
@@ -189,13 +193,13 b' class Repository(Base, BaseModel):'
189 193 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
190 194 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
191 195
192 user = relation('User')
193 fork = relation('Repository', remote_side=repo_id)
194 group = relation('Group')
195 repo_to_perm = relation('RepoToPerm', cascade='all')
196 stats = relation('Statistics', cascade='all', uselist=False)
196 user = relationship('User')
197 fork = relationship('Repository', remote_side=repo_id)
198 group = relationship('Group')
199 repo_to_perm = relationship('RepoToPerm', cascade='all')
200 stats = relationship('Statistics', cascade='all', uselist=False)
197 201
198 repo_followers = relation('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
202 repo_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
199 203
200 204 def __repr__(self):
201 205 return "<%s('%s:%s')>" % (self.__class__.__name__,
@@ -209,7 +213,7 b' class Group(Base, BaseModel):'
209 213 group_name = Column("group_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
210 214 group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
211 215
212 parent_group = relation('Group', remote_side=group_id)
216 parent_group = relationship('Group', remote_side=group_id)
213 217
214 218
215 219 def __init__(self, group_name='', parent_group=None):
@@ -239,9 +243,9 b' class RepoToPerm(Base, BaseModel):'
239 243 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
240 244 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
241 245
242 user = relation('User')
243 permission = relation('Permission')
244 repository = relation('Repository')
246 user = relationship('User')
247 permission = relationship('Permission')
248 repository = relationship('Repository')
245 249
246 250 class UserToPerm(Base, BaseModel):
247 251 __tablename__ = 'user_to_perm'
@@ -250,8 +254,8 b' class UserToPerm(Base, BaseModel):'
250 254 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
251 255 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
252 256
253 user = relation('User')
254 permission = relation('Permission')
257 user = relationship('User')
258 permission = relationship('Permission')
255 259
256 260 class UsersGroupToPerm(Base, BaseModel):
257 261 __tablename__ = 'users_group_to_perm'
@@ -260,8 +264,8 b' class UsersGroupToPerm(Base, BaseModel):'
260 264 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
261 265 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
262 266
263 users_group = relation('UsersGroup')
264 permission = relation('Permission')
267 users_group = relationship('UsersGroup')
268 permission = relationship('Permission')
265 269
266 270 class GroupToPerm(Base, BaseModel):
267 271 __tablename__ = 'group_to_perm'
@@ -272,9 +276,9 b' class GroupToPerm(Base, BaseModel):'
272 276 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
273 277 group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
274 278
275 user = relation('User')
276 permission = relation('Permission')
277 group = relation('Group')
279 user = relationship('User')
280 permission = relationship('Permission')
281 group = relationship('Group')
278 282
279 283 class Statistics(Base, BaseModel):
280 284 __tablename__ = 'statistics'
@@ -286,7 +290,7 b' class Statistics(Base, BaseModel):'
286 290 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
287 291 languages = Column("languages", LargeBinary(), nullable=False)#JSON data
288 292
289 repository = relation('Repository', single_parent=True)
293 repository = relationship('Repository', single_parent=True)
290 294
291 295 class UserFollowing(Base, BaseModel):
292 296 __tablename__ = 'user_followings'
@@ -299,10 +303,10 b' class UserFollowing(Base, BaseModel):'
299 303 follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
300 304 follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
301 305
302 user = relation('User', primaryjoin='User.user_id==UserFollowing.user_id')
306 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
303 307
304 follows_user = relation('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
305 follows_repository = relation('Repository')
308 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
309 follows_repository = relationship('Repository')
306 310
307 311 class CacheInvalidation(Base, BaseModel):
308 312 __tablename__ = 'cache_invalidation'
@@ -26,7 +26,7 b' import logging'
26 26 import formencode
27 27 from formencode import All
28 28 from formencode.validators import UnicodeString, OneOf, Int, Number, Regex, \
29 Email, Bool, StringBoolean
29 Email, Bool, StringBoolean, Set
30 30
31 31 from pylons.i18n.translation import _
32 32
@@ -99,11 +99,12 b' def ValidUsersGroup(edit, old_data):'
99 99 if value in ['default']:
100 100 raise formencode.Invalid(_('Invalid group name'), value, state)
101 101 #check if group is unique
102 old_un = None
102 old_ugname = None
103 103 if edit:
104 old_un = UserModel().get(old_data.get('users_group_id')).username
104 old_ugname = UsersGroupModel()\
105 .get(old_data.get('users_group_id')).users_group_name
105 106
106 if old_un != value or not edit:
107 if old_ugname != value or not edit:
107 108 if UsersGroupModel().get_by_groupname(value, cache=False,
108 109 case_insensitive=True):
109 110 raise formencode.Invalid(_('This users group already exists') ,
@@ -402,7 +403,7 b' def UserForm(edit=False, old_data={}):'
402 403 return _UserForm
403 404
404 405
405 def UsersGroupForm(edit=False, old_data={}):
406 def UsersGroupForm(edit=False, old_data={}, available_members=[]):
406 407 class _UsersGroupForm(formencode.Schema):
407 408 allow_extra_fields = True
408 409 filter_extra_fields = True
@@ -412,6 +413,11 b' def UsersGroupForm(edit=False, old_data='
412 413
413 414 users_group_active = StringBoolean(if_missing=False)
414 415
416 if edit:
417 users_group_members = OneOf(available_members, hideList=False,
418 testValueList=True,
419 if_missing=None, not_empty=False)
420
415 421 return _UsersGroupForm
416 422
417 423 def RegisterForm(edit=False, old_data={}):
@@ -32,9 +32,7 b' from pylons.i18n.translation import _'
32 32
33 33 from rhodecode.model import BaseModel
34 34 from rhodecode.model.caching_query import FromCache
35 from rhodecode.model.db import UsersGroup
36
37 from rhodecode.lib.exceptions import DefaultUserException, UserOwnsReposException
35 from rhodecode.model.db import UsersGroup, UsersGroupMember
38 36
39 37 from sqlalchemy.exc import DatabaseError
40 38
@@ -51,7 +49,8 b' class UsersGroupModel(BaseModel):'
51 49 return users_group.get(users_group_id)
52 50
53 51
54 def get_by_groupname(self, users_group_name, cache=False, case_insensitive=False):
52 def get_by_groupname(self, users_group_name, cache=False,
53 case_insensitive=False):
55 54
56 55 if case_insensitive:
57 56 user = self.sa.query(UsersGroup)\
@@ -77,3 +76,26 b' class UsersGroupModel(BaseModel):'
77 76 self.sa.rollback()
78 77 raise
79 78
79 def update(self, users_group_id, form_data):
80
81 try:
82 users_group = self.get(users_group_id, cache=False)
83
84 for k, v in form_data.items():
85 if k == 'users_group_members':
86 users_group.members = []
87 self.sa.flush()
88 members_list = []
89 if v:
90 for u_id in set(v):
91 members_list.append(UsersGroupMember(users_group_id,
92 u_id))
93 setattr(users_group, 'members', members_list)
94 setattr(users_group, k, v)
95
96 self.sa.add(users_group)
97 self.sa.commit()
98 except:
99 log.error(traceback.format_exc())
100 self.sa.rollback()
101 raise
@@ -0,0 +1,166 b''
1 ## -*- coding: utf-8 -*-
2 <%inherit file="/base/base.html"/>
3
4 <%def name="title()">
5 ${_('Edit users group')} ${c.users_group.users_group_name} - ${c.rhodecode_name}
6 </%def>
7
8 <%def name="breadcrumbs_links()">
9 ${h.link_to(_('Admin'),h.url('admin_home'))}
10 &raquo;
11 ${h.link_to(_('UsersGroups'),h.url('users_groups'))}
12 &raquo;
13 ${_('edit')} "${c.users_group.users_group_name}"
14 </%def>
15
16 <%def name="page_nav()">
17 ${self.menu('admin')}
18 </%def>
19
20 <%def name="main()">
21 <div class="box">
22 <!-- box / title -->
23 <div class="title">
24 ${self.breadcrumbs()}
25 </div>
26 <!-- end box / title -->
27 ${h.form(url('users_group', id=c.users_group.users_group_id),method='put', id='edit_users_group')}
28 <div class="form">
29 <!-- fields -->
30 <div class="fields">
31 <div class="field">
32 <div class="label">
33 <label for="users_group_name">${_('Group name')}:</label>
34 </div>
35 <div class="input">
36 ${h.text('users_group_name',class_='small')}
37 </div>
38 </div>
39
40 <div class="field">
41 <div class="label label-checkbox">
42 <label for="users_group_active">${_('Active')}:</label>
43 </div>
44 <div class="checkboxes">
45 ${h.checkbox('users_group_active',value=True)}
46 </div>
47 </div>
48 <div class="field">
49 <div class="label label-checkbox">
50 <label for="users_group_active">${_('Members')}:</label>
51 </div>
52 <div class="checkboxes">
53 <table>
54 <tr>
55 <td>
56 <div>
57 <div style="float:left">
58 <div class="text">${_('Group members')}</div>
59 ${h.select('users_group_members',[x[0] for x in c.group_members],c.group_members,multiple=True,size=8,style="min-width:210px")}
60 </div>
61 <div style="float:left;width:20px;padding-top:50px">
62 <img alt="add" id="add_element"
63 style="padding:2px;cursor:pointer"
64 src="/images/icons/arrow_left.png">
65 <br />
66 <img alt="remove" id="remove_element"
67 style="padding:2px;cursor:pointer"
68 src="/images/icons/arrow_right.png">
69 </div>
70 <div style="float:left">
71 <div class="text">${_('Available members')}</div>
72 ${h.select('available_members',[],c.available_members,multiple=True,size=8,style="min-width:210px")}
73 </div>
74 </div>
75 </td>
76 </tr>
77 </table>
78 </div>
79
80 </div>
81 <div class="buttons">
82 ${h.submit('save','save',class_="ui-button")}
83 </div>
84 </div>
85 </div>
86 ${h.end_form()}
87 </div>
88
89 <script type="text/javascript">
90 YAHOO.util.Event.onDOMReady(function(){
91 var D = YAHOO.util.Dom;
92 var E = YAHOO.util.Event;
93
94 //definition of containers ID's
95 var available_container = 'available_members';
96 var selected_container = 'users_group_members';
97 //form containing containers id
98 var form_id = 'edit_users_group';
99
100 //temp container for storage.
101 var cache = new Array();
102 var c = D.get(selected_container);
103
104 //get only selected options for further fullfilment
105 for(var i = 0;node =c.options[i];i++){
106 if(node.selected){
107 //push selected to my temp storage left overs :)
108 cache.push(node);
109 }
110 }
111
112 //clear 'selected' select
113 c.options.length = 0;
114
115 //fill it with remembered options
116 for(var i = 0;node = cache[i];i++){
117 c.options[i]=new Option(node.text, node.value, false, false);
118 }
119
120 function prompts_action_callback(e){
121
122 var choosen = D.get(selected_container);
123 var availible = D.get(available_container);
124
125 if (this.id=='add_element'){
126 for(var i=0; node = availible.options[i];i++){
127 if(node.selected){
128 choosen.appendChild(new Option(node.text, node.value, false, false));
129 }
130 }
131 }
132 else if (this.id=='remove_element'){
133
134 //temp container for storage.
135 cache = new Array();
136
137 for(var i = 0;node = choosen.options[i];i++){
138 if(!node.selected){
139 //push left overs :)
140 cache.push(node);
141 }
142 }
143 //clear select
144 choosen.options.length = 0;
145 for(var i = 0;node = cache[i];i++){
146 choosen.options[i]=new Option(node.text, node.value, false, false);
147 }
148 }
149 else{
150
151 }
152 }
153
154
155 E.addListener(['add_element','remove_element'],'click',prompts_action_callback)
156
157 E.addListener(form_id,'submit',function(){
158 var choosen = D.get(selected_container);
159 for (var i = 0; i < choosen.options.length; i++) {
160 choosen.options[i].selected = 'selected';
161 }
162 })
163 });
164 </script>
165
166 </%def> No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now