Mercurial > kallithea
changeset 1015:65129c332d37 beta
#56 added ajax removal of users groups,
fixed permission edition templates by regular non admin users
found bugfixes in forms for users groups
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Wed, 09 Feb 2011 17:41:27 +0100 |
parents | 6fdc3ff65fce |
children | 3790279d2538 |
files | rhodecode/config/routing.py rhodecode/controllers/admin/repos.py rhodecode/controllers/settings.py rhodecode/model/db.py rhodecode/model/forms.py rhodecode/model/repo.py rhodecode/templates/admin/repos/repo_edit.html rhodecode/templates/admin/repos/repo_edit_perms.html rhodecode/templates/base/base.html rhodecode/templates/settings/repo_settings.html |
diffstat | 10 files changed, 196 insertions(+), 173 deletions(-) [+] |
line wrap: on
line diff
--- a/rhodecode/config/routing.py Wed Feb 09 15:16:28 2011 +0100 +++ b/rhodecode/config/routing.py Wed Feb 09 17:41:27 2011 +0100 @@ -73,6 +73,11 @@ m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*}", action="delete_perm_user", conditions=dict(method=["DELETE"], function=check_repo)) + #ajax delete repo perm users_group + m.connect('delete_repo_users_group', "/repos_delete_users_group/{repo_name:.*}", + action="delete_perm_users_group", conditions=dict(method=["DELETE"], + function=check_repo)) + #settings actions m.connect('repo_stats', "/repos_stats/{repo_name:.*}", action="repo_stats", conditions=dict(method=["DELETE"],
--- a/rhodecode/controllers/admin/repos.py Wed Feb 09 15:16:28 2011 +0100 +++ b/rhodecode/controllers/admin/repos.py Wed Feb 09 17:41:27 2011 +0100 @@ -215,8 +215,8 @@ @HasPermissionAllDecorator('hg.admin') def delete_perm_user(self, repo_name): - """ - DELETE an existing repository permission user + """DELETE an existing repository permission user + :param repo_name: """ @@ -229,9 +229,24 @@ raise HTTPInternalServerError() @HasPermissionAllDecorator('hg.admin') - def repo_stats(self, repo_name): + def delete_perm_users_group(self, repo_name): + """DELETE an existing repository permission users group + + :param repo_name: """ - DELETE an existing repository statistics + try: + repo_model = RepoModel() + repo_model.delete_perm_users_group(request.POST, repo_name) + except Exception, e: + h.flash(_('An error occurred during deletion of repository' + ' users groups'), + category='error') + raise HTTPInternalServerError() + + @HasPermissionAllDecorator('hg.admin') + def repo_stats(self, repo_name): + """DELETE an existing repository statistics + :param repo_name: """ @@ -245,8 +260,8 @@ @HasPermissionAllDecorator('hg.admin') def repo_cache(self, repo_name): - """ - INVALIDATE existing repository cache + """INVALIDATE existing repository cache + :param repo_name: """ @@ -267,8 +282,9 @@ """GET /repos/repo_name/edit: Form to edit an existing item""" # url('edit_repo', repo_name=ID) repo_model = RepoModel() + c.repo_info = repo_model.get_by_repo_name(repo_name) + r = ScmModel().get(repo_name) - c.repo_info = repo_model.get_by_repo_name(repo_name) if c.repo_info is None: h.flash(_('%s repository is not mapped to db perhaps' @@ -293,7 +309,12 @@ c.stats_percentage = '%.2f' % ((float((last_rev)) / c.repo_last_rev) * 100) + c.users_array = repo_model.get_users_js() + c.users_groups_array = repo_model.get_users_groups_js() + defaults = c.repo_info.get_dict() + + #fill owner if c.repo_info.user: defaults.update({'user':c.repo_info.user.username}) else: @@ -301,11 +322,15 @@ .filter(User.admin == True).first().username defaults.update({'user':replacement_user}) - c.users_array = repo_model.get_users_js() - c.users_groups_array = repo_model.get_users_groups_js() + #fill repository users for p in c.repo_info.repo_to_perm: - defaults.update({'perm_%s' % p.user.username: + defaults.update({'u_perm_%s' % p.user.username: + p.permission.permission_name}) + + #fill repository groups + for p in c.repo_info.users_group_to_perm: + defaults.update({'g_perm_%s' % p.users_group.users_group_name: p.permission.permission_name}) return htmlfill.render(
--- a/rhodecode/controllers/settings.py Wed Feb 09 15:16:28 2011 +0100 +++ b/rhodecode/controllers/settings.py Wed Feb 09 17:41:27 2011 +0100 @@ -41,6 +41,7 @@ from rhodecode.lib.utils import invalidate_cache, action_logger from rhodecode.model.forms import RepoSettingsForm, RepoForkForm from rhodecode.model.repo import RepoModel +from rhodecode.model.db import User log = logging.getLogger(__name__) @@ -62,12 +63,28 @@ category='error') return redirect(url('home')) - defaults = c.repo_info.get_dict() - defaults.update({'user':c.repo_info.user.username}) + c.users_array = repo_model.get_users_js() + c.users_groups_array = repo_model.get_users_groups_js() + defaults = c.repo_info.get_dict() + + #fill owner + if c.repo_info.user: + defaults.update({'user':c.repo_info.user.username}) + else: + replacement_user = self.sa.query(User)\ + .filter(User.admin == True).first().username + defaults.update({'user':replacement_user}) + + #fill repository users for p in c.repo_info.repo_to_perm: - defaults.update({'perm_%s' % p.user.username: + defaults.update({'u_perm_%s' % p.user.username: + p.permission.permission_name}) + + #fill repository groups + for p in c.repo_info.users_group_to_perm: + defaults.update({'g_perm_%s' % p.users_group.users_group_name: p.permission.permission_name}) return htmlfill.render(
--- a/rhodecode/model/db.py Wed Feb 09 15:16:28 2011 +0100 +++ b/rhodecode/model/db.py Wed Feb 09 17:41:27 2011 +0100 @@ -202,6 +202,7 @@ fork = relationship('Repository', remote_side=repo_id) group = relationship('Group') repo_to_perm = relationship('RepoToPerm', cascade='all') + users_group_to_perm = relationship('UsersGroupToPerm', cascade='all') stats = relationship('Statistics', cascade='all', uselist=False) repo_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
--- a/rhodecode/model/forms.py Wed Feb 09 15:16:28 2011 +0100 +++ b/rhodecode/model/forms.py Wed Feb 09 17:41:27 2011 +0100 @@ -246,24 +246,25 @@ perms_new = [] #build a list of permission to update and new permission to create for k, v in value.items(): - if k.startswith('perm_'): - if k.startswith('perm_new_member'): - #means new added member to permissions - 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') + #means new added member to permissions + 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') - 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)) - else: - usr = k[5:] - t = 'user' - if usr == 'default': - if value['private']: - #set none for default when updating to private repo - v = 'repository.none' - perms_update.append((usr, v, t)) + 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_'): + member = k[7:] + t = {'u':'user', + 'g':'users_group'}[k[0]] + if member == 'default': + if value['private']: + #set none for default when updating to private repo + v = 'repository.none' + perms_update.append((member, v, t)) + value['perms_updates'] = perms_update value['perms_new'] = perms_new @@ -352,8 +353,10 @@ def to_python(self, value, state): if not value or not isinstance(value, (str, unicode)): - raise formencode.Invalid(_("The LDAP Login attribute of the CN must be specified " - "- this is the name of the attribute that is equivalent to 'username'"), + raise formencode.Invalid(_("The LDAP Login attribute of the CN " + "must be specified - this is the name " + "of the attribute that is equivalent " + "to 'username'"), value, state) return value
--- a/rhodecode/model/repo.py Wed Feb 09 15:16:28 2011 +0100 +++ b/rhodecode/model/repo.py Wed Feb 09 17:41:27 2011 +0100 @@ -255,6 +255,19 @@ self.sa.rollback() raise + def delete_perm_users_group(self, form_data, repo_name): + try: + self.sa.query(UsersGroupToPerm)\ + .filter(UsersGroupToPerm.repository \ + == self.get_by_repo_name(repo_name))\ + .filter(UsersGroupToPerm.users_group_id \ + == form_data['users_group_id']).delete() + self.sa.commit() + except: + log.error(traceback.format_exc()) + self.sa.rollback() + raise + def delete_stats(self, repo_name): try: self.sa.query(Statistics)\
--- a/rhodecode/templates/admin/repos/repo_edit.html Wed Feb 09 15:16:28 2011 +0100 +++ b/rhodecode/templates/admin/repos/repo_edit.html Wed Feb 09 17:41:27 2011 +0100 @@ -93,76 +93,8 @@ <label for="input">${_('Permissions')}:</label> </div> <div class="input"> - <table id="permissions_manage"> - <tr> - <td>${_('none')}</td> - <td>${_('read')}</td> - <td>${_('write')}</td> - <td>${_('admin')}</td> - <td>${_('member')}</td> - <td></td> - </tr> - - %for r2p in c.repo_info.repo_to_perm: - %if r2p.user.username =='default' and c.repo_info.private: - <tr> - <td colspan="4"> - <span class="private_repo_msg"> - ${_('private repository')} - </span> - </td> - <td class="private_repo_msg">${r2p.user.username}</td> - </tr> - %else: - <tr id="id${id(r2p.user.username)}"> - <td>${h.radio('perm_%s' % r2p.user.username,'repository.none')}</td> - <td>${h.radio('perm_%s' % r2p.user.username,'repository.read')}</td> - <td>${h.radio('perm_%s' % r2p.user.username,'repository.write')}</td> - <td>${h.radio('perm_%s' % r2p.user.username,'repository.admin')}</td> - <td>${r2p.user.username}</td> - <td> - %if r2p.user.username !='default': - <span class="delete_icon action_button" onclick="ajaxAction(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')"> - <script type="text/javascript"> - function ajaxAction(user_id,field_id){ - var sUrl = "${h.url('delete_repo_user',repo_name=c.repo_name)}"; - var callback = { success:function(o){ - var tr = YAHOO.util.Dom.get(String(field_id)); - tr.parentNode.removeChild(tr);},failure:function(o){ - alert("${_('Failed to remove user')}");},}; - var postData = '_method=delete&user_id='+user_id; - var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);}; - </script> - </span> - %endif - </td> - </tr> - %endif - %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> - <tr> - <td colspan="6"> - <span id="add_perm" class="add_icon" style="cursor: pointer;"> - ${_('Add another member')} - </span> - </td> - </tr> - </table> - </div> + <%include file="repo_edit_perms.html"/> + </div> <div class="buttons"> ${h.submit('save','Save',class_="ui-button")}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rhodecode/templates/admin/repos/repo_edit_perms.html Wed Feb 09 17:41:27 2011 +0100 @@ -0,0 +1,95 @@ +<table id="permissions_manage"> + <tr> + <td>${_('none')}</td> + <td>${_('read')}</td> + <td>${_('write')}</td> + <td>${_('admin')}</td> + <td>${_('member')}</td> + <td></td> + </tr> + ## USERS + <script type="text/javascript"> + function ajaxActionUser(user_id,field_id){ + var sUrl = "${h.url('delete_repo_user',repo_name=c.repo_name)}"; + var callback = { success:function(o){ + var tr = YUD.get(String(field_id)); + tr.parentNode.removeChild(tr);}, + failure:function(o){ + alert("${_('Failed to remove user')}");},}; + var postData = '_method=delete&user_id='+user_id; + var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);}; + </script> + %for r2p in c.repo_info.repo_to_perm: + %if r2p.user.username =='default' and c.repo_info.private: + <tr> + <td colspan="4"> + <span class="private_repo_msg"> + ${_('private repository')} + </span> + </td> + <td class="private_repo_msg"><img style="vertical-align:bottom" src="/images/icons/user.png"/>${r2p.user.username}</td> + </tr> + %else: + <tr id="id${id(r2p.user.username)}"> + <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.none')}</td> + <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.read')}</td> + <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.write')}</td> + <td>${h.radio('u_perm_%s' % r2p.user.username,'repository.admin')}</td> + <td style="white-space: nowrap;"><img style="vertical-align:bottom" src="/images/icons/user.png"/>${r2p.user.username}</td> + <td> + %if r2p.user.username !='default': + <span class="delete_icon action_button" onclick="ajaxActionUser(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')"> + </span> + %endif + </td> + </tr> + %endif + %endfor + + ## USERS GROUPS + <script type="text/javascript"> + function ajaxActionUsersGroup(users_group_id,field_id){ + var sUrl = "${h.url('delete_repo_users_group',repo_name=c.repo_name)}"; + var callback = { success:function(o){ + var tr = YUD.get(String(field_id)); + tr.parentNode.removeChild(tr);}, + failure:function(o){ + alert("${_('Failed to remove users group')}");},}; + var postData = '_method=delete&users_group_id='+users_group_id; + var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);}; + </script> + %for g2p in c.repo_info.users_group_to_perm: + <tr id="id${id(g2p.users_group.users_group_name)}"> + <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.none')}</td> + <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.read')}</td> + <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.write')}</td> + <td>${h.radio('g_perm_%s' % g2p.users_group.users_group_name,'repository.admin')}</td> + <td><img style="vertical-align:bottom" src="/images/icons/group.png"/>${g2p.users_group.users_group_name}</td> + <td> + <span class="delete_icon action_button" onclick="ajaxActionUsersGroup(${g2p.users_group.users_group_id},'${'id%s'%id(g2p.users_group.users_group_name)}')"> + </span> + </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> + <tr> + <td colspan="6"> + <span id="add_perm" class="add_icon" style="cursor: pointer;"> + ${_('Add another member')} + </span> + </td> + </tr> +</table> \ No newline at end of file
--- a/rhodecode/templates/base/base.html Wed Feb 09 15:16:28 2011 +0100 +++ b/rhodecode/templates/base/base.html Wed Feb 09 17:41:27 2011 +0100 @@ -102,7 +102,7 @@ <div> <p class="footer-link">${h.link_to(_('Submit a bug'),h.url('bugtracker'))}</p> <p class="footer-link">${h.link_to(_('GPL license'),h.url('gpl_license'))}</p> - <p>RhodeCode ${c.rhodecode_version} © 2010 by Marcin Kuzminski</p> + <p>RhodeCode ${c.rhodecode_version} © 2010-2011 by Marcin Kuzminski</p> </div> </div> <script type="text/javascript">
--- a/rhodecode/templates/settings/repo_settings.html Wed Feb 09 15:16:28 2011 +0100 +++ b/rhodecode/templates/settings/repo_settings.html Wed Feb 09 17:41:27 2011 +0100 @@ -56,76 +56,8 @@ <label for="">${_('Permissions')}:</label> </div> <div class="input"> - <table id="permissions_manage"> - <tr> - <td>${_('none')}</td> - <td>${_('read')}</td> - <td>${_('write')}</td> - <td>${_('admin')}</td> - <td>${_('user')}</td> - <td></td> - </tr> - - %for r2p in c.repo_info.repo_to_perm: - %if r2p.user.username =='default' and c.repo_info.private: - <tr> - <td colspan="4"> - <span class="private_repo_msg"> - ${_('private repository')} - </span> - </td> - <td class="private_repo_msg">${r2p.user.username}</td> - </tr> - %else: - <tr id="id${id(r2p.user.username)}"> - <td>${h.radio('perm_%s' % r2p.user.username,'repository.none')}</td> - <td>${h.radio('perm_%s' % r2p.user.username,'repository.read')}</td> - <td>${h.radio('perm_%s' % r2p.user.username,'repository.write')}</td> - <td>${h.radio('perm_%s' % r2p.user.username,'repository.admin')}</td> - <td>${r2p.user.username}</td> - <td> - %if r2p.user.username !='default': - <span class="delete_icon action_button" onclick="ajaxAction(${r2p.user.user_id},'${'id%s'%id(r2p.user.username)}')"> - <script type="text/javascript"> - function ajaxAction(user_id,field_id){ - var sUrl = "${h.url('delete_repo_user',repo_name=c.repo_name)}"; - var callback = { success:function(o){ - var tr = YAHOO.util.Dom.get(String(field_id)); - tr.parentNode.removeChild(tr);},failure:function(o){ - alert("${_('Failed to remove user')}");},}; - var postData = '_method=delete&user_id='+user_id; - var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);}; - </script> - </span> - %endif - </td> - </tr> - %endif - %endfor - - - <tr id="add_perm_input"> - <td>${h.radio('perm_new_user','repository.none')}</td> - <td>${h.radio('perm_new_user','repository.read')}</td> - <td>${h.radio('perm_new_user','repository.write')}</td> - <td>${h.radio('perm_new_user','repository.admin')}</td> - <td class='ac'> - <div class="perm_ac" id="perm_ac"> - ${h.text('perm_new_user_name',class_='yui-ac-input')} - <div id="perm_container"></div> - </div> - </td> - <td></td> - </tr> - <tr> - <td colspan="6"> - <span id="add_perm" class="add_icon" style="cursor: pointer;"> - ${_('Add another user')} - </span> - </td> - </tr> - </table> - </div> + <%include file="../admin/repos/repo_edit_perms.html"/> + </div> <div class="buttons"> ${h.submit('update','Update',class_="ui-button")}