Enhancement to the Admin GUI: added link to Libraries that a specific user can access because they contain datasets associated with 1 of the user's groups. Also optimized some code in the library controller.

This commit is contained in:
Greg Von Kuster
2008-08-19 16:46:38 -04:00
parent 38434e1ebc
commit 64b785cdc7
5 changed files with 138 additions and 64 deletions
+54 -2
View File
@@ -461,6 +461,7 @@ class Admin( BaseController ):
galaxy.model.GroupDatasetAssociation.table.c.permitted_actions ] )
for row2 in q2.execute():
total_datasets = row2.total_datasets
libraries = []
permitted_actions = []
# There may not yet be any GroupDatasetAssociations, in which case no
# actions will be found
@@ -468,16 +469,42 @@ class Admin( BaseController ):
for action in row2.permitted_actions:
permitted_actions.append( action.encode( 'ascii' ) )
permitted_actions.sort()
# If we have permitted actions, then we have at least 1 GroupDatasetAssociation, in
# which case, we can see if we have any Libraries that the user can access
libs = trans.app.model.Library.select()
for library in libs:
folder = library.root_folder
components = list( folder.folders ) + list( folder.datasets )
for component in components:
if self.renderable( trans, component, row2.group_id ):
libraries.append( library.id )
break
groups.append( ( row.group_id,
escape( row.group_name, entities ),
row.group_priority,
row2.total_datasets,
permitted_actions ) )
permitted_actions,
libraries ) )
return trans.fill_template( '/admin/dataset_security/specified_users_groups.mako',
user_id=user_id,
user_email=escape( user_email, entities ),
groups=groups,
groups=groups,
msg=msg )
@web.expose
def specified_users_group_libraries( self, trans, **kwd ):
if not self.user_is_admin( trans ):
return trans.show_error_message( no_privilege_msg )
params = util.Params( kwd )
msg = params.msg
library_ids = params.library_ids.split( ',' )
libraries = []
for id in library_ids:
library = trans.app.model.Library.get( id )
libraries.append( library )
return trans.fill_template( '/admin/library/specified_users_group_libraries.mako',
user_email=params.user_email,
group_name=params.group_name,
libraries=libraries )
# Galaxy Library Stuff
@web.expose
@@ -794,3 +821,28 @@ class Admin( BaseController ):
err=None )
else:
return trans.show_error_message( "Invalid dataset specified" )
def renderable( self, trans, component, group_id ):
render = False
if isinstance( component, trans.app.model.LibraryFolder ):
# Check the folder's datasets to see what can be rendered
for library_folder_dataset_assoc in component.datasets:
if render:
break
dataset = trans.app.model.Dataset.get( library_folder_dataset_assoc.dataset_id )
for group_dataset_assoc in dataset.groups:
if group_dataset_assoc.group_id == group_id:
render = True
break
# Check the folder's sub-folders to see what can be rendered
if not render:
for library_folder in component.folders:
self.renderable( trans, library_folder, group_id )
elif isinstance( component, trans.app.model.LibraryFolderDatasetAssociation ):
render = False
dataset = trans.app.model.Dataset.get( component.dataset_id )
for group_dataset_assoc in dataset.groups:
if group_dataset_assoc.group_id == group_id:
render = True
break
return render
+39 -57
View File
@@ -33,64 +33,46 @@ class Library( BaseController ):
group_ids.append( user_group_assoc.group_id )
library = trans.app.model.Library.get( library_id )
return trans.fill_template( '/library/library.mako', library=library, group_ids=group_ids )
if user:
# Only display libraries that contain datasets associated with the user's groups
group_ids = []
for user_group_assoc in user.groups:
group = trans.app.model.Group.get( user_group_assoc.group_id )
group_ids.append( group.id )
else:
if user:
# Only display libraries that contain datasets associated with the user's groups
group_ids = []
for user_group_assoc in user.groups:
group = trans.app.model.Group.get( user_group_assoc.group_id )
group_ids.append( group.id )
else:
# Only display libraries that contain datasets associated with the public group
group_ids = [ trans.app.model.Group.select_by( name='public' )[0].id ]
libs = trans.app.model.Library.select()
for library in libs:
user_can_access = False
# Check for public datasets in the Library's root folder
for library_folder_dataset_assoc in library.root_folder.datasets:
if user_can_access:
folder = library.root_folder
components = list( folder.folders ) + list( folder.datasets )
for component in components:
if self.renderable( trans, component, group_ids ):
libraries.append( library )
break
dataset = trans.app.model.Dataset.get( library_folder_dataset_assoc.dataset_id )
for group_dataset_assoc in dataset.groups:
if group_dataset_assoc.group_id in group_ids:
libraries.append( library )
user_can_access = True
break
for folder in library.root_folder.folders:
if user_can_access:
break
for library_folder_dataset_assoc in folder.datasets:
if user_can_access:
break
dataset = trans.app.model.Dataset.get( library_folder_dataset_assoc.dataset_id )
for group_dataset_assoc in dataset.groups:
if group_dataset_assoc.group_id in group_ids:
libraries.append( library )
user_can_access = True
break
else:
# Only display libraries that contain datasets associated with the public group
group_ids = [ trans.app.model.Group.select_by( name='public' )[0].id ]
libs = trans.app.model.Library.select()
for library in libs:
public_library = False
# Check for public datasets in the Library's root folder
for library_folder_dataset_assoc in library.root_folder.datasets:
if public_library:
break
dataset = trans.app.model.Dataset.get( library_folder_dataset_assoc.dataset_id )
for group_dataset_assoc in dataset.groups:
if group_dataset_assoc.group_id in group_ids:
libraries.append( library )
public_library = True
break
# Check for public datasets in the root folder's sub-folders
for folder in library.root_folder.folders:
if public_library:
break
for library_folder_dataset_assoc in folder.datasets:
if public_library:
break
dataset = trans.app.model.Dataset.get( library_folder_dataset_assoc.dataset_id )
for group_dataset_assoc in dataset.groups:
if group_dataset_assoc.group_id in group_ids:
libraries.append( library )
public_library = True
break
return trans.fill_template( '/library/libraries.mako', group_ids=group_ids, libraries=libraries )
def renderable( self, trans, component, group_ids ):
render = False
if isinstance( component, trans.app.model.LibraryFolder ):
# Check the folder's datasets to see what can be rendered
for library_folder_dataset_assoc in component.datasets:
if render:
break
dataset = trans.app.model.Dataset.get( library_folder_dataset_assoc.dataset_id )
for group_dataset_assoc in dataset.groups:
if group_dataset_assoc.group_id in group_ids:
render = True
break
# Check the folder's sub-folders to see what can be rendered
if not render:
for library_folder in component.folders:
self.renderable( trans, library_folder, group_ids )
elif isinstance( component, trans.app.model.LibraryFolderDatasetAssociation ):
render = False
dataset = trans.app.model.Dataset.get( component.dataset_id )
for group_dataset_assoc in dataset.groups:
if group_dataset_assoc.group_id in group_ids:
render = True
break
return render
@@ -17,20 +17,27 @@
<h3 align="center">Groups of which '${email}' is a member</h3>
<table align="center" class="colored">
%if msg:
<tr><td colspan="4"><p class="ok_bgr">${msg}</p></td></tr>
<tr><td colspan="5"><p class="ok_bgr">${msg}</p></td></tr>
%endif
%if len( groups ) == 0:
<tr><td colspan="4">User '${email}' belongs to no groups</td></tr>
<tr><td colspan="5">User '${email}' belongs to no groups</td></tr>
%else:
<tr class="header">
<td>Group</td>
<td>Priority</td>
<td>Datasets</td>
<td>Permitted Actions on Datasets</td>
<td>Containing Libraries</td>
</tr>
<% ctr = 0 %>
%for group in groups:
<% gn = unescape( group[1], unentities ) %>
<%
gn = unescape( group[1], unentities )
library_ids = ''
for library_id in group[5]:
library_ids += "%s," % library_id
library_ids = library_ids.rstrip( ',' )
%>
%if ctr % 2 == 1:
<tr class="odd_row">
%else:
@@ -48,9 +55,16 @@
${da}<br/>
%endfor
</td>
<td>
%if len( group[5] ) > 0:
<a href="${h.url_for( controller='admin', action='specified_users_group_libraries', user_email=user_email, group_name=group[1], library_ids=library_ids )}">${len( group[5] )}</a>
%else:
${len( group[5] )}
%endif
</td>
</tr>
<% ctr += 1 %>
%endfor
%endfor
%endif
</table>
</div>
@@ -0,0 +1,27 @@
<%inherit file="/base.mako"/>
<%
from galaxy.web.controllers.admin import entities, unentities
from xml.sax.saxutils import escape, unescape
%>
<%def name="title()">Specified Users Group Libraries{</%def>
<%
gn = unescape( group_name, unentities )
email = unescape( user_email, unentities )
%>
<div class="toolForm">
<div class="form-row">
<a href="${h.url_for( controller='admin', action='libraries' )}">Libraries</a>&nbsp;&nbsp;|&nbsp;&nbsp;
<a href="${h.url_for( controller='admin', action='groups' )}">Groups</a>&nbsp;&nbsp;|&nbsp;&nbsp;
<a href="${h.url_for( controller='admin', action='users' )}">Users</a>
</div>
<div class="toolFormTitle">Libraries containing datasets associated with group '${gn}' that user '${email}' can access</div>
<div class="toolFormBody">
%for library in libraries:
<div class="form-row">
<a href="${h.url_for( controller='admin', action='library', id=library.id )}">${library.name}</a>
</div>
%endfor
</div>
</div>
-1
View File
@@ -13,7 +13,6 @@
if group_dataset_assoc.group_id in group_ids:
render = True
break
# TODO: Do we need to upgrade sqlalchemy? The following shouldn't be necessary if the mappers work correctly.
# Check the folder's sub-folders to see what can be rendered
for library_folder in component.folders:
render_component( library_folder )