changeset 380:ca54622e39a1

Added separate create repository views for non administrative users. Fixed permission issue with private repos
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 01 Aug 2010 17:08:58 +0200
parents 86a25ad59766
children 55377fdc1fc6
files pylons_app/__init__.py pylons_app/config/routing.py pylons_app/controllers/admin/repos.py pylons_app/controllers/admin/settings.py pylons_app/lib/auth.py pylons_app/templates/admin/repos/repo_add_create_repository.html pylons_app/templates/base/base.html pylons_app/templates/index.html
diffstat 8 files changed, 103 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/pylons_app/__init__.py	Sun Aug 01 13:39:09 2010 +0200
+++ b/pylons_app/__init__.py	Sun Aug 01 17:08:58 2010 +0200
@@ -2,7 +2,7 @@
 # encoding: utf-8
 # Hg app, a web based mercurial repository managment based on pylons
 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
- 
+# 
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
 # as published by the Free Software Foundation; version 2
@@ -17,7 +17,6 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 # MA  02110-1301, USA.
-
 """
 Created on April 9, 2010
 Hg app, a web based mercurial repository managment based on pylons
--- a/pylons_app/config/routing.py	Sun Aug 01 13:39:09 2010 +0200
+++ b/pylons_app/config/routing.py	Sun Aug 01 17:08:58 2010 +0200
@@ -100,6 +100,8 @@
              action="my_account", conditions=dict(method=["GET"]))
         m.connect("admin_settings_my_account_update", "/my_account_update",
              action="my_account_update", conditions=dict(method=["PUT"]))
+        m.connect("admin_settings_create_repository", "/create_repository",
+             action="create_repository", conditions=dict(method=["GET"]))
     
     #ADMIN
     with map.submapper(path_prefix='/_admin', controller='admin/admin') as m:
--- a/pylons_app/controllers/admin/repos.py	Sun Aug 01 13:39:09 2010 +0200
+++ b/pylons_app/controllers/admin/repos.py	Sun Aug 01 17:08:58 2010 +0200
@@ -29,7 +29,8 @@
 from pylons.controllers.util import abort, redirect
 from pylons.i18n.translation import _
 from pylons_app.lib import helpers as h
-from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator
+from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator, \
+    HasPermissionAnyDecorator
 from pylons_app.lib.base import BaseController, render
 from pylons_app.lib.utils import invalidate_cache
 from pylons_app.model.db import User
@@ -49,12 +50,13 @@
     #     map.resource('repo', 'repos')
     
     @LoginRequired()
-    @HasPermissionAllDecorator('hg.admin')
+    @HasPermissionAnyDecorator('hg.admin', 'repository.create')
     def __before__(self):
         c.admin_user = session.get('admin_user')
         c.admin_username = session.get('admin_username')
         super(ReposController, self).__before__()
-                
+    
+    @HasPermissionAllDecorator('hg.admin')            
     def index(self, format='html'):
         """GET /repos: All items in the collection"""
         # url('repos')
@@ -62,6 +64,7 @@
         c.repos_list = sorted(cached_repo_list, key=itemgetter('name_sort'))
         return render('admin/repos/repos.html')
     
+    @HasPermissionAnyDecorator('hg.admin', 'repository.create')
     def create(self):
         """POST /repos: Create a new item"""
         # url('repos')
@@ -77,8 +80,14 @@
                                                              
         except formencode.Invalid as errors:
             c.new_repo = errors.value['repo_name']
+            
+            if request.POST.get('user_created'):
+                r = render('admin/repos/repo_add_create_repository.html')
+            else:
+                r = render('admin/repos/repo_add.html')
+            
             return htmlfill.render(
-                render('admin/repos/repo_add.html'),
+                r,
                 defaults=errors.value,
                 errors=errors.error_dict or {},
                 prefix_error=False,
@@ -89,16 +98,19 @@
             msg = _('error occured during creation of repository %s') \
                     % form_result.get('repo_name')
             h.flash(msg, category='error')
-            
-        return redirect('repos')
-
+        if request.POST.get('user_created'):
+            return redirect(url('hg_home'))    
+        return redirect(url('repos'))
+    
+    @HasPermissionAllDecorator('hg.admin')
     def new(self, format='html'):
         """GET /repos/new: Form to create a new item"""
         new_repo = request.GET.get('repo', '')
         c.new_repo = h.repo_name_slug(new_repo)
 
         return render('admin/repos/repo_add.html')
-
+    
+    @HasPermissionAllDecorator('hg.admin')
     def update(self, repo_name):
         """PUT /repos/repo_name: Update an existing item"""
         # Forms posted to this method should contain a hidden field:
@@ -136,6 +148,7 @@
             
         return redirect(url('edit_repo', repo_name=changed_name))
     
+    @HasPermissionAllDecorator('hg.admin')
     def delete(self, repo_name):
         """DELETE /repos/repo_name: Delete an existing item"""
         # Forms posted to this method should contain a hidden field:
@@ -164,7 +177,8 @@
                     category='error')
         
         return redirect(url('repos'))
-        
+    
+    @HasPermissionAllDecorator('hg.admin')        
     def delete_perm_user(self, repo_name):
         """
         DELETE an existing repository permission user
@@ -178,11 +192,13 @@
             h.flash(_('An error occured during deletion of repository user'),
                     category='error')
             raise HTTPInternalServerError()
-        
+    
+    @HasPermissionAllDecorator('hg.admin')    
     def show(self, repo_name, format='html'):
         """GET /repos/repo_name: Show a specific item"""
         # url('repo', repo_name=ID)
-        
+    
+    @HasPermissionAllDecorator('hg.admin')    
     def edit(self, repo_name, format='html'):
         """GET /repos/repo_name/edit: Form to edit an existing item"""
         # url('edit_repo', repo_name=ID)
