diff --git a/lib/galaxy/web/controllers/admin.py b/lib/galaxy/web/controllers/admin.py index f0ccc2f4f07..f3ff2773608 100644 --- a/lib/galaxy/web/controllers/admin.py +++ b/lib/galaxy/web/controllers/admin.py @@ -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 + diff --git a/lib/galaxy/web/controllers/library.py b/lib/galaxy/web/controllers/library.py index 43c45a58402..5514fe113eb 100644 --- a/lib/galaxy/web/controllers/library.py +++ b/lib/galaxy/web/controllers/library.py @@ -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 diff --git a/templates/admin/dataset_security/specified_users_groups.mako b/templates/admin/dataset_security/specified_users_groups.mako index 8a392a67e31..e5678635c96 100644 --- a/templates/admin/dataset_security/specified_users_groups.mako +++ b/templates/admin/dataset_security/specified_users_groups.mako @@ -17,20 +17,27 @@
${msg} | ||||
${msg} | ||||
| User '${email}' belongs to no groups | ||||
| User '${email}' belongs to no groups | ||||
| Group | Priority | Datasets | Permitted Actions on Datasets | +Containing Libraries |
| + %if len( group[5] ) > 0: + ${len( group[5] )} + %else: + ${len( group[5] )} + %endif + | ||||