Mercurial > kallithea
changeset 2759:c61c2ccea2b4 beta
#538 form for permissions can handle multiple users at once
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Wed, 29 Aug 2012 01:07:21 +0200 |
parents | dc4709e7da51 |
children | fd5f2b217488 |
files | docs/changelog.rst rhodecode/lib/utils2.py rhodecode/model/validators.py rhodecode/public/js/rhodecode.js rhodecode/templates/admin/repos/repo_edit_perms.html rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html |
diffstat | 6 files changed, 93 insertions(+), 56 deletions(-) [+] |
line wrap: on
line diff
--- a/docs/changelog.rst Wed Aug 29 00:56:00 2012 +0200 +++ b/docs/changelog.rst Wed Aug 29 01:07:21 2012 +0200 @@ -39,6 +39,9 @@ - Import remote svn repositories to mercurial using hgsubversion - Fixed #508 RhodeCode now has a option to explicitly set forking permissions - RhodeCode can use alternative server for generating avatar icons +- implemented repositories locking. Pull locks, push unlocks. Also can be done + via API calls +- #538 form for permissions can handle multiple users at once fixes +++++
--- a/rhodecode/lib/utils2.py Wed Aug 29 00:56:00 2012 +0200 +++ b/rhodecode/lib/utils2.py Wed Aug 29 01:07:21 2012 +0200 @@ -273,7 +273,6 @@ context._query_start_time = time.time() log.info(color_sql(">>>>> STARTING QUERY >>>>>")) - def after_cursor_execute(conn, cursor, statement, parameters, context, executemany): total = time.time() - context._query_start_time
--- a/rhodecode/model/validators.py Wed Aug 29 00:56:00 2012 +0200 +++ b/rhodecode/model/validators.py Wed Aug 29 01:07:21 2012 +0200 @@ -5,6 +5,7 @@ import re import formencode import logging +from collections import defaultdict from pylons.i18n.translation import _ from webhelpers.pylonslib.secure_form import authentication_token @@ -12,6 +13,7 @@ UnicodeString, OneOf, Int, Number, Regex, Email, Bool, StringBoolean, Set, NotEmpty ) +from rhodecode.lib.compat import OrderedSet from rhodecode.lib.utils import repo_name_slug from rhodecode.model.db import RepoGroup, Repository, UsersGroup, User,\ ChangesetStatus @@ -477,20 +479,34 @@ } def to_python(self, value, state): - perms_update = [] - perms_new = [] + perms_update = OrderedSet() + perms_new = OrderedSet() # build a list of permission to update and new permission to create - for k, v in value.items(): - # means new added member to permissions + + #CLEAN OUT ORG VALUE FROM NEW MEMBERS, and group them using + new_perms_group = defaultdict(dict) + for k, v in value.copy().iteritems(): if k.startswith('perm_new_member'): - new_perm = value.get('perm_new_member', False) - new_member = value.get('perm_new_member_name', False) - new_type = value.get('perm_new_member_type') + del value[k] + _type, part = k.split('perm_new_member_') + args = part.split('_') + if len(args) == 1: + new_perms_group[args[0]]['perm'] = v + elif len(args) == 2: + _key, pos = args + new_perms_group[pos][_key] = v - if new_member and new_perm: - if (new_member, new_perm, new_type) not in perms_new: - perms_new.append((new_member, new_perm, new_type)) - elif k.startswith('u_perm_') or k.startswith('g_perm_'): + # fill new permissions in order of how they were added + for k in sorted(map(int, new_perms_group.keys())): + perm_dict = new_perms_group[str(k)] + new_member = perm_dict['name'] + new_perm = perm_dict['perm'] + new_type = perm_dict['type'] + if new_member and new_perm and new_type: + perms_new.add((new_member, new_perm, new_type)) + + for k, v in value.iteritems(): + if k.startswith('u_perm_') or k.startswith('g_perm_'): member = k[7:] t = {'u': 'user', 'g': 'users_group' @@ -500,10 +516,10 @@ # set none for default when updating to # private repo v = EMPTY_PERM - perms_update.append((member, v, t)) + perms_update.add((member, v, t)) - value['perms_updates'] = perms_update - value['perms_new'] = perms_new + value['perms_updates'] = list(perms_update) + value['perms_new'] = list(perms_new) # update permissions for k, v, t in perms_new:
--- a/rhodecode/public/js/rhodecode.js Wed Aug 29 00:56:00 2012 +0200 +++ b/rhodecode/public/js/rhodecode.js Wed Aug 29 01:07:21 2012 +0200 @@ -908,7 +908,7 @@ /** MEMBERS AUTOCOMPLETE WIDGET **/ -var MembersAutoComplete = function (users_list, groups_list) { +var MembersAutoComplete = function (divid, cont, users_list, groups_list) { var myUsers = users_list; var myGroups = groups_list; @@ -970,7 +970,7 @@ }; // Instantiate AutoComplete for perms - var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS); + var membersAC = new YAHOO.widget.AutoComplete(divid, cont, memberDS); membersAC.useShadow = false; membersAC.resultTypeList = false; membersAC.animVert = false; @@ -1055,7 +1055,7 @@ ownerAC.formatResult = custom_formatter; var myHandler = function (sType, aArgs) { - + var nextId = divid.split('perm_new_member_name_')[1]; var myAC = aArgs[0]; // reference back to the AC instance var elLI = aArgs[1]; // reference to the selected LI element var oData = aArgs[2]; // object literal of selected item's result data @@ -1063,11 +1063,11 @@ if (oData.nname != undefined) { //users myAC.getInputEl().value = oData.nname; - YUD.get('perm_new_member_type').value = 'user'; + YUD.get('perm_new_member_type_'+nextId).value = 'user'; } else { //groups myAC.getInputEl().value = oData.grname; - YUD.get('perm_new_member_type').value = 'users_group'; + YUD.get('perm_new_member_type_'+nextId).value = 'users_group'; } }; @@ -1602,6 +1602,25 @@ return compState; } +var addPermAction = function(_html, users_list, groups_list){ + var elmts = YUD.getElementsByClassName('last_new_member'); + var last_node = elmts[elmts.length-1]; + if (last_node){ + var next_id = (YUD.getElementsByClassName('new_members')).length; + _html = _html.format(next_id); + last_node.innerHTML = _html; + YUD.setStyle(last_node, 'display', ''); + YUD.removeClass(last_node, 'last_new_member'); + MembersAutoComplete("perm_new_member_name_"+next_id, + "perm_container_"+next_id, users_list, groups_list); + //create new last NODE + var el = document.createElement('tr'); + el.id = 'add_perm_input'; + YUD.addClass(el,'last_new_member'); + YUD.addClass(el,'new_members'); + YUD.insertAfter(el, last_node); + } +} /* Multi selectors */
--- a/rhodecode/templates/admin/repos/repo_edit_perms.html Wed Aug 29 00:56:00 2012 +0200 +++ b/rhodecode/templates/admin/repos/repo_edit_perms.html Wed Aug 29 01:07:21 2012 +0200 @@ -60,20 +60,23 @@ </td> </tr> %endfor - <tr id="add_perm_input"> - <td>${h.radio('perm_new_member','repository.none')}</td> - <td>${h.radio('perm_new_member','repository.read')}</td> - <td>${h.radio('perm_new_member','repository.write')}</td> - <td>${h.radio('perm_new_member','repository.admin')}</td> - <td class='ac'> - <div class="perm_ac" id="perm_ac"> - ${h.text('perm_new_member_name',class_='yui-ac-input')} - ${h.hidden('perm_new_member_type')} - <div id="perm_container"></div> - </div> - </td> - <td></td> - </tr> + <% + _tmpl = h.literal("""' \ + <td><input type="radio" value="repository.none" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \ + <td><input type="radio" value="repository.read" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \ + <td><input type="radio" value="repository.write" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \ + <td><input type="radio" value="repository.admin" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \ + <td class="ac"> \ + <div class="perm_ac" id="perm_ac_{0}"> \ + <input class="yui-ac-input" id="perm_new_member_name_{0}" name="perm_new_member_name_{0}" value="" type="text"> \ + <input id="perm_new_member_type_{0}" name="perm_new_member_type_{0}" value="" type="hidden"> \ + <div id="perm_container_{0}"></div> \ + </div> \ + </td> \ + <td></td>'""") + %> + ## ADD HERE DYNAMICALLY NEW INPUTS FROM THE '_tmpl' + <tr class="new_members last_new_member" id="add_perm_input"></tr> <tr> <td colspan="6"> <span id="add_perm" class="add_icon" style="cursor: pointer;"> @@ -118,11 +121,8 @@ YUD.setStyle('add_perm_input', 'display', 'none'); } YAHOO.util.Event.addListener('add_perm', 'click', function () { - YUD.setStyle('add_perm_input', 'display', ''); - YUD.setStyle('add_perm', 'opacity', '0.6'); - YUD.setStyle('add_perm', 'cursor', 'default'); + addPermAction(${_tmpl}, ${c.users_array|n}, ${c.users_groups_array|n}); }); - MembersAutoComplete(${c.users_array|n}, ${c.users_groups_array|n}); }); </script>
--- a/rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html Wed Aug 29 00:56:00 2012 +0200 +++ b/rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html Wed Aug 29 01:07:21 2012 +0200 @@ -44,20 +44,23 @@ </td> </tr> %endfor - <tr id="add_perm_input"> - <td>${h.radio('perm_new_member','group.none')}</td> - <td>${h.radio('perm_new_member','group.read')}</td> - <td>${h.radio('perm_new_member','group.write')}</td> - <td>${h.radio('perm_new_member','group.admin')}</td> - <td class='ac'> - <div class="perm_ac" id="perm_ac"> - ${h.text('perm_new_member_name',class_='yui-ac-input')} - ${h.hidden('perm_new_member_type')} - <div id="perm_container"></div> - </div> - </td> - <td></td> - </tr> +<% + _tmpl = h.literal("""' \ + <td><input type="radio" value="group.none" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \ + <td><input type="radio" value="group.read" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \ + <td><input type="radio" value="group.write" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \ + <td><input type="radio" value="group.admin" name="perm_new_member_{0}" id="perm_new_member_{0}"></td> \ + <td class="ac"> \ + <div class="perm_ac" id="perm_ac_{0}"> \ + <input class="yui-ac-input" id="perm_new_member_name_{0}" name="perm_new_member_name_{0}" value="" type="text"> \ + <input id="perm_new_member_type_{0}" name="perm_new_member_type_{0}" value="" type="hidden"> \ + <div id="perm_container_{0}"></div> \ + </div> \ + </td> \ + <td></td>'""") + %> + ## ADD HERE DYNAMICALLY NEW INPUTS FROM THE '_tmpl' + <tr class="new_members last_new_member" id="add_perm_input"></tr> <tr> <td colspan="6"> <span id="add_perm" class="add_icon" style="cursor: pointer;"> @@ -102,11 +105,8 @@ YUD.setStyle('add_perm_input', 'display', 'none'); } YAHOO.util.Event.addListener('add_perm', 'click', function () { - YUD.setStyle('add_perm_input', 'display', ''); - YUD.setStyle('add_perm', 'opacity', '0.6'); - YUD.setStyle('add_perm', 'cursor', 'default'); + addPermAction(${_tmpl}, ${c.users_array|n}, ${c.users_groups_array|n}); }); - MembersAutoComplete(${c.users_array|n}, ${c.users_groups_array|n}); }); </script>