diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index aee5166c0de..0b16d1cc96c 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -2693,31 +2693,49 @@ class ToolVersion( object ): self.create_time = create_time self.tool_id = tool_id self.tool_shed_repository = tool_shed_repository + def get_previous_version( self, app ): + sa_session = app.model.context.current + tva = sa_session.query( app.model.ToolVersionAssociation ) \ + .filter( app.model.ToolVersionAssociation.table.c.tool_id == self.id ) \ + .first() + if tva: + return sa_session.query( app.model.ToolVersion ) \ + .filter( app.model.ToolVersion.table.c.id == tva.parent_id ) \ + .first() + return None + def get_next_version( self, app ): + sa_session = app.model.context.current + tva = sa_session.query( app.model.ToolVersionAssociation ) \ + .filter( app.model.ToolVersionAssociation.table.c.parent_id == self.id ) \ + .first() + if tva: + return sa_session.query( app.model.ToolVersion ) \ + .filter( app.model.ToolVersion.table.c.id == tva.tool_id ) \ + .first() + return None def get_versions( self, app ): sa_session = app.model.context.current tool_versions = [] # Prepend ancestors. - def __ancestors( tool_version ): + def __ancestors( app, tool_version ): # Should we handle multiple parents at each level? - previous_tva = tool_version.previous_version - if previous_tva: - parent_version = previous_tva[0].parent_version - if parent_version not in tool_versions: - tool_versions.insert( 0, parent_version ) - __ancestors( parent_version ) + previous_version = tool_version.get_previous_version( app ) + if previous_version: + if previous_version not in tool_versions: + tool_versions.insert( 0, previous_version ) + __ancestors( app, previous_version ) # Append descendants. - def __descendants( tool_version ): + def __descendants( app, tool_version ): # Should we handle multiple child siblings at each level? - next_tva = sa_session.query( app.model.ToolVersionAssociation ) \ - .filter( app.model.ToolVersionAssociation.table.c.parent_id == tool_version.id ) \ - .first() - if next_tva: - current_version = next_tva.tool_version - if current_version not in tool_versions: - tool_versions.append( current_version ) - __descendants( current_version ) - __ancestors( self ) - __descendants( self ) + next_version = tool_version.get_next_version( app ) + if next_version: + if next_version not in tool_versions: + tool_versions.append( next_version ) + __descendants( app, next_version ) + __ancestors( app, self ) + if self not in tool_versions: + tool_versions.append( self ) + __descendants( app, self ) return tool_versions def get_version_ids( self, app ): return [ tool_version.tool_id for tool_version in self.get_versions( app ) ] diff --git a/lib/galaxy/model/mapping.py b/lib/galaxy/model/mapping.py index cb4ead228bb..6d41ab4044d 100644 --- a/lib/galaxy/model/mapping.py +++ b/lib/galaxy/model/mapping.py @@ -1627,13 +1627,7 @@ assign_mapper( context, ToolShedRepository, ToolShedRepository.table, assign_mapper( context, ToolVersion, ToolVersion.table ) -assign_mapper( context, ToolVersionAssociation, ToolVersionAssociation.table, - properties=dict( tool_version=relation( ToolVersion, - primaryjoin=( ToolVersionAssociation.table.c.tool_id == ToolVersion.table.c.id ), - backref='current_version' ), - parent_version=relation( ToolVersion, - primaryjoin=( ToolVersionAssociation.table.c.parent_id == ToolVersion.table.c.id ), - backref='previous_version' ) ) ) +assign_mapper( context, ToolVersionAssociation, ToolVersionAssociation.table ) # Set up proxy so that # Page.users_shared_with diff --git a/lib/galaxy/web/base/controller.py b/lib/galaxy/web/base/controller.py index f436c42d631..2fe0d04196a 100644 --- a/lib/galaxy/web/base/controller.py +++ b/lib/galaxy/web/base/controller.py @@ -1311,6 +1311,7 @@ class Admin( object ): group_list_grid = None quota_list_grid = None repository_list_grid = None + tool_version_list_grid = None delete_operation = None undelete_operation = None purge_operation = None @@ -1362,6 +1363,12 @@ class Admin( object ): toolbox=toolbox, message=message, status=status ) + @web.expose + @web.require_admin + def tool_versions( self, trans, **kwd ): + if 'message' not in kwd or not kwd[ 'message' ]: + kwd[ 'message' ] = 'Tool ids for tools that are currently loaded into the tool panel are highlighted in green (click to display).' + return self.tool_version_list_grid( trans, **kwd ) # Galaxy Role Stuff @web.expose @web.require_admin diff --git a/lib/galaxy/web/controllers/admin.py b/lib/galaxy/web/controllers/admin.py index 6dabc40335f..0f52ce2feaa 100644 --- a/lib/galaxy/web/controllers/admin.py +++ b/lib/galaxy/web/controllers/admin.py @@ -383,12 +383,64 @@ class QuotaListGrid( grids.Grid ): preserve_state = False use_paging = True +class ToolVersionListGrid( grids.Grid ): + class ToolIdColumn( grids.TextColumn ): + def get_value( self, trans, grid, tool_version ): + if tool_version.tool_id in trans.app.toolbox.tools_by_id: + link = url_for( controller='tool_runner', tool_id=tool_version.tool_id ) + link_str = '' % link + return '
%s%s
' % ( 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 = '' + for tool_id in tool_version.get_version_ids( trans.app ): + if tool_id in trans.app.toolbox.tools_by_id: + link = url_for( controller='tool_runner', tool_id=tool_version.tool_id ) + link_str = '' % link + tool_ids_str += '
%s%s

' % ( link_str, tool_id ) + else: + tool_ids_str += '%s
' % tool_id + return tool_ids_str + class ToolShedRepositoryColumn( grids.TextColumn ): + def get_value( self, trans, grid, tool_version ): + if tool_version.tool_shed_repository: + return tool_version.tool_shed_repository.name + return '' + # Grid definition + title = "Tool versions" + model_class = 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)" ), + ToolShedRepositoryColumn( "Tool shed repository" ), + ] + columns.append( grids.MulticolFilterColumn( "Search repository name", + 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.sa_session.query( self.model_class ) + class AdminGalaxy( BaseUIController, Admin, AdminActions, UsesQuota, QuotaParamParser ): user_list_grid = UserListGrid() role_list_grid = RoleListGrid() group_list_grid = GroupListGrid() quota_list_grid = QuotaListGrid() + tool_version_list_grid = ToolVersionListGrid() delete_operation = grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ), allow_multiple=True ) undelete_operation = grids.GridOperation( "Undelete", condition=( lambda item: item.deleted and not item.purged ), allow_multiple=True ) purge_operation = grids.GridOperation( "Purge", condition=( lambda item: item.deleted and not item.purged ), allow_multiple=True ) diff --git a/templates/admin/tool_version/grid.mako b/templates/admin/tool_version/grid.mako new file mode 100644 index 00000000000..6a41b688c5e --- /dev/null +++ b/templates/admin/tool_version/grid.mako @@ -0,0 +1 @@ +<%inherit file="/grid_base.mako"/> diff --git a/templates/webapps/galaxy/admin/index.mako b/templates/webapps/galaxy/admin/index.mako index 6f174bf1abb..a3f1887d494 100644 --- a/templates/webapps/galaxy/admin/index.mako +++ b/templates/webapps/galaxy/admin/index.mako @@ -63,6 +63,7 @@
Server
+