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} &copy; 2010 by Marcin Kuzminski</p>
+		       <p>RhodeCode ${c.rhodecode_version} &copy; 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")}