class RepositoriesReviewedByMeGrid(RepositoriesWithReviewsGrid): # This grid filters out repositories that have been marked as either deprecated or deleted. columns = [ RepositoriesWithReviewsGrid.NameColumn( "Repository name", key="name", link=(lambda item: dict(operation="view_or_manage_repository", id=item.id)), attach_popup=True), RepositoriesWithReviewsGrid.UserColumn("Owner", attach_popup=False), RepositoriesWithReviewsGrid.WithReviewsRevisionColumn( "Reviewed revisions"), RepositoriesWithReviewsGrid.ReviewersColumn("Reviewers", attach_popup=False), RepositoriesWithReviewsGrid.RatingColumn("Rating", attach_popup=False), RepositoriesWithReviewsGrid.ApprovedColumn("Approved", attach_popup=False) ] columns.append( grids.MulticolFilterColumn("Search repository name", cols_to_filter=[columns[0]], key="free-text-search", visible=False, filterable="standard")) def build_initial_query(self, trans, **kwd): return trans.sa_session.query( model.Repository ) \ .filter( and_( model.Repository.table.c.deleted == False, model.Repository.table.c.deprecated == False ) ) \ .join( ( model.RepositoryReview.table, model.RepositoryReview.table.c.repository_id == model.Repository.table.c.id ) ) \ .filter( model.RepositoryReview.table.c.user_id == trans.user.id ) \ .join( ( model.User.table, model.User.table.c.id == model.RepositoryReview.table.c.user_id ) ) \ .outerjoin( ( model.ComponentReview.table, model.ComponentReview.table.c.repository_review_id == model.RepositoryReview.table.c.id ) ) \ .outerjoin( ( model.Component.table, model.Component.table.c.id == model.ComponentReview.table.c.component_id ) )
class LibraryDatasetsSelectionGrid(grids.Grid): available_tracks = None title = "Add Datasets" model_class = model.LibraryDatasetDatasetAssociation default_filter = {"deleted": "False"} default_sort_key = "-id" columns = [ grids.GridColumn("Id", key="id"), grids.TextColumn("Name", key="name", model_class=model.LibraryDatasetDatasetAssociation), grids.TextColumn("Type", key="extension", model_class=model.LibraryDatasetDatasetAssociation), ] columns.append( grids.MulticolFilterColumn("Search name and filetype", cols_to_filter=[columns[1], columns[2]], key="free-text-search", visible=False, filterable="standard")) def build_initial_query(self, trans, **kwargs): return trans.sa_session.query(self.model_class).join( model.Dataset.table) def apply_query_filter(self, trans, query, **kwargs): if self.available_tracks is None: self.available_tracks = trans.app.datatypes_registry.get_available_tracks( ) return query.filter(model.LibraryDatasetDatasetAssociation.user == trans.user) \ .filter(model.LibraryDatasetDatasetAssociation.extension.in_(self.available_tracks)) \ .filter(model.Dataset.state == model.Dataset.states.OK) \ .filter(model.LibraryDatasetDatasetAssociation.deleted == false()) \ .filter(model.LibraryDatasetDatasetAssociation.visible == true())
class HistorySelectionGrid(ItemSelectionGrid): """ Grid for selecting histories. """ # Grid definition. title = "Saved Histories" model_class = model.History columns = [ ItemSelectionGrid.NameColumn("Name", key="name", filterable="advanced"), grids.IndividualTagsColumn( "Tags", key="tags", model_tag_association_class=model.HistoryTagAssociation, filterable="advanced"), grids.GridColumn("Last Updated", key="update_time", format=time_ago), # Columns that are valid for filtering but are not visible. grids.DeletedColumn("Deleted", key="deleted", visible=False, filterable="advanced"), grids.SharingStatusColumn("Sharing", key="sharing", filterable="advanced", sortable=False, visible=False), ] columns.append( grids.MulticolFilterColumn("Search", cols_to_filter=[columns[0], columns[1]], key="free-text-search", visible=False, filterable="standard")) def apply_query_filter(self, trans, query, **kwargs): return query.filter_by(user=trans.user, purged=False)
class VisualizationSelectionGrid(ItemSelectionGrid): """ Grid for selecting visualizations. """ # Grid definition. title = "Saved Visualizations" model_class = model.Visualization columns = [ grids.TextColumn("Title", key="title", filterable="advanced"), grids.TextColumn("Type", key="type"), grids.IndividualTagsColumn( "Tags", key="tags", model_tag_association_class=model.VisualizationTagAssociation, filterable="advanced", grid_name="VisualizationListGrid"), grids.SharingStatusColumn("Sharing", key="sharing", filterable="advanced", sortable=False), grids.GridColumn("Last Updated", key="update_time", format=time_ago), ] columns.append( grids.MulticolFilterColumn("Search", cols_to_filter=[columns[0], columns[2]], key="free-text-search", visible=False, filterable="standard"))
class PageSelectionGrid(ItemSelectionGrid): """ Grid for selecting pages. """ # Grid definition. title = "Saved Pages" model_class = model.Page columns = [ grids.TextColumn("Title", key="title", filterable="advanced"), grids.IndividualTagsColumn( "Tags", key="tags", model_tag_association_class=model.PageTagAssociation, filterable="advanced"), grids.GridColumn("Last Updated", key="update_time", format=time_ago), # Columns that are valid for filtering but are not visible. grids.DeletedColumn("Deleted", key="deleted", visible=False, filterable="advanced"), grids.SharingStatusColumn("Sharing", key="sharing", filterable="advanced", sortable=False, visible=False), ] columns.append( grids.MulticolFilterColumn("Search", cols_to_filter=[columns[0], columns[1]], key="free-text-search", visible=False, filterable="standard"))
class InteractiveToolEntryPointListGrid(grids.Grid): use_panels = True title = "Available InteractiveTools" model_class = model.InteractiveToolEntryPoint default_filter = {"name": "All"} default_sort_key = "-update_time" columns = [ EntryPointLinkColumn("Name", filterable="advanced"), JobStatusColumn("Job Info", key="job_state", model_class=model.Job), grids.GridColumn("Created", key="created_time", format=time_ago), grids.GridColumn("Last Updated", key="modified_time", format=time_ago), ] columns.append( grids.MulticolFilterColumn( "Search", cols_to_filter=[columns[0]], key="free-text-search", visible=False, filterable="standard" ) ) operations = [ grids.GridOperation("Stop", condition=(lambda item: item.active), async_compatible=False), ] def build_initial_query(self, trans, **kwargs): # Get list of user's active InteractiveTools return trans.app.interactivetool_manager.get_nonterminal_for_user_by_trans(trans)
class StoredWorkflowAllPublishedGrid(grids.Grid): title = "Published Workflows" model_class = model.StoredWorkflow default_sort_key = "update_time" default_filter = dict(public_url="All", username="******", tags="All") columns = [ grids.PublicURLColumn("Name", key="name", filterable="advanced", attach_popup=True), grids.OwnerAnnotationColumn("Annotation", key="annotation", model_annotation_association_class=model.StoredWorkflowAnnotationAssociation, filterable="advanced"), grids.OwnerColumn("Owner", key="username", model_class=model.User, filterable="advanced"), grids.CommunityRatingColumn("Community Rating", key="rating"), grids.CommunityTagsColumn("Community Tags", key="tags", model_tag_association_class=model.StoredWorkflowTagAssociation, filterable="advanced", grid_name="PublicWorkflowListGrid"), grids.ReverseSortColumn("Last Updated", key="update_time", format=time_ago) ] columns.append( grids.MulticolFilterColumn( "Search name, annotation, owner, and tags", cols_to_filter=[columns[0], columns[1], columns[2], columns[4]], key="free-text-search", visible=False, filterable="standard" ) ) operations = [ grids.GridOperation( 'Run', condition=(lambda item: not item.deleted), allow_multiple=False, url_args=dict(controller='workflows', action="run") ), grids.GridOperation( "Import", condition=(lambda item: not item.deleted), allow_multiple=False, url_args=dict(action="imp") ), grids.GridOperation( "Save as File", condition=(lambda item: not item.deleted), allow_multiple=False, url_args=dict(action="export_to_file") ), ] num_rows_per_page = 50 use_paging = True def build_initial_query(self, trans, **kwargs): # See optimization description comments and TODO for tags in matching public histories query. # In addition to that - be sure to lazyload the latest_workflow - it isn't needed and it causes all # of its steps to be eagerly loaded. return trans.sa_session.query(self.model_class).join("user").options(lazyload("latest_workflow"), eagerload("user").load_only("username"), eagerload("annotations"), undefer("average_rating")) def apply_query_filter(self, trans, query, **kwargs): # A public workflow is published, has a slug, and is not deleted. return query.filter( self.model_class.published == expression.true()).filter( self.model_class.slug.isnot(None)).filter( self.model_class.deleted == expression.false())
class PageAllPublishedGrid(grids.Grid): # Grid definition use_panels = True title = "Published Pages" model_class = model.Page default_sort_key = "update_time" default_filter = dict(title="All", username="******") columns = [ grids.PublicURLColumn("Title", key="title", filterable="advanced"), grids.OwnerAnnotationColumn("Annotation", key="annotation", model_annotation_association_class=model.PageAnnotationAssociation, filterable="advanced"), grids.OwnerColumn("Owner", key="username", model_class=model.User, filterable="advanced"), grids.CommunityRatingColumn("Community Rating", key="rating"), grids.CommunityTagsColumn("Community Tags", key="tags", model_tag_association_class=model.PageTagAssociation, filterable="advanced", grid_name="PageAllPublishedGrid"), grids.ReverseSortColumn("Last Updated", key="update_time", format=time_ago) ] columns.append( grids.MulticolFilterColumn( "Search title, annotation, owner, and tags", cols_to_filter=[columns[0], columns[1], columns[2], columns[4]], key="free-text-search", visible=False, filterable="standard") ) def build_initial_query(self, trans, **kwargs): # See optimization description comments and TODO for tags in matching public histories query. return trans.sa_session.query(self.model_class).join("user").options(eagerload("user").load_only("username"), eagerload("annotations"), undefer("average_rating")) def apply_query_filter(self, trans, query, **kwargs): return query.filter(self.model_class.deleted == false()).filter(self.model_class.published == true())
class FormsGrid( grids.Grid ): # Custom column types class NameColumn( grids.TextColumn ): def get_value(self, trans, grid, form): return form.latest_form.name class DescriptionColumn( grids.TextColumn ): def get_value(self, trans, grid, form): return form.latest_form.desc class TypeColumn( grids.TextColumn ): def get_value(self, trans, grid, form): return form.latest_form.type class DeletedColumn( grids.GridColumn ): def get_accepted_filters( self ): """ Returns a list of accepted filters for this column. """ accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" } accepted_filters = [] for label, val in accepted_filter_labels_and_vals.items(): args = { self.key: val } accepted_filters.append( grids.GridColumnFilter( label, args) ) return accepted_filters # Grid definition title = "Forms" template = "admin/forms/grid.mako" model_class = model.FormDefinitionCurrent default_sort_key = "-create_time" num_rows_per_page = 50 preserve_state = True use_paging = True default_filter = dict( deleted="False" ) columns = [ NameColumn( "Name", key="name", model_class=model.FormDefinition, link=( lambda item: iff( item.deleted, None, dict( operation="view", id=item.id ) ) ), attach_popup=True, filterable="advanced" ), DescriptionColumn( "Description", key='desc', model_class=model.FormDefinition, filterable="advanced" ), TypeColumn( "Type" ), DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ) ] columns.append( grids.MulticolFilterColumn( "Search", cols_to_filter=[ columns[0], columns[1] ], key="free-text-search", visible=False, filterable="standard" ) ) operations = [ grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ) ), grids.GridOperation( "Delete", allow_multiple=True, condition=( lambda item: not item.deleted ) ), grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ), ] global_actions = [ grids.GridAction( "Create new form", dict( controller='forms', action='new' ) ) ]
class LibraryListGrid( grids.Grid ): class NameColumn( grids.TextColumn ): def get_value( self, trans, grid, library ): return library.name class DescriptionColumn( grids.TextColumn ): def get_value( self, trans, grid, library ): if library.description: return library.description return '' # Grid definition title = "Data Libraries" model_class = model.Library template='/library/grid.mako' default_sort_key = "name" columns = [ NameColumn( "Data library name", key="name", link=( lambda library: dict( operation="browse", id=library.id ) ), attach_popup=False, filterable="advanced" ), DescriptionColumn( "Data library description", key="description", attach_popup=False, filterable="advanced" ), ] columns.append( grids.MulticolFilterColumn( "search dataset name, info, message, dbkey", cols_to_filter=[ columns[0], columns[1] ], key="free-text-search", visible=False, filterable="standard" ) ) standard_filters = [] default_filter = dict( name="All", description="All", deleted="False", purged="False" ) num_rows_per_page = 50 preserve_state = False use_paging = True def build_initial_query( self, trans, **kwargs ): return trans.sa_session.query( self.model_class ).filter( self.model_class.table.c.deleted == False ) def apply_query_filter( self, trans, query, **kwd ): current_user_role_ids = [ role.id for role in trans.get_current_user_roles() ] library_access_action = trans.app.security_agent.permitted_actions.LIBRARY_ACCESS.action restricted_library_ids = [ lp.library_id for lp in trans.sa_session.query( trans.model.LibraryPermissions ) \ .filter( trans.model.LibraryPermissions.table.c.action == library_access_action ) \ .distinct() ] accessible_restricted_library_ids = [ lp.library_id for lp in trans.sa_session.query( trans.model.LibraryPermissions ) \ .filter( and_( trans.model.LibraryPermissions.table.c.action == library_access_action, trans.model.LibraryPermissions.table.c.role_id.in_( current_user_role_ids ) ) ) ] if not trans.user: # Filter to get only public libraries, a library whose id # is not in restricted_library_ids is a public library return query.filter( not_( trans.model.Library.table.c.id.in_( restricted_library_ids ) ) ) else: # Filter to get libraries accessible by the current user, get both # public libraries and restricted libraries accessible by the current user. return query.filter( or_( not_( trans.model.Library.table.c.id.in_( restricted_library_ids ) ), trans.model.Library.table.c.id.in_( accessible_restricted_library_ids ) ) )
class RepositoriesWithoutReviewsGrid(RepositoriesWithReviewsGrid): # This grid filters out repositories that have been marked as deprecated. title = "Repositories with no reviews" columns = [ RepositoriesWithReviewsGrid.NameColumn( "Repository name", key="name", link=(lambda item: dict(operation="view_or_manage_repository", id=item.id)), attach_popup=True), RepositoriesWithReviewsGrid.DescriptionColumn("Synopsis", key="description", attach_popup=False), RepositoriesWithReviewsGrid.WithoutReviewsRevisionColumn( "Revisions for review"), RepositoriesWithReviewsGrid.UserColumn("Owner", attach_popup=False) ] columns.append( grids.MulticolFilterColumn("Search repository name, description", cols_to_filter=[columns[0], columns[1]], key="free-text-search", visible=False, filterable="standard")) operations = [ grids.GridOperation("Inspect repository revisions", allow_multiple=False, condition=(lambda item: not item.deleted), async_compatible=False) ] def build_initial_query(self, trans, **kwd): return trans.sa_session.query( model.Repository ) \ .filter( and_( model.Repository.table.c.deprecated == False, model.Repository.reviews == None ) ) \ .join( model.User.table )
class PageAllPublishedGrid( grids.Grid ): # Grid definition use_panels = True use_async = True title = "Published Pages" model_class = model.Page default_sort_key = "update_time" default_filter = dict( title="All", username="******" ) columns = [ grids.PublicURLColumn( "Title", key="title", filterable="advanced" ), grids.OwnerAnnotationColumn( "Annotation", key="annotation", model_annotation_association_class=model.PageAnnotationAssociation, filterable="advanced" ), grids.OwnerColumn( "Owner", key="username", model_class=model.User, filterable="advanced" ), grids.CommunityRatingColumn( "Community Rating", key="rating" ), grids.CommunityTagsColumn( "Community Tags", key="tags", model_tag_association_class=model.PageTagAssociation, filterable="advanced", grid_name="PageAllPublishedGrid" ), grids.ReverseSortColumn( "Last Updated", key="update_time", format=time_ago ) ] columns.append( grids.MulticolFilterColumn( "Search title, annotation, owner, and tags", cols_to_filter=[ columns[0], columns[1], columns[2], columns[4] ], key="free-text-search", visible=False, filterable="standard" ) ) def build_initial_query( self, trans, **kwargs ): # Join so that searching history.user makes sense. return trans.sa_session.query( self.model_class ).join( model.User.table ) def apply_query_filter( self, trans, query, **kwargs ): return query.filter( self.model_class.deleted==False ).filter( self.model_class.published==True )
class FormsGrid(grids.Grid): # Custom column types class NameColumn(grids.TextColumn): def get_value(self, trans, grid, form): return escape(form.latest_form.name) class DescriptionColumn(grids.TextColumn): def get_value(self, trans, grid, form): return escape(form.latest_form.desc) class TypeColumn(grids.TextColumn): def get_value(self, trans, grid, form): return form.latest_form.type # Grid definition title = "Forms" template = "admin/forms/grid.mako" model_class = model.FormDefinitionCurrent default_sort_key = "-create_time" num_rows_per_page = 50 preserve_state = True use_paging = True default_filter = dict(deleted="False") columns = [ NameColumn("Name", key="name", model_class=model.FormDefinition, link=(lambda item: iff(item.deleted, None, dict(operation="view_latest_form_definition", id=item.id))), attach_popup=True, filterable="advanced"), DescriptionColumn("Description", key='desc', model_class=model.FormDefinition, filterable="advanced"), TypeColumn("Type"), grids.DeletedColumn("Deleted", key="deleted", visible=False, filterable="advanced") ] columns.append(grids.MulticolFilterColumn("Search", cols_to_filter=[columns[0], columns[1]], key="free-text-search", visible=False, filterable="standard")) operations = [ grids.GridOperation("Edit", allow_multiple=False, condition=(lambda item: not item.deleted)), grids.GridOperation("Delete", allow_multiple=True, condition=(lambda item: not item.deleted)), grids.GridOperation("Undelete", condition=(lambda item: item.deleted)), ] global_actions = [ grids.GridAction("Create new form", dict(controller='forms', action='create_form_definition')) ] def build_initial_query(self, trans, **kwargs): return trans.sa_session.query(self.model_class).join(model.FormDefinition, self.model_class.latest_form_id == model.FormDefinition.id)
class StoredWorkflowListGrid(grids.Grid): class StepsColumn(grids.GridColumn): def get_value(self, trans, grid, workflow): return len(workflow.latest_workflow.steps) # Grid definition use_panels = True title = "Saved Workflows" model_class = model.StoredWorkflow default_filter = {"name": "All", "tags": "All"} default_sort_key = "-update_time" columns = [ grids.TextColumn("Name", key="name", attach_popup=True, filterable="advanced"), grids.IndividualTagsColumn( "Tags", "tags", model_tag_association_class=model.StoredWorkflowTagAssociation, filterable="advanced", grid_name="StoredWorkflowListGrid"), StepsColumn("Steps"), grids.GridColumn("Created", key="create_time", format=time_ago), grids.GridColumn("Last Updated", key="update_time", format=time_ago), ] columns.append( grids.MulticolFilterColumn("Search", cols_to_filter=[columns[0], columns[1]], key="free-text-search", visible=False, filterable="standard")) operations = [ grids.GridOperation("Edit", allow_multiple=False, condition=(lambda item: not item.deleted), async_compatible=False), grids.GridOperation("Run", condition=(lambda item: not item.deleted), async_compatible=False), grids.GridOperation("Copy", condition=(lambda item: not item.deleted), async_compatible=False), grids.GridOperation("Rename", condition=(lambda item: not item.deleted), async_compatible=False), grids.GridOperation("Sharing", condition=(lambda item: not item.deleted), async_compatible=False), grids.GridOperation("Delete", condition=(lambda item: item.deleted), async_compatible=True), ] def apply_query_filter(self, trans, query, **kwargs): return query.filter_by(user=trans.user, deleted=False)
class LibraryListGrid( grids.Grid ): class NameColumn( grids.TextColumn ): def get_value( self, trans, grid, library ): return library.name class DescriptionColumn( grids.TextColumn ): def get_value( self, trans, grid, library ): if library.description: return library.description return '' class StatusColumn( grids.GridColumn ): def get_value( self, trans, grid, library ): if library.purged: return "purged" elif library.deleted: return "deleted" return "" # Grid definition title = "Data Libraries" model_class = model.Library template='/admin/library/grid.mako' default_sort_key = "name" columns = [ NameColumn( "Data library name", key="name", link=( lambda library: dict( operation="browse", id=library.id ) ), attach_popup=False, filterable="advanced" ), DescriptionColumn( "Data library description", key="description", attach_popup=False, filterable="advanced" ), grids.GridColumn( "Created", key="create_time", format=time_ago ), grids.GridColumn( "Last Updated", key="update_time", format=time_ago ), StatusColumn( "Status", attach_popup=False ), # Columns that are valid for filtering but are not visible. grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ) ] columns.append( grids.MulticolFilterColumn( "search dataset name, info, message, dbkey", cols_to_filter=[ columns[0], columns[1] ], key="free-text-search", visible=False, filterable="standard" ) ) global_actions = [ grids.GridAction( "Create new data library", dict( controller='library_admin', action='create_library' ) ) ] standard_filters = [ grids.GridColumnFilter( "Active", args=dict( deleted=False ) ), grids.GridColumnFilter( "Deleted", args=dict( deleted=True, purged=False ) ), grids.GridColumnFilter( "Purged", args=dict( purged=True ) ), grids.GridColumnFilter( "All", args=dict( deleted='All' ) ) ] default_filter = dict( name="All", description="All", deleted="False", purged="False" ) num_rows_per_page = 50 preserve_state = False use_paging = True
class VisualizationListGrid( grids.Grid ): def get_url_args( item ): """ Returns dictionary used to create item link. """ url_kwargs = dict( controller='visualization', id=item.id ) #TODO: hack to build link to saved visualization - need trans in this function instead in order to do #link_data = trans.app.visualizations_registry.get_visualizations( trans, item ) if item.type in registry.VisualizationsRegistry.BUILT_IN_VISUALIZATIONS: url_kwargs[ 'action' ] = item.type else: url_kwargs[ 'action' ] = 'saved' return url_kwargs def get_display_name( self, trans, item ): if trans.app.visualizations_registry and item.type in trans.app.visualizations_registry.plugins: plugin = trans.app.visualizations_registry.plugins[ item.type ] return plugin.config.get( 'name', item.type ) return item.type # Grid definition title = "Saved Visualizations" model_class = model.Visualization default_sort_key = "-update_time" default_filter = dict( title="All", deleted="False", tags="All", sharing="All" ) columns = [ grids.TextColumn( "Title", key="title", attach_popup=True, link=get_url_args ), grids.TextColumn( "Type", method='get_display_name' ), grids.TextColumn( "Dbkey", key="dbkey" ), grids.IndividualTagsColumn( "Tags", key="tags", model_tag_association_class=model.VisualizationTagAssociation, filterable="advanced", grid_name="VisualizationListGrid" ), grids.SharingStatusColumn( "Sharing", key="sharing", filterable="advanced", sortable=False ), grids.GridColumn( "Created", key="create_time", format=time_ago ), grids.GridColumn( "Last Updated", key="update_time", format=time_ago ), ] columns.append( grids.MulticolFilterColumn( "Search", cols_to_filter=[ columns[0], columns[2] ], key="free-text-search", visible=False, filterable="standard" ) ) global_actions = [ grids.GridAction( "Create new visualization", dict( action='create' ), inbound=True ) ] operations = [ grids.GridOperation( "Open", allow_multiple=False, url_args=get_url_args ), grids.GridOperation( "Open in Circster", allow_multiple=False, condition=( lambda item: item.type == 'trackster' ), url_args=dict( action='circster' ) ), grids.GridOperation( "Edit Attributes", allow_multiple=False, url_args=dict( action='edit'), inbound=True), grids.GridOperation( "Copy", allow_multiple=False, condition=( lambda item: not item.deleted )), grids.GridOperation( "Share or Publish", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ), grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ), confirm="Are you sure you want to delete this visualization?" ), ] def apply_query_filter( self, trans, query, **kwargs ): return query.filter_by( user=trans.user, deleted=False )
class ToolVersionListGrid(grids.Grid): class ToolIdColumn(grids.TextColumn): def get_value(self, trans, grid, tool_version): toolbox = trans.app.toolbox if toolbox.has_tool(tool_version.tool_id, exact=True): link = url_for(controller='tool_runner', tool_id=tool_version.tool_id) link_str = '<a href="%s">' % link return '<div class="count-box state-color-ok">%s%s</a></div>' % ( link_str, tool_version.tool_id) return tool_version.tool_id class ToolVersionsColumn(grids.TextColumn): def get_value(self, trans, grid, tool_version): tool_ids_str = '' toolbox = trans.app.toolbox for tool_id in tool_version.get_version_ids(trans.app): if toolbox.has_tool(tool_id, exact=True): link = url_for(controller='tool_runner', tool_id=tool_version.tool_id) link_str = '<a href="%s">' % link tool_ids_str += '<div class="count-box state-color-ok">%s%s</a></div><br/>' % ( link_str, tool_id) else: tool_ids_str += '%s<br/>' % tool_id return tool_ids_str # Grid definition title = "Tool versions" model_class = install_model.ToolVersion template = '/admin/tool_version/grid.mako' default_sort_key = "tool_id" columns = [ ToolIdColumn("Tool id", key='tool_id', attach_popup=False), ToolVersionsColumn("Version lineage by tool id (parent/child ordered)") ] columns.append( grids.MulticolFilterColumn("Search tool id", cols_to_filter=[columns[0]], key="free-text-search", visible=False, filterable="standard")) global_actions = [] operations = [] standard_filters = [] default_filter = {} num_rows_per_page = 50 preserve_state = False use_paging = True def build_initial_query(self, trans, **kwd): return trans.install_model.context.query(self.model_class)
class AdminRepositoryGrid(RepositoryGrid): class DeletedColumn(grids.BooleanColumn): def get_value(self, trans, grid, repository): if repository.deleted: return 'yes' return '' columns = [ RepositoryGrid.NameColumn( "Name", key="name", link=(lambda item: dict(operation="view_or_manage_repository", id=item.id)), attach_popup=True), RepositoryGrid.HeadsColumn("Heads"), RepositoryGrid.UserColumn( "Owner", model_class=model.User, link=(lambda item: dict(operation="repositories_by_user", id=item.id)), attach_popup=False, key="User.username"), RepositoryGrid.DeprecatedColumn("Deprecated", key="deprecated", attach_popup=False), # Columns that are valid for filtering but are not visible. DeletedColumn("Deleted", key="deleted", attach_popup=False) ] columns.append( grids.MulticolFilterColumn("Search repository name", cols_to_filter=[columns[0]], key="free-text-search", visible=False, filterable="standard")) operations = [operation for operation in RepositoryGrid.operations] operations.append( grids.GridOperation("Delete", allow_multiple=False, condition=(lambda item: not item.deleted), async_compatible=False)) operations.append( grids.GridOperation("Undelete", allow_multiple=False, condition=(lambda item: item.deleted), async_compatible=False)) standard_filters = [] default_filter = {} def build_initial_query(self, trans, **kwd): return trans.sa_session.query(model.Repository) \ .join(model.User.table)
class HistoryDatasetsSelectionGrid(grids.Grid): class DbKeyColumn(grids.GridColumn): def filter(self, trans, user, query, dbkey): """ Filter by dbkey through a raw SQL b/c metadata is a BLOB. """ dbkey_user, dbkey = decode_dbkey(dbkey) dbkey = dbkey.replace("'", "\\'") return query.filter(or_(text("metadata like '%%\"dbkey\": [\"%s\"]%%'" % dbkey, "metadata like '%%\"dbkey\": \"%s\"%%'" % dbkey))) class HistoryColumn(grids.GridColumn): def get_value(self, trans, grid, hda): return escape(hda.history.name) def sort(self, trans, query, ascending, column_name=None): """Sort query using this column.""" return grids.GridColumn.sort(self, trans, query, ascending, column_name="history_id") available_tracks = None title = "Add Datasets" model_class = model.HistoryDatasetAssociation default_filter = {"deleted": "False", "shared": "All"} default_sort_key = "-hid" columns = [ grids.GridColumn("Id", key="hid"), grids.TextColumn("Name", key="name", model_class=model.HistoryDatasetAssociation), grids.TextColumn("Type", key="extension", model_class=model.HistoryDatasetAssociation), grids.TextColumn("history_id", key="history_id", model_class=model.HistoryDatasetAssociation, visible=False), HistoryColumn("History", key="history", visible=True), DbKeyColumn("Build", key="dbkey", model_class=model.HistoryDatasetAssociation, visible=True, sortable=False) ] columns.append( grids.MulticolFilterColumn("Search name and filetype", cols_to_filter=[columns[1], columns[2]], key="free-text-search", visible=False, filterable="standard") ) def build_initial_query(self, trans, **kwargs): return trans.sa_session.query(self.model_class).join(model.History.table).join(model.Dataset.table) def apply_query_filter(self, trans, query, **kwargs): if self.available_tracks is None: self.available_tracks = trans.app.datatypes_registry.get_available_tracks() return query.filter(model.History.user == trans.user) \ .filter(model.HistoryDatasetAssociation.extension.in_(self.available_tracks)) \ .filter(model.Dataset.state == model.Dataset.states.OK) \ .filter(model.HistoryDatasetAssociation.deleted == false()) \ .filter(model.HistoryDatasetAssociation.visible == true())
class RepositoriesReadyForReviewGrid(RepositoriesWithoutReviewsGrid): # Repositories that are ready for human review are those that either: # 1) Have no tools # 2) Have tools that have been proven to be functionally correct within Galaxy. # This grid filters out repositories that have been marked as either deprecated or deleted. title = "Repositories ready for review" columns = [ RepositoriesWithoutReviewsGrid.NameColumn( "Repository name", key="name", link=(lambda item: dict(operation="view_or_manage_repository", id=item.id)), attach_popup=True), RepositoriesWithoutReviewsGrid.DescriptionColumn("Synopsis", key="description", attach_popup=False), RepositoriesWithoutReviewsGrid.WithoutReviewsRevisionColumn( "Revisions for review"), RepositoriesWithoutReviewsGrid.UserColumn("Owner", model_class=model.User, attach_popup=False, key="User.username") ] columns.append( grids.MulticolFilterColumn("Search repository name, description", cols_to_filter=[columns[0], columns[1]], key="free-text-search", visible=False, filterable="standard")) operations = [ grids.GridOperation("Inspect repository revisions", allow_multiple=False, condition=(lambda item: not item.deleted), async_compatible=False) ] def build_initial_query(self, trans, **kwd): return trans.sa_session.query( model.Repository ) \ .filter( and_( model.Repository.table.c.deleted == False, model.Repository.table.c.deprecated == False, model.Repository.reviews == None ) ) \ .join( model.RepositoryMetadata.table ) \ .filter( and_( model.RepositoryMetadata.table.c.downloadable == True, or_( model.RepositoryMetadata.table.c.includes_tools == False, and_( model.RepositoryMetadata.table.c.includes_tools == True, model.RepositoryMetadata.table.c.tools_functionally_correct == True ) ) ) ) \ .join( model.User.table )
class VisualizationListGrid( grids.Grid ): def get_url_args( item ): """ Returns dictionary used to create item link. """ controller = "visualization" action = item.type if item.type == "phyloviz": controller = "phyloviz" action = "visualization" return dict( controller=controller, action=action, id=item.id ) # Grid definition title = "Saved Visualizations" model_class = model.Visualization default_sort_key = "-update_time" default_filter = dict( title="All", deleted="False", tags="All", sharing="All" ) columns = [ grids.TextColumn( "Title", key="title", attach_popup=True, link=get_url_args ), grids.TextColumn( "Type", key="type" ), grids.TextColumn( "Dbkey", key="dbkey" ), grids.IndividualTagsColumn( "Tags", key="tags", model_tag_association_class=model.VisualizationTagAssociation, filterable="advanced", grid_name="VisualizationListGrid" ), grids.SharingStatusColumn( "Sharing", key="sharing", filterable="advanced", sortable=False ), grids.GridColumn( "Created", key="create_time", format=time_ago ), grids.GridColumn( "Last Updated", key="update_time", format=time_ago ), ] columns.append( grids.MulticolFilterColumn( "Search", cols_to_filter=[ columns[0], columns[2] ], key="free-text-search", visible=False, filterable="standard" ) ) global_actions = [ grids.GridAction( "Create new visualization", dict( action='create' ) ) ] operations = [ grids.GridOperation( "Open", allow_multiple=False, url_args=get_url_args ), grids.GridOperation( "Open in Circster", allow_multiple=False, condition=( lambda item: item.type == 'trackster' ), url_args=dict( action='circster' ) ), grids.GridOperation( "Edit Attributes", allow_multiple=False, url_args=dict( action='edit') ), grids.GridOperation( "Copy", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False, url_args=dict( action='copy') ), grids.GridOperation( "Share or Publish", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ), grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ), async_compatible=True, confirm="Are you sure you want to delete this visualization?" ), ] def apply_query_filter( self, trans, query, **kwargs ): return query.filter_by( user=trans.user, deleted=False )
class HistoryAllPublishedGrid(grids.Grid): class NameURLColumn(grids.PublicURLColumn, NameColumn): pass title = "Published Histories" model_class = model.History default_sort_key = "update_time" default_filter = dict(public_url="All", username="******", tags="All") use_paging = True num_rows_per_page = 50 columns = [ NameURLColumn("Name", key="name", filterable="advanced"), grids.OwnerAnnotationColumn("Annotation", key="annotation", model_annotation_association_class=model.HistoryAnnotationAssociation, filterable="advanced"), grids.OwnerColumn("Owner", key="username", model_class=model.User, filterable="advanced"), grids.CommunityRatingColumn("Community Rating", key="rating"), grids.CommunityTagsColumn("Community Tags", key="tags", model_tag_association_class=model.HistoryTagAssociation, filterable="advanced", grid_name="PublicHistoryListGrid"), grids.ReverseSortColumn("Last Updated", key="update_time", format=time_ago) ] columns.append( grids.MulticolFilterColumn( "Search name, annotation, owner, and tags", cols_to_filter=[columns[0], columns[1], columns[2], columns[4]], key="free-text-search", visible=False, filterable="standard") ) def build_initial_query(self, trans, **kwargs): # TODO: Tags are still loaded one at a time, consider doing this all at once: # - eagerload would keep everything in one query but would explode the number of rows and potentially # result in unneeded info transferred over the wire. # - subqueryload("tags").subqueryload("tag") would probably be better under postgres but I'd # like some performance data against a big database first - might cause problems? # - Pull down only username from associated User table since that is all that is used # (can be used during search). Need join in addition to the eagerload since it is used in # the .count() query which doesn't respect the eagerload options (could eliminate this with #5523). # - Undefer average_rating column to prevent loading individual ratings per-history. # - Eager load annotations - this causes a left join which might be inefficient if there were # potentially many items per history (like if joining HDAs for instance) but there should only # be at most one so this is fine. return trans.sa_session.query(self.model_class).join("user").options(eagerload("user").load_only("username"), eagerload("annotations"), undefer("average_rating")) def apply_query_filter(self, trans, query, **kwargs): # A public history is published, has a slug, and is not deleted. return query.filter(self.model_class.published == true()).filter(self.model_class.slug != null()).filter(self.model_class.deleted == false())
class PageListGrid( grids.Grid ): # Custom column. class URLColumn( grids.PublicURLColumn ): def get_value( self, trans, grid, item ): return url_for(controller='page', action='display_by_username_and_slug', username=item.user.username, slug=item.slug ) # Grid definition use_panels = True title = "Pages" model_class = model.Page default_filter = { "published" : "All", "tags" : "All", "title" : "All", "sharing" : "All" } default_sort_key = "-update_time" columns = [ grids.TextColumn( "Title", key="title", attach_popup=True, filterable="advanced" ), URLColumn( "Public URL" ), grids.OwnerAnnotationColumn( "Annotation", key="annotation", model_annotation_association_class=model.PageAnnotationAssociation, filterable="advanced" ), grids.IndividualTagsColumn( "Tags", key="tags", model_tag_association_class=model.PageTagAssociation, filterable="advanced", grid_name="PageListGrid" ), grids.SharingStatusColumn( "Sharing", key="sharing", filterable="advanced", sortable=False ), grids.GridColumn( "Created", key="create_time", format=time_ago ), grids.GridColumn( "Last Updated", key="update_time", format=time_ago ), ] columns.append( grids.MulticolFilterColumn( "Search", cols_to_filter=[ columns[0], columns[2] ], key="free-text-search", visible=False, filterable="standard" ) ) global_actions = [ grids.GridAction( "Add new page", dict( action='create' ) ) ] operations = [ grids.DisplayByUsernameAndSlugGridOperation( "View", allow_multiple=False ), grids.GridOperation( "Edit content", allow_multiple=False, url_args=dict( action='edit_content') ), grids.GridOperation( "Edit attributes", allow_multiple=False, url_args=dict( action='edit') ), grids.GridOperation( "Share or Publish", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ), grids.GridOperation( "Delete", confirm="Are you sure you want to delete this page?" ), ] def apply_query_filter( self, trans, query, **kwargs ): return query.filter_by( user=trans.user, deleted=False )
class HistoryDatasetAssociationSelectionGrid(ItemSelectionGrid): """ Grid for selecting HDAs. """ # Grid definition. title = "Saved Datasets" model_class = model.HistoryDatasetAssociation columns = [ ItemSelectionGrid.NameColumn("Name", key="name", filterable="advanced"), grids.IndividualTagsColumn("Tags", key="tags", model_tag_association_class=model. HistoryDatasetAssociationTagAssociation, filterable="advanced"), grids.GridColumn("Last Updated", key="update_time", format=time_ago), # Columns that are valid for filtering but are not visible. grids.DeletedColumn("Deleted", key="deleted", visible=False, filterable="advanced"), grids.SharingStatusColumn("Sharing", key="sharing", filterable="advanced", sortable=False, visible=False), ] columns.append( grids.MulticolFilterColumn("Search", cols_to_filter=[columns[0], columns[1]], key="free-text-search", visible=False, filterable="standard")) def apply_query_filter(self, trans, query, **kwargs): # To filter HDAs by user, need to join HDA and History table and then filter histories by user. This is necessary because HDAs do not have # a user relation. return query.select_from( model.HistoryDatasetAssociation.table.join( model.History.table)).filter(model.History.user == trans.user)
class HistoryDatasetsSelectionGrid( grids.Grid ): # Grid definition. available_tracks = None title = "Add Datasets" template = "tracks/history_datasets_select_grid.mako" model_class = model.HistoryDatasetAssociation default_filter = { "deleted" : "False" , "shared" : "All" } default_sort_key = "-hid" use_async = True use_paging = False columns = [ grids.GridColumn( "Id", key="hid" ), grids.TextColumn( "Name", key="name", model_class=model.HistoryDatasetAssociation ), grids.TextColumn( "Filetype", key="extension", model_class=model.HistoryDatasetAssociation ), HistoryColumn( "History", key="history", visible=False ), DbKeyColumn( "Dbkey", key="dbkey", model_class=model.HistoryDatasetAssociation, visible=True, sortable=False ) ] columns.append( grids.MulticolFilterColumn( "Search name and filetype", cols_to_filter=[ columns[1], columns[2] ], key="free-text-search", visible=False, filterable="standard" ) ) def get_current_item( self, trans, **kwargs ): """ Current item for grid is the history being queried. This is a bit of hack since current_item typically means the current item in the grid. """ return model.History.get( trans.security.decode_id( kwargs[ 'f-history' ] ) ) def build_initial_query( self, trans, **kwargs ): return trans.sa_session.query( self.model_class ).join( model.History.table ).join( model.Dataset.table ) def apply_query_filter( self, trans, query, **kwargs ): if self.available_tracks is None: self.available_tracks = trans.app.datatypes_registry.get_available_tracks() return query.filter( model.HistoryDatasetAssociation.extension.in_(self.available_tracks) ) \ .filter( model.Dataset.state == model.Dataset.states.OK ) \ .filter( model.HistoryDatasetAssociation.deleted == False ) \ .filter( model.HistoryDatasetAssociation.visible == True )
class ReviewedRepositoriesIOwnGrid(RepositoriesWithReviewsGrid): title = "Reviewed repositories I own" columns = [ RepositoriesWithReviewsGrid.NameColumn( "Repository name", key="name", link=(lambda item: dict(operation="view_or_manage_repository", id=item.id)), attach_popup=True), RepositoriesWithReviewsGrid.WithReviewsRevisionColumn( "Reviewed revisions"), RepositoriesWithReviewsGrid.WithoutReviewsRevisionColumn( "Revisions for review"), RepositoriesWithReviewsGrid.ReviewersColumn("Reviewers", attach_popup=False), RepositoryGrid.DeprecatedColumn("Deprecated") ] columns.append( grids.MulticolFilterColumn("Search repository name", cols_to_filter=[columns[0]], key="free-text-search", visible=False, filterable="standard")) operations = [ grids.GridOperation("Inspect repository revisions", allow_multiple=False, condition=(lambda item: not item.deleted), async_compatible=False) ] def build_initial_query(self, trans, **kwd): return trans.sa_session.query( model.Repository ) \ .join( ( model.RepositoryReview.table, model.RepositoryReview.table.c.repository_id == model.Repository.table.c.id ) ) \ .filter( model.Repository.table.c.user_id == trans.user.id ) \ .join( ( model.User.table, model.User.table.c.id == model.RepositoryReview.table.c.user_id ) ) \ .outerjoin( ( model.ComponentReview.table, model.ComponentReview.table.c.repository_review_id == model.RepositoryReview.table.c.id ) ) \ .outerjoin( ( model.Component.table, model.Component.table.c.id == model.ComponentReview.table.c.component_id ) )
class DataTransferGrid(grids.Grid): # Custom column types class NameColumn(grids.TextColumn): def get_value(self, trans, grid, sample_dataset): return escape(sample_dataset.name) class SizeColumn(grids.TextColumn): def get_value(self, trans, grid, sample_dataset): return sample_dataset.size class StatusColumn(grids.TextColumn): def get_value(self, trans, grid, sample_dataset): return sample_dataset.status class ExternalServiceColumn(grids.TextColumn): def get_value(self, trans, grid, sample_dataset): try: return escape(sample_dataset.external_service.name) except: return 'None' # Grid definition title = "Sample Datasets" template = "admin/requests/sample_datasets_grid.mako" model_class = model.SampleDataset default_sort_key = "-create_time" num_rows_per_page = 50 preserve_state = True use_paging = False columns = [ NameColumn("Name", link=(lambda item: dict(operation="view", id=item.id)), attach_popup=True, filterable="advanced"), SizeColumn("Size", filterable="advanced"), grids.GridColumn("Last Updated", key="update_time", format=time_ago), ExternalServiceColumn( 'External service', link=(lambda item: dict(operation="view_external_service", id=item.external_service.id)), ), StatusColumn("Transfer Status", filterable="advanced", label_id_prefix='datasetTransferStatus-'), ] columns.append( grids.MulticolFilterColumn("Search", cols_to_filter=[columns[0]], key="free-text-search", visible=False, filterable="standard")) operations = [ grids.GridOperation( "Transfer", allow_multiple=True, condition=(lambda item: item.status in [model.SampleDataset.transfer_status.NOT_STARTED])), grids.GridOperation( "Rename", allow_multiple=True, allow_popup=False, condition=(lambda item: item.status in [model.SampleDataset.transfer_status.NOT_STARTED])), grids.GridOperation( "Delete", allow_multiple=True, condition=(lambda item: item.status in [model.SampleDataset.transfer_status.NOT_STARTED])) ] def apply_query_filter(self, trans, query, **kwd): sample_id = kwd.get('sample_id', None) if not sample_id: return query return query.filter_by(sample_id=trans.security.decode_id(sample_id))
class InstalledRepositoryGrid(grids.Grid): class ToolShedStatusColumn(grids.TextColumn): def get_value(self, trans, grid, tool_shed_repository): if tool_shed_repository.tool_shed_status: tool_shed_status_str = '' if tool_shed_repository.is_deprecated_in_tool_shed: tool_shed_status_str += generate_deprecated_repository_img_str( include_mouse_over=True) if tool_shed_repository.is_latest_installable_revision: tool_shed_status_str += generate_latest_revision_img_str( include_mouse_over=True) if tool_shed_repository.revision_update_available: tool_shed_status_str += generate_revision_updates_img_str( include_mouse_over=True) if tool_shed_repository.upgrade_available: tool_shed_status_str += generate_revision_upgrades_img_str( include_mouse_over=True) if tool_shed_repository.includes_workflows: tool_shed_status_str += generate_includes_workflows_img_str( include_mouse_over=True) else: tool_shed_status_str = generate_unknown_img_str( include_mouse_over=True) return tool_shed_status_str class NameColumn(grids.TextColumn): def get_value(self, trans, grid, tool_shed_repository): return str(tool_shed_repository.name) class DescriptionColumn(grids.TextColumn): def get_value(self, trans, grid, tool_shed_repository): return util.unicodify(tool_shed_repository.description) class OwnerColumn(grids.TextColumn): def get_value(self, trans, grid, tool_shed_repository): return str(tool_shed_repository.owner) class RevisionColumn(grids.TextColumn): def get_value(self, trans, grid, tool_shed_repository): return str(tool_shed_repository.changeset_revision) class StatusColumn(grids.TextColumn): def get_value(self, trans, grid, tool_shed_repository): return suc.get_tool_shed_repository_status_label( trans.app, tool_shed_repository) class ToolShedColumn(grids.TextColumn): def get_value(self, trans, grid, tool_shed_repository): return tool_shed_repository.tool_shed class DeletedColumn(grids.DeletedColumn): def get_accepted_filters(self): """ Returns a list of accepted filters for this column. """ accepted_filter_labels_and_vals = { "Active": "False", "Deactivated or uninstalled": "True", "All": "All" } accepted_filters = [] for label, val in accepted_filter_labels_and_vals.items(): args = {self.key: val} accepted_filters.append(grids.GridColumnFilter(label, args)) return accepted_filters # Grid definition title = "Installed tool shed repositories" model_class = tool_shed_install.ToolShedRepository template = '/admin/tool_shed_repository/grid.mako' default_sort_key = "name" columns = [ ToolShedStatusColumn(label=""), NameColumn( label="Name", key="name", link=(lambda item: iff( item.status in [ tool_shed_install.ToolShedRepository.installation_status. CLONING ], None, dict(operation="manage_repository", id=item.id))), attach_popup=True), DescriptionColumn(label="Description"), OwnerColumn(label="Owner"), RevisionColumn(label="Revision"), StatusColumn(label="Installation Status", filterable="advanced"), ToolShedColumn(label="Tool shed"), # Columns that are valid for filtering but are not visible. DeletedColumn(label="Status", key="deleted", visible=False, filterable="advanced") ] columns.append( grids.MulticolFilterColumn("Search repository name", cols_to_filter=[columns[1]], key="free-text-search", visible=False, filterable="standard")) global_actions = [ grids.GridAction( label="Update tool shed status", url_args=dict( controller='admin_toolshed', action='update_tool_shed_status_for_installed_repository', all_installed_repositories=True), inbound=False) ] operations = [ grids.GridOperation( label="Update tool shed status", condition=( lambda item: not item.deleted ), allow_multiple=False, url_args=dict( controller='admin_toolshed', action='browse_repositories', operation='update tool shed status' ) ), grids.GridOperation( label="Get updates", condition=( lambda item: \ not item.deleted and \ item.revision_update_available and \ item.status not in \ [ tool_shed_install.ToolShedRepository.installation_status.ERROR, tool_shed_install.ToolShedRepository.installation_status.NEW ] ), allow_multiple=False, url_args=dict( controller='admin_toolshed', action='browse_repositories', operation='get updates' ) ), grids.GridOperation( label="Install latest revision", condition=( lambda item: item.upgrade_available ), allow_multiple=False, url_args=dict( controller='admin_toolshed', action='browse_repositories', operation='install latest revision' ) ), grids.GridOperation( label="Install", condition=( lambda item: \ not item.deleted and \ item.status == tool_shed_install.ToolShedRepository.installation_status.NEW ), allow_multiple=False, url_args=dict( controller='admin_toolshed', action='manage_repository', operation='install' ) ), grids.GridOperation( label="Deactivate or uninstall", condition=( lambda item: \ not item.deleted and \ item.status != tool_shed_install.ToolShedRepository.installation_status.NEW ), allow_multiple=False, url_args=dict( controller='admin_toolshed', action='browse_repositories', operation='deactivate or uninstall' ) ), grids.GridOperation( label="Reset to install", condition=( lambda item: \ ( item.status == tool_shed_install.ToolShedRepository.installation_status.ERROR ) ), allow_multiple=False, url_args=dict( controller='admin_toolshed', action='browse_repositories', operation='reset to install' ) ), grids.GridOperation( label="Activate or reinstall", condition=( lambda item: item.deleted ), allow_multiple=False, target=None, url_args=dict( controller='admin_toolshed', action='browse_repositories', operation='activate or reinstall' ) ), grids.GridOperation( label="Purge", condition=( lambda item: item.is_new ), allow_multiple=False, target=None, url_args=dict( controller='admin_toolshed', action='browse_repositories', operation='purge' ) ) ] standard_filters = [] default_filter = dict(deleted="False") num_rows_per_page = 50 preserve_state = False use_paging = False def build_initial_query(self, trans, **kwd): return trans.install_model.context.query( self.model_class ) \ .order_by( self.model_class.table.c.tool_shed, self.model_class.table.c.name, self.model_class.table.c.owner, self.model_class.table.c.ctx_rev ) @property def legend(self): legend_str = '%s Updates are available in the Tool Shed for this revision<br/>' % generate_revision_updates_img_str( ) legend_str += '%s A newer installable revision is available for this repository<br/>' % generate_revision_upgrades_img_str( ) legend_str += '%s This is the latest installable revision of this repository<br/>' % generate_latest_revision_img_str( ) legend_str += '%s This repository is deprecated in the Tool Shed<br/>' % generate_deprecated_repository_img_str( ) legend_str += '%s This repository contains exported workflows<br/>' % generate_includes_workflows_img_str( ) legend_str += '%s Unable to get information from the Tool Shed<br/>' % generate_unknown_img_str( ) return legend_str
class QuotaListGrid( grids.Grid ): class NameColumn( grids.TextColumn ): def get_value( self, trans, grid, quota ): return escape(quota.name) class DescriptionColumn( grids.TextColumn ): def get_value( self, trans, grid, quota ): if quota.description: return escape(quota.description) return '' class AmountColumn( grids.TextColumn ): def get_value( self, trans, grid, quota ): return quota.operation + quota.display_amount class StatusColumn( grids.GridColumn ): def get_value( self, trans, grid, quota ): if quota.deleted: return "deleted" elif quota.default: return "<strong>default for %s users</strong>" % quota.default[0].type return "" class UsersColumn( grids.GridColumn ): def get_value( self, trans, grid, quota ): if quota.users: return len( quota.users ) return 0 class GroupsColumn( grids.GridColumn ): def get_value( self, trans, grid, quota ): if quota.groups: return len( quota.groups ) return 0 # Grid definition title = "Quotas" model_class = model.Quota template = '/admin/quota/grid.mako' default_sort_key = "name" columns = [ NameColumn( "Name", key="name", link=( lambda item: dict( operation="Change amount", id=item.id, webapp="galaxy" ) ), model_class=model.Quota, attach_popup=True, filterable="advanced" ), DescriptionColumn( "Description", key='description', model_class=model.Quota, attach_popup=False, filterable="advanced" ), AmountColumn( "Amount", key='amount', model_class=model.Quota, attach_popup=False, filterable="advanced" ), UsersColumn( "Users", attach_popup=False ), GroupsColumn( "Groups", attach_popup=False ), StatusColumn( "Status", attach_popup=False ), # Columns that are valid for filtering but are not visible. grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ) ] columns.append( grids.MulticolFilterColumn( "Search", cols_to_filter=[ columns[0], columns[1], columns[2] ], key="free-text-search", visible=False, filterable="standard" ) ) global_actions = [ grids.GridAction( "Add new quota", dict( controller='admin', action='quotas', operation='create' ) ) ] operations = [ grids.GridOperation( "Rename", condition=( lambda item: not item.deleted ), allow_multiple=False, url_args=dict( webapp="galaxy", action="rename_quota" ) ), grids.GridOperation( "Change amount", condition=( lambda item: not item.deleted ), allow_multiple=False, url_args=dict( webapp="galaxy", action="edit_quota" ) ), grids.GridOperation( "Manage users and groups", condition=( lambda item: not item.default and not item.deleted ), allow_multiple=False, url_args=dict( webapp="galaxy", action="manage_users_and_groups_for_quota" ) ), grids.GridOperation( "Set as different type of default", condition=( lambda item: item.default ), allow_multiple=False, url_args=dict( webapp="galaxy", action="set_quota_default" ) ), grids.GridOperation( "Set as default", condition=( lambda item: not item.default and not item.deleted ), allow_multiple=False, url_args=dict( webapp="galaxy", action="set_quota_default" ) ), grids.GridOperation( "Unset as default", condition=( lambda item: item.default and not item.deleted ), allow_multiple=False, url_args=dict( webapp="galaxy", action="unset_quota_default" ) ), grids.GridOperation( "Delete", condition=( lambda item: not item.deleted and not item.default ), allow_multiple=True, url_args=dict( webapp="galaxy", action="mark_quota_deleted" ) ), grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ), allow_multiple=True, url_args=dict( webapp="galaxy", action="undelete_quota" ) ), grids.GridOperation( "Purge", condition=( lambda item: item.deleted ), allow_multiple=True, url_args=dict( webapp="galaxy", action="purge_quota" ) ) ] standard_filters = [ grids.GridColumnFilter( "Active", args=dict( deleted=False ) ), grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ), grids.GridColumnFilter( "All", args=dict( deleted='All' ) ) ] num_rows_per_page = 50 preserve_state = False use_paging = True
class UserListGrid( grids.Grid ): class EmailColumn( grids.TextColumn ): def get_value( self, trans, grid, user ): return escape(user.email) class UserNameColumn( grids.TextColumn ): def get_value( self, trans, grid, user ): if user.username: return escape(user.username) return 'not set' class StatusColumn( grids.GridColumn ): def get_value( self, trans, grid, user ): if user.purged: return "purged" elif user.deleted: return "deleted" return "" class GroupsColumn( grids.GridColumn ): def get_value( self, trans, grid, user ): if user.groups: return len( user.groups ) return 0 class RolesColumn( grids.GridColumn ): def get_value( self, trans, grid, user ): if user.roles: return len( user.roles ) return 0 class ExternalColumn( grids.GridColumn ): def get_value( self, trans, grid, user ): if user.external: return 'yes' return 'no' class LastLoginColumn( grids.GridColumn ): def get_value( self, trans, grid, user ): if user.galaxy_sessions: return self.format( user.galaxy_sessions[ 0 ].update_time ) return 'never' class TimeCreatedColumn( grids.GridColumn ): def get_value( self, trans, grid, user ): return user.create_time.strftime('%x') class ActivatedColumn( grids.GridColumn ): def get_value( self, trans, grid, user ): if user.active: return 'Y' else: return 'N' # Grid definition title = "Users" model_class = model.User template = '/admin/user/grid.mako' default_sort_key = "email" columns = [ EmailColumn( "Email", key="email", model_class=model.User, link=( lambda item: dict( operation="information", id=item.id, webapp="galaxy" ) ), attach_popup=True, filterable="advanced", target="top" ), UserNameColumn( "User Name", key="username", model_class=model.User, attach_popup=False, filterable="advanced" ), GroupsColumn( "Groups", attach_popup=False ), RolesColumn( "Roles", attach_popup=False ), ExternalColumn( "External", attach_popup=False ), LastLoginColumn( "Last Login", format=time_ago ), StatusColumn( "Status", attach_popup=False ), TimeCreatedColumn( "Created", attach_popup=False ), ActivatedColumn( "Activated", attach_popup=False ), # Columns that are valid for filtering but are not visible. grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ) ] columns.append( grids.MulticolFilterColumn( "Search", cols_to_filter=[ columns[0], columns[1] ], key="free-text-search", visible=False, filterable="standard" ) ) global_actions = [ grids.GridAction( "Create new user", dict( controller='admin', action='users', operation='create', webapp="galaxy" ) ) ] operations = [ grids.GridOperation( "Manage Roles and Groups", condition=( lambda item: not item.deleted ), allow_multiple=False, url_args=dict( webapp="galaxy", action="manage_roles_and_groups_for_user" ) ), grids.GridOperation( "Reset Password", condition=( lambda item: not item.deleted ), allow_multiple=True, allow_popup=False, url_args=dict( webapp="galaxy", action="reset_user_password" ) ), grids.GridOperation( "Recalculate Disk Usage", condition=( lambda item: not item.deleted ), allow_multiple=False, url_args=dict( webapp="galaxy", action="recalculate_user_disk_usage" ) ) ] standard_filters = [ grids.GridColumnFilter( "Active", args=dict( deleted=False ) ), grids.GridColumnFilter( "Deleted", args=dict( deleted=True, purged=False ) ), grids.GridColumnFilter( "Purged", args=dict( purged=True ) ), grids.GridColumnFilter( "All", args=dict( deleted='All' ) ) ] num_rows_per_page = 50 preserve_state = False use_paging = True def get_current_item( self, trans, **kwargs ): return trans.user