--- a/pylons_app/controllers/admin/settings.py	Sun Aug 01 13:39:09 2010 +0200
+++ b/pylons_app/controllers/admin/settings.py	Sun Aug 01 17:08:58 2010 +0200
@@ -28,7 +28,8 @@
 from pylons.controllers.util import abort, redirect
 from pylons.i18n.translation import _
 from pylons_app.lib import helpers as h
-from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator
+from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator, \
+    HasPermissionAnyDecorator
 from pylons_app.lib.base import BaseController, render
 from pylons_app.lib.utils import repo2db_mapper, invalidate_cache, \
     set_hg_app_config
@@ -209,4 +210,11 @@
                     
         return redirect(url('my_account'))
     
+    @HasPermissionAnyDecorator('repository.create', 'hg.admin')
+    def create_repository(self):
+        """GET /_admin/create_repository: Form to create a new item"""
+        new_repo = request.GET.get('repo', '')
+        c.new_repo = h.repo_name_slug(new_repo)
 
+        return render('admin/repos/repo_add_create_repository.html')
+        
--- a/pylons_app/lib/auth.py	Sun Aug 01 13:39:09 2010 +0200
+++ b/pylons_app/lib/auth.py	Sun Aug 01 17:08:58 2010 +0200
@@ -140,7 +140,7 @@
 
     if user.is_admin:
         user.permissions['global'].add('hg.admin')
-        #admin have all rights full
+        #admin have all rights set to admin
         for perm in default_perms:
             p = 'repository.admin'
             user.permissions['repositories'][perm.Repo2Perm.repository.repo_name] = p
@@ -148,7 +148,7 @@
     else:
         user.permissions['global'].add('repository.create')
         for perm in default_perms:
-            if perm.Repository.private:
+            if perm.Repository.private and not perm.Repository.user_id == user.user_id:
                 #disable defaults for private repos,
                 p = 'repository.none'
             elif perm.Repository.user_id == user.user_id:
@@ -186,6 +186,7 @@
         user = fill_perms(user)
     session['hg_app_user'] = user
     session.save()
+    print user.permissions
     return user
         
 #===============================================================================
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pylons_app/templates/admin/repos/repo_add_create_repository.html	Sun Aug 01 17:08:58 2010 +0200
@@ -0,0 +1,57 @@
+## -*- coding: utf-8 -*-
+<%inherit file="/base/base.html"/>
+
+<%def name="title()">
+    ${_('Repositories administration')}
+</%def>
+
+<%def name="breadcrumbs_links()">
+	${_('add new repository')}
+</%def>
+
+<%def name="page_nav()">
+	${self.menu('admin')}
+</%def>
+<%def name="main()">
+<div class="box">
+    <!-- box / title -->
+    <div class="title">
+        ${self.breadcrumbs()}      
+    </div>
+    ${h.form(url('repos'))}
+    <div class="form">
+        <!-- fields -->
+        <div class="fields">
+            <div class="field">
+	            <div class="label">
+	                <label for="repo_name">${_('Name')}:</label>
+	            </div>
+	            <div class="input">
+	                ${h.text('repo_name',c.new_repo)}
+	                ${h.hidden('user_created','True')}
+	            </div>
+             </div>
+            <div class="field">
+                <div class="label label-textarea">
+                    <label for="description">${_('Description')}:</label>
+                </div>
+                <div class="textarea text-area editor">
+                    ${h.textarea('description',cols=23,rows=5)}
+                </div>
+             </div>
+            <div class="field">
+                <div class="label label-checkbox">
+                    <label for="private">${_('Private')}:</label>
+                </div>
+                <div class="checkboxes">
+                    ${h.checkbox('private',value="True")}
+                </div>
+             </div>
+	        <div class="buttons">
+	          ${h.submit('add','add',class_="ui-button ui-widget ui-state-default ui-corner-all")}
+	        </div>                                                          
+        </div>
+    </div>    
+    ${h.end_form()}    
+</div>
+</%def>   
--- a/pylons_app/templates/base/base.html	Sun Aug 01 13:39:09 2010 +0200
+++ b/pylons_app/templates/base/base.html	Sun Aug 01 17:08:58 2010 +0200
@@ -204,7 +204,7 @@
 				    <ul>
 				        <li>${h.link_to(_('repositories'),h.url('repos'),class_='repos')}</li>
 				        <li>${h.link_to(_('users'),h.url('users'),class_='users')}</li>
-				        ##<li>${h.link_to(_('permissions'),h.url('permissions'),class_='permissions')}</li>
+				        <li>${h.link_to(_('permissions'),h.url('permissions'),class_='permissions')}</li>
 				        <li>${h.link_to(_('settings'),h.url('admin_settings'),class_='settings')}</li>        
 				    </ul>
                 </li>
--- a/pylons_app/templates/index.html	Sun Aug 01 13:39:09 2010 +0200
+++ b/pylons_app/templates/index.html	Sun Aug 01 17:08:58 2010 +0200
@@ -27,13 +27,13 @@
 	    <!-- box / title -->
 	    <div class="title">
 	        <h5>${_('Dashboard')}</h5>
-	        ##%if h.HasPermissionAll('repository.create')():
+	        %if h.HasPermissionAny('repository.create','hg.admin')():
 	        <ul class="links">
 	          <li>
-	            <span>${h.link_to(u'ADD NEW REPOSITORY',h.url('new_repo'),class_="add_icon")}</span>
+	            <span>${h.link_to(u'ADD NEW REPOSITORY',h.url('admin_settings_create_repository'),class_="add_icon")}</span>
 	          </li>          
 	        </ul>  	        
-	        ##%endif
+	        %endif
 	    </div>
 	    <!-- end box / title -->
         <div class="table">