Show More
@@ -36,6 +36,7 b' from rhodecode.lib import auth' | |||
|
36 | 36 | from rhodecode.lib import helpers as h |
|
37 | 37 | from rhodecode.lib.exceptions import UserGroupAssignedException,\ |
|
38 | 38 | RepoGroupAssignmentError |
|
39 | from rhodecode.lib.utils import jsonify, action_logger | |
|
39 | 40 | from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int |
|
40 | 41 | from rhodecode.lib.auth import ( |
|
41 | 42 | LoginRequired, NotAnonymous, HasUserGroupPermissionAnyDecorator, |
@@ -181,7 +182,8 b' class UserGroupsController(BaseControlle' | |||
|
181 | 182 | h.flash(_('Error occurred during creation of user group %s') \ |
|
182 | 183 | % request.POST.get('users_group_name'), category='error') |
|
183 | 184 | |
|
184 |
return redirect( |
|
|
185 | return redirect( | |
|
186 | url('edit_users_group', user_group_id=user_group.users_group_id)) | |
|
185 | 187 | |
|
186 | 188 | @HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true') |
|
187 | 189 | def new(self): |
@@ -467,5 +469,12 b' class UserGroupsController(BaseControlle' | |||
|
467 | 469 | c.group_members_obj = sorted((x.user for x in c.user_group.members), |
|
468 | 470 | key=lambda u: u.username.lower()) |
|
469 | 471 | |
|
470 |
|
|
|
472 | group_members = [(x.user_id, x.username) for x in c.group_members_obj] | |
|
473 | ||
|
474 | if request.is_xhr: | |
|
475 | return jsonify(lambda *a, **k: { | |
|
476 | 'members': group_members | |
|
477 | }) | |
|
478 | ||
|
479 | c.group_members = group_members | |
|
471 | 480 | return render('admin/user_groups/user_group_edit.html') |
@@ -14,6 +14,7 b' function registerRCRoutes() {' | |||
|
14 | 14 | pyroutes.register('files_home', '/%(repo_name)s/files/%(revision)s/%(f_path)s', ['repo_name', 'revision', 'f_path']); |
|
15 | 15 | pyroutes.register('edit_repo', '/%(repo_name)s/settings', ['repo_name']); |
|
16 | 16 | pyroutes.register('edit_repo_perms', '/%(repo_name)s/settings/permissions', ['repo_name']); |
|
17 | pyroutes.register('edit_user_group_members', '/_admin/user_groups/%(user_group_id)s/edit/members', ['user_group_id']); | |
|
17 | 18 | pyroutes.register('pullrequest_home', '/%(repo_name)s/pull-request/new', ['repo_name']); |
|
18 | 19 | pyroutes.register('user_autocomplete_data', '/_users', []); |
|
19 | 20 | pyroutes.register('toggle_following', '/_admin/toggle_following', []); |
@@ -44,6 +44,9 b'' | |||
|
44 | 44 | <div class="field"> |
|
45 | 45 | <div class="label"> |
|
46 | 46 | <label for="users_group_active">${_('Members')}:</label> |
|
47 | ${h.text('from_user_group', | |
|
48 | placeholder="select only users", | |
|
49 | class_="medium")} | |
|
47 | 50 | </div> |
|
48 | 51 | <div class="select side-by-side-selector"> |
|
49 | 52 | <div class="left-group"> |
@@ -60,7 +63,8 b'' | |||
|
60 | 63 | <i id="remove_element" class="icon-chevron-right"></i> |
|
61 | 64 | </div> |
|
62 | 65 | <div class="right-group"> |
|
63 |
<label class="text" >${_('Available members')} |
|
|
66 | <label class="text" >${_('Available members')} | |
|
67 | </label> | |
|
64 | 68 | ${h.select('available_members',[],c.available_members,multiple=True,size=8,)} |
|
65 | 69 | <div class="btn" id="add_all_elements" > |
|
66 | 70 | <i class="icon-chevron-left"></i>${_('Add all elements')} |
@@ -86,6 +90,42 b'' | |||
|
86 | 90 | 'dropdownAutoWidth': true |
|
87 | 91 | }); |
|
88 | 92 | |
|
93 | $('#from_user_group').autocomplete({ | |
|
94 | serviceUrl: pyroutes.url('user_autocomplete_data'), | |
|
95 | minChars:2, | |
|
96 | maxHeight:400, | |
|
97 | width:300, | |
|
98 | deferRequestBy: 300, //miliseconds | |
|
99 | showNoSuggestionNotice: true, | |
|
100 | params: { user_groups:true }, | |
|
101 | formatResult: autocompleteFormatResult, | |
|
102 | lookupFilter: autocompleteFilterResult, | |
|
103 | onSelect: function(element, suggestion){ | |
|
104 | ||
|
105 | function preSelectUserIds(uids) { | |
|
106 | $('#available_members').val(uids); | |
|
107 | $('#users_group_members').val(uids); | |
|
108 | } | |
|
109 | ||
|
110 | if (suggestion.value_type == 'user_group') { | |
|
111 | $.getJSON( | |
|
112 | pyroutes.url('edit_user_group_members', | |
|
113 | {'user_group_id': suggestion.id}), | |
|
114 | function(data) { | |
|
115 | var uids = []; | |
|
116 | $.each(data.members, function(idx, user) { | |
|
117 | var userid = user[0], | |
|
118 | username = user[1]; | |
|
119 | uids.push(userid.toString()); | |
|
120 | }); | |
|
121 | preSelectUserIds(uids) | |
|
122 | } | |
|
123 | ); | |
|
124 | } else if (suggestion.value_type == 'user') { | |
|
125 | preSelectUserIds([suggestion.id.toString()]); | |
|
126 | } | |
|
127 | } | |
|
128 | }); | |
|
89 | 129 | UsersAutoComplete('user', '${c.rhodecode_user.user_id}'); |
|
90 | 130 | }) |
|
91 | 131 | </script> |
@@ -35,7 +35,8 b' class TestAdminUsersGroupsController(Tes' | |||
|
35 | 35 | |
|
36 | 36 | def test_index(self): |
|
37 | 37 | self.log_user() |
|
38 | self.app.get(url('users_groups')) | |
|
38 | response = self.app.get(url('users_groups')) | |
|
39 | response.mustcontain('No members yet') | |
|
39 | 40 | |
|
40 | 41 | def test_create(self): |
|
41 | 42 | self.log_user() |
@@ -148,7 +149,13 b' class TestAdminUsersGroupsController(Tes' | |||
|
148 | 149 | fixture.destroy_user_group(users_group_name) |
|
149 | 150 | |
|
150 | 151 | def test_edit(self): |
|
151 | self.app.get(url('edit_users_group', user_group_id=1)) | |
|
152 | self.log_user() | |
|
153 | response = self.app.get(url('edit_users_group', user_group_id=1)) | |
|
154 | ||
|
155 | def test_edit_user_group_members(self): | |
|
156 | self.log_user() | |
|
157 | response = self.app.get(url('edit_user_group_members', user_group_id=1)) | |
|
158 | response.mustcontain('No members yet') | |
|
152 | 159 | |
|
153 | 160 | def test_usergroup_escape(self): |
|
154 | 161 | user = User.get_by_username('test_admin') |
General Comments 0
You need to be logged in to leave comments.
Login now