diff --git a/rhodecode/controllers/admin/user_groups.py b/rhodecode/controllers/admin/user_groups.py --- a/rhodecode/controllers/admin/user_groups.py +++ b/rhodecode/controllers/admin/user_groups.py @@ -36,6 +36,7 @@ from rhodecode.lib import auth from rhodecode.lib import helpers as h from rhodecode.lib.exceptions import UserGroupAssignedException,\ RepoGroupAssignmentError +from rhodecode.lib.utils import jsonify, action_logger from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int from rhodecode.lib.auth import ( LoginRequired, NotAnonymous, HasUserGroupPermissionAnyDecorator, @@ -181,7 +182,8 @@ class UserGroupsController(BaseControlle h.flash(_('Error occurred during creation of user group %s') \ % request.POST.get('users_group_name'), category='error') - return redirect(url('users_groups')) + return redirect( + url('edit_users_group', user_group_id=user_group.users_group_id)) @HasPermissionAnyDecorator('hg.admin', 'hg.usergroup.create.true') def new(self): @@ -467,5 +469,12 @@ class UserGroupsController(BaseControlle 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] + group_members = [(x.user_id, x.username) for x in c.group_members_obj] + + if request.is_xhr: + return jsonify(lambda *a, **k: { + 'members': group_members + }) + + c.group_members = group_members return render('admin/user_groups/user_group_edit.html') diff --git a/rhodecode/public/js/src/rhodecode/pyroutes.js b/rhodecode/public/js/src/rhodecode/pyroutes.js --- a/rhodecode/public/js/src/rhodecode/pyroutes.js +++ b/rhodecode/public/js/src/rhodecode/pyroutes.js @@ -14,6 +14,7 @@ function registerRCRoutes() { pyroutes.register('files_home', '/%(repo_name)s/files/%(revision)s/%(f_path)s', ['repo_name', 'revision', 'f_path']); pyroutes.register('edit_repo', '/%(repo_name)s/settings', ['repo_name']); pyroutes.register('edit_repo_perms', '/%(repo_name)s/settings/permissions', ['repo_name']); + pyroutes.register('edit_user_group_members', '/_admin/user_groups/%(user_group_id)s/edit/members', ['user_group_id']); pyroutes.register('pullrequest_home', '/%(repo_name)s/pull-request/new', ['repo_name']); pyroutes.register('user_autocomplete_data', '/_users', []); pyroutes.register('toggle_following', '/_admin/toggle_following', []); diff --git a/rhodecode/templates/admin/user_groups/user_group_edit_settings.html b/rhodecode/templates/admin/user_groups/user_group_edit_settings.html --- a/rhodecode/templates/admin/user_groups/user_group_edit_settings.html +++ b/rhodecode/templates/admin/user_groups/user_group_edit_settings.html @@ -44,6 +44,9 @@
+ ${h.text('from_user_group', + placeholder="select only users", + class_="medium")}
@@ -60,7 +63,8 @@
- + ${h.select('available_members',[],c.available_members,multiple=True,size=8,)}
${_('Add all elements')} @@ -86,6 +90,42 @@ 'dropdownAutoWidth': true }); + $('#from_user_group').autocomplete({ + serviceUrl: pyroutes.url('user_autocomplete_data'), + minChars:2, + maxHeight:400, + width:300, + deferRequestBy: 300, //miliseconds + showNoSuggestionNotice: true, + params: { user_groups:true }, + formatResult: autocompleteFormatResult, + lookupFilter: autocompleteFilterResult, + onSelect: function(element, suggestion){ + + function preSelectUserIds(uids) { + $('#available_members').val(uids); + $('#users_group_members').val(uids); + } + + if (suggestion.value_type == 'user_group') { + $.getJSON( + pyroutes.url('edit_user_group_members', + {'user_group_id': suggestion.id}), + function(data) { + var uids = []; + $.each(data.members, function(idx, user) { + var userid = user[0], + username = user[1]; + uids.push(userid.toString()); + }); + preSelectUserIds(uids) + } + ); + } else if (suggestion.value_type == 'user') { + preSelectUserIds([suggestion.id.toString()]); + } + } + }); UsersAutoComplete('user', '${c.rhodecode_user.user_id}'); }) diff --git a/rhodecode/tests/functional/test_admin_user_groups.py b/rhodecode/tests/functional/test_admin_user_groups.py --- a/rhodecode/tests/functional/test_admin_user_groups.py +++ b/rhodecode/tests/functional/test_admin_user_groups.py @@ -35,7 +35,8 @@ class TestAdminUsersGroupsController(Tes def test_index(self): self.log_user() - self.app.get(url('users_groups')) + response = self.app.get(url('users_groups')) + response.mustcontain('No members yet') def test_create(self): self.log_user() @@ -148,7 +149,13 @@ class TestAdminUsersGroupsController(Tes fixture.destroy_user_group(users_group_name) def test_edit(self): - self.app.get(url('edit_users_group', user_group_id=1)) + self.log_user() + response = self.app.get(url('edit_users_group', user_group_id=1)) + + def test_edit_user_group_members(self): + self.log_user() + response = self.app.get(url('edit_user_group_members', user_group_id=1)) + response.mustcontain('No members yet') def test_usergroup_escape(self): user = User.get_by_username('test_admin')