Fixes for some of the features that use the new library permissions.

This commit is contained in:
Greg Von Kuster
2009-02-03 16:43:11 -05:00
parent a691c492d9
commit 03dbdba69a
8 changed files with 171 additions and 66 deletions
+1 -2
View File
@@ -142,7 +142,6 @@ class JobToOutputDatasetAssociation( object ):
self.dataset = dataset
class Group( object ):
permitted_actions = get_permitted_actions( filter='GROUP' )
def __init__( self, name = None ):
self.name = name
self.deleted = False
@@ -269,7 +268,7 @@ class LibraryFolderPermissions( object ):
def __init__( self, action, library_item, role ):
self.action = action
if isinstance( library_item, LibraryFolder ):
self.library_folder = library_item
self.folder = library_item
else:
raise "Invalid LibraryFolder specified: %s" % library_item.__class__.__name__
self.role = role
+12 -1
View File
@@ -114,7 +114,18 @@ class GalaxyRBACAgent( RBACAgent ):
allowed_role_assocs = []
for item_class, permission_class, info_association_class in self.library_item_assocs:
if isinstance( library_item, item_class ):
allowed_role_assocs = permission_class.filter_by( action = action.action ).all()
if permission_class == self.model.LibraryPermissions:
allowed_role_assocs = permission_class.filter_by( action=action.action, library_id=library_item.id ).all()
elif permission_class == self.model.LibraryFolderPermissions:
allowed_role_assocs = permission_class.filter_by( action=action.action, library_folder_id=library_item.id ).all()
elif permission_class == self.model.LibraryDatasetPermissions:
allowed_role_assocs = permission_class.filter_by( action=action.action, library_dataset_id=library_item.id ).all()
elif permission_class == self.model.LibraryDatasetDatasetAssociationPermissions:
allowed_role_assocs = permission_class.filter_by( action=action.action, library_dataset_dataset_association_id=library_item.id ).all()
elif permission_class == self.model.LibraryItemInfoPermissions:
allowed_role_assocs = permission_class.filter_by( action=action.action, library_item_info_id=library_item.id ).all()
elif permission_class == self.model.LibraryItemInfoTemplatePermissions:
allowed_role_assocs = permission_class.filter_by( action=action.action, library_item_info_template_id=library_item.id ).all()
for allowed_role_assoc in allowed_role_assocs:
if allowed_role_assoc.role_id in user_role_ids:
return True
+16 -7
View File
@@ -958,11 +958,11 @@ class Admin( BaseController ):
action = 'update_roles'
else:
msg = "Invalid action attempted on folder."
return trans.response.send_redirect( web.url_for( action='library_browser', msg=util.sanitize_text( msg ), messagetype='error' ) )
return trans.response.send_redirect( web.url_for( controller='admin', action='library_browser', msg=util.sanitize_text( msg ), messagetype='error' ) )
folder = trans.app.model.LibraryFolder.get( id )
if not folder:
msg = "Invalid folder specified, id: %s" % str( id )
return trans.response.send_redirect( web.url_for( action='library_browser', msg=util.sanitize_text( msg ), messagetype='error' ) )
return trans.response.send_redirect( web.url_for( controller='admin', action='library_browser', msg=util.sanitize_text( msg ), messagetype='error' ) )
if action == 'new':
if params.new == 'submitted':
new_folder = trans.app.model.LibraryFolder( name=util.restore_text( params.name ),
@@ -973,8 +973,11 @@ class Admin( BaseController ):
new_folder.genome_build = util.dbnames.default_value
folder.add_folder( new_folder )
new_folder.flush()
msg = "New folder named '%s' has been added to this library" % new_folder.name
return trans.response.send_redirect( web.url_for( action='folder', id=new_folder.id, msg=util.sanitize_text( msg ), messagetype='done' ) )
msg = "New folder named '%s' has been added to the library" % new_folder.name
return trans.response.send_redirect( web.url_for( controller='admin',
action='library_browser',
msg=util.sanitize_text( msg ),
messagetype='done' ) )
return trans.fill_template( '/admin/library/new_folder.mako', folder=folder, msg=msg, messagetype=messagetype )
elif action == 'rename':
if params.rename == 'submitted':
@@ -989,7 +992,10 @@ class Admin( BaseController ):
folder.description = new_description
folder.flush()
msg = "Folder '%s' has been renamed to '%s'" % ( old_name, new_name )
return trans.response.send_redirect( web.url_for( action='library_browser', msg=util.sanitize_text( msg ), messagetype='done' ) )
return trans.response.send_redirect( web.url_for( controller='admin',
action='library_browser',
msg=util.sanitize_text( msg ),
messagetype='done' ) )
return trans.fill_template( '/admin/library/rename_folder.mako', folder=folder, msg=msg, messagetype=messagetype )
elif action == 'delete':
def delete_folder( folder ):
@@ -1008,12 +1014,15 @@ class Admin( BaseController ):
# The user clicked the Save button on the 'Associate With Roles' form
permissions = {}
for k, v in trans.app.model.Library.permitted_actions.items():
in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
in_roles = [ trans.app.model.Role.get( int( x ) ) for x in util.listify( params.get( k + '_in', [] ) ) ]
permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
trans.app.security_agent.set_all_library_permissions( folder, permissions )
folder.refresh()
msg = "Permissions updated for folder '%s'" % folder.name
return trans.response.send_redirect( web.url_for( action='library_browser', msg=util.sanitize_text( msg ), messagetype='done' ) )
return trans.response.send_redirect( web.url_for( controller='admin',
action='library_browser',
msg=util.sanitize_text( msg ),
messagetype='done' ) )
@web.expose
@web.require_admin
def library_dataset( self, trans, id=None, name=None, info=None, **kwd ):
+70 -38
View File
@@ -14,7 +14,10 @@ log = logging.getLogger( __name__ )
class Library( BaseController ):
@web.expose
def browse( self, trans, msg=None, messagetype=None, **kwd ):
def browse( self, trans, **kwd ):
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
libraries = trans.app.model.Library.filter( trans.app.model.Library.table.c.deleted==False ) \
.order_by( trans.app.model.Library.table.c.name ).all()
return trans.fill_template( '/library/browser.mako',
@@ -315,59 +318,88 @@ class Library( BaseController ):
msg=msg,
messagetype=messagetype )
@web.expose
def folder( self, trans, folder_id, name=None, description=None, **kwd ):
def folder( self, trans, folder_id, **kwd ):
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
if name:
name = util.restore_text( name )
if description:
description = util.restore_text( description )
if params.get( 'new', False ):
action = 'new'
elif params.get( 'rename', False ):
action = 'rename'
elif params.get( 'delete', False ):
action = 'delete'
elif params.get( 'update_roles', False ):
action = 'update_roles'
else:
msg = "Invalid action attempted on folder."
return trans.response.send_redirect( web.url_for( controller='library', action='browse', msg=util.sanitize_text( msg ), messagetype='error' ) )
folder = trans.app.model.LibraryFolder.get( int( folder_id ) )
if not folder:
msg = "Invalid library folder specified, id: %s" %str( id )
msg = "Invalid folder specified, id: %s" %str( id )
return trans.response.send_redirect( web.url_for( controller='library', action='browse', msg=util.sanitize_text( msg ), messagetype='error' ) )
if 'save' in kwd:
if trans.app.security_agent.allow_action( trans.user,
trans.app.security_agent.permitted_actions.LIBRARY_MODIFY,
library_item=folder ):
folder.name = name
folder.description = description
trans.app.model.flush()
msg = 'Attributes updated for library folder %s' % folder.name
else:
msg = "You are not authorized to modify this folder"
messagetype = "error"
elif 'update_roles' in kwd:
if action == 'new':
if params.new == 'submitted':
# Create the new folder, then return manage_folder template for new folder.
# New folders default to having the same permissions as their parent folder
new_folder = trans.app.model.LibraryFolder( name=util.restore_text( params.name ),
description=util.restore_text( params.description ) )
new_folder.genome_build = util.dbnames.default_value
folder.add_folder( new_folder )
new_folder.flush()
trans.app.security_agent.copy_library_permissions( folder, new_folder, user = trans.get_user() )
folder = new_folder
msg = "New folder named '%s' has been added to the library" % new_folder.name
return trans.response.send_redirect( web.url_for( controller='library',
action='browse',
msg=util.sanitize_text( msg ),
messagetype='done' ) )
return trans.fill_template( '/library/new_folder.mako', folder=folder, msg=msg, messagetype=messagetype )
elif action == 'rename':
if params.rename == 'submitted':
if trans.app.security_agent.allow_action( trans.user,
trans.app.security_agent.permitted_actions.LIBRARY_MODIFY,
library_item=folder ):
old_name = folder.name
new_name = util.restore_text( params.name )
new_description = util.restore_text( params.description )
if not new_name:
msg = 'Enter a valid name'
return trans.fill_template( "/library/manage_folder.mako", folder=folder, msg=msg, messagetype='error' )
else:
folder.name = new_name
folder.description = new_description
folder.flush()
msg = "Folder '%s' has been renamed to '%s'" % ( old_name, new_name )
return trans.response.send_redirect( web.url_for( controller='library',
action='browse',
msg=util.sanitize_text( msg ),
messagetype='done' ) )
else:
msg = "You are not authorized to rename this folder"
messagetype = "error"
elif action == 'update_roles':
# The user clicked the Save button on the 'Associate With Roles' form
if trans.app.security_agent.allow_action( trans.user,
trans.app.security_agent.permitted_actions.LIBRARY_MANAGE,
library_item=folder ):
permissions = {}
for k, v in trans.app.model.Library.permitted_actions.items():
in_roles = [ trans.app.model.Role.get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
in_roles = [ trans.app.model.Role.get( int( x ) ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
trans.app.security_agent.set_all_library_permissions( folder, permissions )
folder.refresh()
msg = 'Permissions updated for library folder %s' % folder.name
msg = 'Permissions updated for folder %s' % folder.name
return trans.response.send_redirect( web.url_for( controller='library',
action='browse',
msg=util.sanitize_text( msg ),
messagetype='done' ) )
else:
msg = "You are not authorized to manage permissions on this library"
messagetype = "error"
elif 'create_new' in kwd:
# Create the new folder, then return manage_folder template for new folder.
# New folders default to having the same permissions as their parent folder
new_folder = trans.app.model.LibraryFolder( name = name, description = description )
new_folder.flush()
folder.add_folder( new_folder )
new_folder.flush()
trans.app.security_agent.copy_library_permissions( folder, new_folder, user = trans.get_user() )
folder = new_folder
msg = "New folder (%s) created." % ( new_folder.name )
return trans.fill_template( "/library/manage_folder.mako",
folder=folder,
err=None,
msg=msg,
messagetype=messagetype )
msg = "You are not authorized to manage permissions on this folder"
return trans.response.send_redirect( web.url_for( controller='library',
action='browse',
msg=util.sanitize_text( msg ),
messagetype='error' ) )
return trans.fill_template( "/library/manage_folder.mako", folder=folder, msg=msg, messagetype=messagetype )
@web.expose
def edit_library( self, trans, id=None, **kwd ):
raise Exception( 'Not yet implemented' )
+1 -1
View File
@@ -50,4 +50,4 @@
${render_permission_form( folder, folder.name, h.url_for( action='folder' ), 'id', folder.id, roles )}
${render_available_templates( folder )}
${render_available_templates( folder )}
+25 -12
View File
@@ -110,6 +110,7 @@ def name_sorted( l ):
def show_folder():
if trans.app.security_agent.check_folder_contents( trans.user, parent ) or trans.app.security_agent.show_library_item( trans.user, parent ):
return True
return False
if not show_folder:
return ""
pad = parent_pad + 20
@@ -121,6 +122,9 @@ def name_sorted( l ):
expander = "/static/images/silk/resultset_next.png"
folder = "/static/images/silk/folder.png"
subfolder = True
add_folder_item = trans.app.security_agent.allow_action( trans.user, trans.app.security_agent.permitted_actions.LIBRARY_ADD, library_item=parent )
modify_folder = trans.app.security_agent.allow_action( trans.user, trans.app.security_agent.permitted_actions.LIBRARY_MODIFY, library_item=parent )
manage_folder = trans.app.security_agent.allow_action( trans.user, trans.app.security_agent.permitted_actions.LIBRARY_MANAGE, library_item=parent )
%>
<li class="folderRow libraryOrFolderRow" style="padding-left: ${pad}px;">
<input type="checkbox" class="folderCheckbox" style="float: left;"/>
@@ -130,12 +134,23 @@ def name_sorted( l ):
%if parent.description:
<i>- ${parent.description}</i>
%endif
<a id="folder-${parent.id}-popup" class="popup-arrow" style="display: none;">&#9660;</a>
<div popupmenu="folder-${parent.id}-popup">
%if trans.app.security_agent.allow_action( trans.user, trans.app.security_agent.permitted_actions.LIBRARY_MANAGE, library_item=parent ):
<a class="action-button" href="${h.url_for( controller='library', action='folder', folder_id=parent.id )}">Manage folder</a>
%endif
</div>
%if add_folder_item or modify_folder or manage_folder:
<a id="folder-${parent.id}-popup" class="popup-arrow" style="display: none;">&#9660;</a>
<div popupmenu="folder-${parent.id}-popup">
%endif
%if add_folder_item:
<a class="action-button" href="${h.url_for( controller='library', action='dataset', folder_id=parent.id )}">Add a new dataset to this folder</a>
<a class="action-button" href="${h.url_for( controller='library', action='folder', new=True, folder_id=parent.id )}">Create a new sub-folder in this folder</a>
%endif
%if modify_folder:
<a class="action-button" href="${h.url_for( controller='library', action='folder', rename=True, folder_id=parent.id )}">Rename this folder</a>
%endif
%if manage_folder:
<a class="action-button" href="${h.url_for( controller='library', action='folder', rename=True, folder_id=parent.id )}">Manage this folder</a>
%endif
%if add_folder_item or modify_folder or manage_folder:
</div>
%endif
</div>
</li>
%if subfolder:
@@ -179,10 +194,11 @@ def name_sorted( l ):
%if library.description:
<i>- ${library.description}</i>
%endif
%if trans.app.security_agent.allow_action( trans.user, trans.app.security_agent.permitted_actions.LIBRARY_MODIFY, library_item=library ) or \
trans.app.security_agent.allow_action( trans.user, trans.app.security_agent.permitted_actions.LIBRARY_ADD, library_item=library ) or \
trans.app.security_agent.allow_action( trans.user, trans.app.security_agent.permitted_actions.LIBRARY_MANAGE, library_item=library ):
%if trans.app.security_agent.allow_action( trans.user, trans.app.security_agent.permitted_actions.LIBRARY_MANAGE, library_item=library ):
<a id="library-${library.id}-popup" class="popup-arrow" style="display: none;">&#9660;</a>
<div popupmenu="library-${library.id}-popup">
<a class="action-button" href="${h.url_for( controller='library', action='edit_library', id=library.id )}">Manage library</a>
</div>
%endif
</span>
</th>
@@ -192,9 +208,6 @@ def name_sorted( l ):
</tr>
</table>
</div>
<div popupmenu="library-${library.id}-popup">
<a class="action-button" href="${h.url_for( controller='library', action='edit_library', id=library.id )}">Manage Library</a>
</div>
</li>
<ul>
${render_folder( library.root_folder, 0 )}
+5 -5
View File
@@ -33,11 +33,11 @@
</div>
<div class="form-row">
<div style="float: left; width: 250px; margin-right: 10px;">
<input type="hidden" name="id" value="${folder.id}" size="40"/>
<input type="hidden" name="folder_id" value="${folder.id}" size="40"/>
</div>
<div style="clear: both"></div>
</div>
<input type="submit" name="save" value="Save"/>
<input type="submit" name="rename_folder_button" value="Save"/>
</form>
</div>
</div>
@@ -46,7 +46,7 @@
%endif
%if trans.app.security_agent.allow_action( trans.user, trans.app.security_agent.permitted_actions.LIBRARY_MANAGE, library_item=folder ):
${render_permission_form( folder, folder.name, h.url_for( action='folder' ), 'id', folder.id, trans.user.all_roles() )}
${render_permission_form( folder, folder.name, h.url_for( action='folder' ), 'folder_id', folder.id, trans.user.all_roles() )}
%endif
%if trans.app.security_agent.allow_action( trans.user, trans.app.security_agent.permitted_actions.LIBRARY_ADD, library_item=folder ):
@@ -70,11 +70,11 @@
</div>
<div class="form-row">
<div style="float: left; width: 250px; margin-right: 10px;">
<input type="hidden" name="id" value="${folder.id}" size="40"/>
<input type="hidden" name="folder_id" value="${folder.id}" size="40"/>
</div>
<div style="clear: both"></div>
</div>
<input type="submit" name="create_new" value="Create New Folder"/>
<input type="submit" name="create_new_folder_button" value="Create New Folder"/>
</form>
</div>
</div>
+41
View File
@@ -0,0 +1,41 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
%if msg:
${render_msg( msg, messagetype )}
%endif
<div class="toolForm">
<div class="toolFormTitle">Create a new folder</div>
<div class="toolFormBody">
<form name="folder" action="${h.url_for( controller='library', action='folder' )}" method="post" >
<div class="form-row">
<label>Name:</label>
<div style="float: left; width: 250px; margin-right: 10px;">
<input type="text" name="name" value="New Folder" size="40"/>
</div>
<div style="clear: both"></div>
</div>
<div class="form-row">
<label>Description:</label>
<div style="float: left; width: 250px; margin-right: 10px;">
<input type="text" name="description" value="" size="40"/>
</div>
<div style="clear: both"></div>
</div>
<div class="form-row">
<div style="float: left; width: 250px; margin-right: 10px;">
<input type="hidden" name="new" value="submitted" size="40"/>
</div>
<div style="clear: both"></div>
</div>
<div class="form-row">
<div style="float: left; width: 250px; margin-right: 10px;">
<input type="hidden" name="folder_id" value="${folder.id}" size="40"/>
</div>
<div style="clear: both"></div>
</div>
<input type="submit" name="new_folder_button" value="Create"/>
</form>
</div>
</div>