'
@@ -330,16 +435,16 @@ class ValidRepositoryListGrid( RepositoryListGrid ):
return ''
title = "Valid repositories"
columns = [
- RepositoryListGrid.NameColumn( "Name",
- key="name",
- attach_popup=True ),
- RepositoryListGrid.DescriptionColumn( "Synopsis",
- key="description",
- attach_popup=False ),
+ RepositoryGrid.NameColumn( "Name",
+ key="name",
+ attach_popup=True ),
+ RepositoryGrid.DescriptionColumn( "Synopsis",
+ key="description",
+ attach_popup=False ),
RevisionColumn( "Installable Revisions" ),
- RepositoryListGrid.UserColumn( "Owner",
- model_class=model.User,
- attach_popup=False ),
+ RepositoryGrid.UserColumn( "Owner",
+ model_class=model.User,
+ attach_popup=False ),
# Columns that are valid for filtering but are not visible.
RepositoryCategoryColumn( "Category",
model_class=model.Category,
@@ -355,22 +460,25 @@ class ValidRepositoryListGrid( RepositoryListGrid ):
def build_initial_query( self, trans, **kwd ):
if 'id' in kwd:
# The user is browsing categories of valid repositories, so filter the request by the received id, which is a category id.
- return trans.sa_session.query( self.model_class ) \
+ return trans.sa_session.query( model.Repository ) \
+ .filter( model.Repository.table.c.deprecated == False ) \
.join( model.RepositoryMetadata.table ) \
.join( model.User.table ) \
.join( model.RepositoryCategoryAssociation.table ) \
.join( model.Category.table ) \
.filter( and_( model.Category.table.c.id == trans.security.decode_id( kwd[ 'id' ] ),
model.RepositoryMetadata.table.c.downloadable == True ) )
- # The user performed a free text search on the ValidCategoryListGrid.
- return trans.sa_session.query( self.model_class ) \
+ # The user performed a free text search on the ValidCategoryGrid.
+ return trans.sa_session.query( model.Repository ) \
+ .filter( model.Repository.table.c.deprecated == False ) \
.join( model.RepositoryMetadata.table ) \
.join( model.User.table ) \
.outerjoin( model.RepositoryCategoryAssociation.table ) \
.outerjoin( model.Category.table ) \
.filter( model.RepositoryMetadata.table.c.downloadable == True )
-class MatchedRepositoryListGrid( grids.Grid ):
+class MatchedRepositoryGrid( grids.Grid ):
+ # This grid filters out repositories that have been marked as deprecated.
class NameColumn( grids.TextColumn ):
def get_value( self, trans, grid, repository_metadata ):
return repository_metadata.repository.name
@@ -413,38 +521,38 @@ class MatchedRepositoryListGrid( grids.Grid ):
if match_tuples:
for match_tuple in match_tuples:
repository_id, changeset_revision = match_tuple
- clause_list.append( "%s=%d and %s='%s'" % ( self.model_class.table.c.repository_id,
+ clause_list.append( "%s=%d and %s='%s'" % ( model.RepositoryMetadata.table.c.repository_id,
int( repository_id ),
- self.model_class.table.c.changeset_revision,
+ model.RepositoryMetadata.table.c.changeset_revision,
changeset_revision ) )
- return trans.sa_session.query( self.model_class ) \
+ return trans.sa_session.query( model.RepositoryMetadata ) \
.join( model.Repository ) \
+ .filter( model.Repository.table.c.deprecated == False ) \
.join( model.User.table ) \
.filter( or_( *clause_list ) ) \
.order_by( model.Repository.name )
# Return an empty query
- return trans.sa_session.query( self.model_class ) \
- .join( model.Repository ) \
- .join( model.User.table ) \
- .filter( self.model_class.table.c.repository_id == 0 )
+ return []
-class InstallMatchedRepositoryListGrid( MatchedRepositoryListGrid ):
- columns = [ col for col in MatchedRepositoryListGrid.columns ]
+class InstallMatchedRepositoryGrid( MatchedRepositoryGrid ):
+ columns = [ col for col in MatchedRepositoryGrid.columns ]
# Override the NameColumn
- columns[ 0 ] = MatchedRepositoryListGrid.NameColumn( "Name",
- link=( lambda item: dict( operation="view_or_manage_repository", id=item.id ) ),
- attach_popup=False )
+ columns[ 0 ] = MatchedRepositoryGrid.NameColumn( "Name",
+ link=( lambda item: dict( operation="view_or_manage_repository", id=item.id ) ),
+ attach_popup=False )
class RepositoryController( BaseUIController, ItemRatings ):
- install_matched_repository_list_grid = InstallMatchedRepositoryListGrid()
- matched_repository_list_grid = MatchedRepositoryListGrid()
- valid_repository_list_grid = ValidRepositoryListGrid()
- repository_list_grid = RepositoryListGrid()
- email_alerts_repository_list_grid = EmailAlertsRepositoryListGrid()
- category_list_grid = CategoryListGrid()
- valid_category_list_grid = ValidCategoryListGrid()
- writable_repository_list_grid = WritableRepositoryListGrid()
+ install_matched_repository_grid = InstallMatchedRepositoryGrid()
+ matched_repository_grid = MatchedRepositoryGrid()
+ valid_repository_grid = ValidRepositoryGrid()
+ repository_grid = RepositoryGrid()
+ email_alerts_repository_grid = EmailAlertsRepositoryGrid()
+ category_grid = CategoryGrid()
+ valid_category_grid = ValidCategoryGrid()
+ my_writable_repositories_grid = MyWritableRepositoriesGrid()
+ repositories_i_own_grid = RepositoriesIOwnGrid()
+ deprecated_repositories_i_own_grid = DeprecatedRepositoriesIOwnGrid()
def __add_hgweb_config_entry( self, trans, repository, repository_path ):
# Add an entry in the hgweb.config file for a new repository. An entry looks something like:
@@ -470,8 +578,8 @@ class RepositoryController( BaseUIController, ItemRatings ):
def browse_categories( self, trans, **kwd ):
# The request came from the tool shed.
if 'f-free-text-search' in kwd:
- # Trick to enable searching repository name, description from the CategoryListGrid. What we've done is rendered the search box for the
- # RepositoryListGrid on the grid.mako template for the CategoryListGrid. See ~/templates/webapps/community/category/grid.mako. Since we
+ # Trick to enable searching repository name, description from the CategoryGrid. What we've done is rendered the search box for the
+ # RepositoryGrid on the grid.mako template for the CategoryGrid. See ~/templates/webapps/community/category/grid.mako. Since we
# are searching repositories and not categories, redirect to browse_repositories().
if 'id' in kwd and 'f-free-text-search' in kwd and kwd[ 'id' ] == kwd[ 'f-free-text-search' ]:
# The value of 'id' has been set to the search string, which is a repository name. We'll try to get the desired encoded repository id to pass on.
@@ -491,7 +599,7 @@ class RepositoryController( BaseUIController, ItemRatings ):
return trans.response.send_redirect( web.url_for( controller='repository',
action='browse_repositories',
**kwd ) )
- return self.category_list_grid( trans, **kwd )
+ return self.category_grid( trans, **kwd )
@web.expose
def browse_invalid_tools( self, trans, **kwd ):
params = util.Params( kwd )
@@ -564,13 +672,27 @@ class RepositoryController( BaseUIController, ItemRatings ):
for k, v in kwd.items():
if k.startswith( 'f-' ):
del kwd[ k ]
- kwd[ 'f-email' ] = trans.user.email
+ return self.repositories_i_own_grid( trans, **kwd )
+ elif operation == "deprecated_repositories_i_own":
+ # Eliminate the current filters if any exist.
+ for k, v in kwd.items():
+ if k.startswith( 'f-' ):
+ del kwd[ k ]
+ return self.deprecated_repositories_i_own_grid( trans, **kwd )
+ elif operation in [ 'mark as deprecated', 'mark as not deprecated' ]:
+ # Eliminate the current filters if any exist.
+ for k, v in kwd.items():
+ if k.startswith( 'f-' ):
+ del kwd[ k ]
+ kwd[ 'mark_deprecated' ] = operation == 'mark as deprecated'
+ return trans.response.send_redirect( web.url_for( controller='repository',
+ action='deprecate',
+ **kwd ) )
elif operation == "reviewed_repositories_i_own":
return trans.response.send_redirect( web.url_for( controller='repository_review',
action='reviewed_repositories_i_own' ) )
- elif operation == "writable_repositories":
- kwd[ 'username' ] = trans.user.username
- return self.writable_repository_list_grid( trans, **kwd )
+ elif operation == "my_writable_repositories":
+ return self.my_writable_repositories_grid( trans, **kwd )
elif operation == "repositories_by_category":
# Eliminate the current filters if any exist.
for k, v in kwd.items():
@@ -590,7 +712,7 @@ class RepositoryController( BaseUIController, ItemRatings ):
kwd[ 'message' ] = 'You must be logged in to set email alerts.'
kwd[ 'status' ] = 'error'
del kwd[ 'operation' ]
- # The changeset_revision_select_field in the RepositoryListGrid performs a refresh_on_change
+ # The changeset_revision_select_field in the RepositoryGrid performs a refresh_on_change
# which sends in request parameters like changeset_revison_1, changeset_revision_2, etc. One
# of the many select fields on the grid performed the refresh_on_change, so we loop through
# all of the received values to see which value is not the repository tip. If we find it, we
@@ -607,7 +729,7 @@ class RepositoryController( BaseUIController, ItemRatings ):
operation='view_or_manage_repository',
id=trans.security.encode_id( repository.id ),
changeset_revision=v ) )
- return self.repository_list_grid( trans, **kwd )
+ return self.repository_grid( trans, **kwd )
@web.expose
def browse_repository( self, trans, id, **kwd ):
params = util.Params( kwd )
@@ -637,7 +759,7 @@ class RepositoryController( BaseUIController, ItemRatings ):
if kwd[ 'f-free-text-search' ] == 'All':
# The user performed a search, then clicked the "x" to eliminate the search criteria.
new_kwd = {}
- return self.valid_category_list_grid( trans, **new_kwd )
+ return self.valid_category_grid( trans, **new_kwd )
# Since we are searching valid repositories and not categories, redirect to browse_valid_repositories().
if 'id' in kwd and 'f-free-text-search' in kwd and kwd[ 'id' ] == kwd[ 'f-free-text-search' ]:
# The value of 'id' has been set to the search string, which is a repository name.
@@ -658,7 +780,7 @@ class RepositoryController( BaseUIController, ItemRatings ):
return trans.response.send_redirect( web.url_for( controller='repository',
action='browse_valid_repositories',
**kwd ) )
- return self.valid_category_list_grid( trans, **kwd )
+ return self.valid_category_grid( trans, **kwd )
@web.expose
def browse_valid_repositories( self, trans, **kwd ):
galaxy_url = kwd.get( 'galaxy_url', None )
@@ -667,7 +789,7 @@ class RepositoryController( BaseUIController, ItemRatings ):
# The user browsed to a category and then entered a search string, so get the category associated with it's value.
category_name = kwd[ 'f-Category.name' ]
category = get_category_by_name( trans, category_name )
- # Set the id value in kwd since it is required by the ValidRepositoryListGrid.build_initial_query method.
+ # Set the id value in kwd since it is required by the ValidRepositoryGrid.build_initial_query method.
kwd[ 'id' ] = trans.security.encode_id( category.id )
if galaxy_url:
trans.set_cookie( galaxy_url, name='toolshedgalaxyurl' )
@@ -690,7 +812,7 @@ class RepositoryController( BaseUIController, ItemRatings ):
category_id = kwd.get( 'id', None )
category = get_category( trans, category_id )
kwd[ 'f-Category.name' ] = category.name
- # The changeset_revision_select_field in the ValidRepositoryListGrid performs a refresh_on_change which sends in request parameters like
+ # The changeset_revision_select_field in the ValidRepositoryGrid performs a refresh_on_change which sends in request parameters like
# changeset_revison_1, changeset_revision_2, etc. One of the many select fields on the grid performed the refresh_on_change, so we loop
# through all of the received values to see which value is not the repository tip. If we find it, we know the refresh_on_change occurred
# and we have the necessary repository id and change set revision to pass on.
@@ -708,11 +830,11 @@ class RepositoryController( BaseUIController, ItemRatings ):
url_args = dict( action='browse_valid_repositories',
operation='preview_tools_in_changeset',
repository_id=repository_id )
- self.valid_repository_list_grid.operations = [ grids.GridOperation( "Preview and install",
+ self.valid_repository_grid.operations = [ grids.GridOperation( "Preview and install",
url_args=url_args,
allow_multiple=False,
async_compatible=False ) ]
- return self.valid_repository_list_grid( trans, **kwd )
+ return self.valid_repository_grid( trans, **kwd )
def __build_allow_push_select_field( self, trans, current_push_list, selected_value='none' ):
options = []
for user in trans.sa_session.query( trans.model.User ):
@@ -931,6 +1053,27 @@ class RepositoryController( BaseUIController, ItemRatings ):
message=message,
status=status )
@web.expose
+ @web.require_login( "deprecate repository" )
+ def deprecate( self, trans, **kwd ):
+ params = util.Params( kwd )
+ message = util.restore_text( params.get( 'message', '' ) )
+ status = params.get( 'status', 'done' )
+ repository_id = params.get( 'id', None )
+ repository = get_repository( trans, repository_id )
+ mark_deprecated = util.string_as_bool( params.get( 'mark_deprecated', False ) )
+ repository.deprecated = mark_deprecated
+ trans.sa_session.add( repository )
+ trans.sa_session.flush()
+ if mark_deprecated:
+ message = 'The repository %s has been marked as deprecated.' % repository.name
+ else:
+ message = 'The repository %s has been marked as not deprecated.' % repository.name
+ trans.response.send_redirect( web.url_for( controller='repository',
+ action='browse_repositories',
+ operation='repositories_i_own',
+ message=message,
+ status=status ) )
+ @web.expose
def display_tool( self, trans, repository_id, tool_config, changeset_revision, **kwd ):
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
@@ -1049,16 +1192,16 @@ class RepositoryController( BaseUIController, ItemRatings ):
dict( controller='repository', action='find_tools' ) ),
grids.GridAction( "Search for workflows",
dict( controller='repository', action='find_workflows' ) ) ]
- self.install_matched_repository_list_grid.global_actions = global_actions
+ self.install_matched_repository_grid.global_actions = global_actions
install_url_args = dict( controller='repository', action='find_tools' )
operations = [ grids.GridOperation( "Install", url_args=install_url_args, allow_multiple=True, async_compatible=False ) ]
- self.install_matched_repository_list_grid.operations = operations
- return self.install_matched_repository_list_grid( trans, **kwd )
+ self.install_matched_repository_grid.operations = operations
+ return self.install_matched_repository_grid( trans, **kwd )
else:
kwd[ 'message' ] = "tool id: %s
tool name: %s
tool version: %s
exact matches only: %s" % \
( self.__stringify( tool_ids ), self.__stringify( tool_names ), self.__stringify( tool_versions ), str( exact_matches_checked ) )
- self.matched_repository_list_grid.title = "Repositories with matching tools"
- return self.matched_repository_list_grid( trans, **kwd )
+ self.matched_repository_grid.title = "Repositories with matching tools"
+ return self.matched_repository_grid( trans, **kwd )
else:
message = "No search performed - each field must contain the same number of comma-separated items."
status = "error"
@@ -1135,16 +1278,16 @@ class RepositoryController( BaseUIController, ItemRatings ):
dict( controller='repository', action='find_tools' ) ),
grids.GridAction( "Search for workflows",
dict( controller='repository', action='find_workflows' ) ) ]
- self.install_matched_repository_list_grid.global_actions = global_actions
+ self.install_matched_repository_grid.global_actions = global_actions
install_url_args = dict( controller='repository', action='find_workflows' )
operations = [ grids.GridOperation( "Install", url_args=install_url_args, allow_multiple=True, async_compatible=False ) ]
- self.install_matched_repository_list_grid.operations = operations
- return self.install_matched_repository_list_grid( trans, **kwd )
+ self.install_matched_repository_grid.operations = operations
+ return self.install_matched_repository_grid( trans, **kwd )
else:
kwd[ 'message' ] = "workflow name: %s
exact matches only: %s" % \
( self.__stringify( workflow_names ), str( exact_matches_checked ) )
- self.matched_repository_list_grid.title = "Repositories with matching workflows"
- return self.matched_repository_list_grid( trans, **kwd )
+ self.matched_repository_grid.title = "Repositories with matching workflows"
+ return self.matched_repository_grid( trans, **kwd )
else:
message = "No search performed - each field must contain the same number of comma-separated items."
status = "error"
@@ -1407,17 +1550,24 @@ class RepositoryController( BaseUIController, ItemRatings ):
status = params.get( 'status', 'done' )
# See if there are any RepositoryMetadata records since menu items require them.
repository_metadata = trans.sa_session.query( model.RepositoryMetadata ).first()
- # See if the current user owns any repositories that have been reviewed.
- has_reviewed_repositories = False
current_user = trans.user
+ has_reviewed_repositories = False
+ has_deprecated_repositories = False
if current_user:
+ # See if the current user owns any repositories that have been reviewed.
for repository in current_user.active_repositories:
if repository.reviewed_revisions:
has_reviewed_repositories = True
break
+ # See if the current user has any repositories that have been marked as deprecated.
+ for repository in current_user.active_repositories:
+ if repository.deprecated:
+ has_deprecated_repositories = True
+ break
return trans.fill_template( '/webapps/community/index.mako',
repository_metadata=repository_metadata,
has_reviewed_repositories=has_reviewed_repositories,
+ has_deprecated_repositories=has_deprecated_repositories,
message=message,
status=status )
@web.expose
@@ -1738,7 +1888,8 @@ class RepositoryController( BaseUIController, ItemRatings ):
kwd[ 'message' ] = 'You must be logged in to set email alerts.'
kwd[ 'status' ] = 'error'
del kwd[ 'operation' ]
- return self.email_alerts_repository_list_grid( trans, **kwd )
+ self.email_alerts_repository_grid.title = "Set email alerts for repository changes"
+ return self.email_alerts_repository_grid( trans, **kwd )
def __new_state( self, trans, all_pages=False ):
"""
Create a new `DefaultToolState` for this tool. It will not be initialized
diff --git a/lib/galaxy/webapps/community/controllers/repository_review.py b/lib/galaxy/webapps/community/controllers/repository_review.py
index cfcc3f6136b..4f82a33358c 100644
--- a/lib/galaxy/webapps/community/controllers/repository_review.py
+++ b/lib/galaxy/webapps/community/controllers/repository_review.py
@@ -7,7 +7,7 @@ from galaxy.web.framework.helpers import time_ago, iff, grids
from galaxy.model.orm import *
from sqlalchemy.sql.expression import func
from common import *
-from repository import RepositoryListGrid
+from repository import RepositoryGrid
from galaxy.util.shed_util import get_configured_ui
from galaxy.util.odict import odict
@@ -48,36 +48,33 @@ class ComponentGrid( grids.Grid ):
preserve_state = False
use_paging = True
-class RepositoriesWithReviewsGrid( RepositoryListGrid ):
+class RepositoriesWithReviewsGrid( RepositoryGrid ):
+ # This grid filters out repositories that have been marked as deprecated.
class ReviewersColumn( grids.TextColumn ):
def get_value( self, trans, grid, repository ):
+ rval = ''
if repository.reviewers:
- rval = ''
for user in repository.reviewers:
- rval += '%s
' % user.username
- return rval
- return ''
- title = "All reviewed Repositories"
+ rval += '' % trans.security.encode_id( user.id )
+ rval += '%s | ' % user.username
+ rval = rval.rstrip( ' | ' )
+ return rval
+ title = "All reviewed repositories"
model_class = model.Repository
template='/webapps/community/repository_review/grid.mako'
default_sort_key = "Repository.name"
columns = [
- RepositoryListGrid.NameColumn( "Repository name",
- key="name",
- link=( lambda item: dict( operation="view_or_manage_repository", id=item.id ) ),
- attach_popup=True ),
- RepositoryListGrid.DescriptionColumn( "Synopsis",
- key="description",
- attach_popup=False ),
- RepositoryListGrid.WithReviewsRevisionColumn( "Reviewed revisions" ),
- RepositoryListGrid.WithoutReviewsRevisionColumn( "Revisions for review" ),
- RepositoryListGrid.UserColumn( "Owner",
- attach_popup=False ),
- ReviewersColumn( "Reviewers",
- attach_popup=False )
+ RepositoryGrid.NameColumn( "Repository name",
+ key="name",
+ link=( lambda item: dict( operation="view_or_manage_repository", id=item.id ) ),
+ attach_popup=True ),
+ RepositoryGrid.WithReviewsRevisionColumn( "Reviewed revisions" ),
+ RepositoryGrid.WithoutReviewsRevisionColumn( "Revisions for review" ),
+ RepositoryGrid.UserColumn( "Owner", attach_popup=False ),
+ ReviewersColumn( "Reviewers", attach_popup=False )
]
- columns.append( grids.MulticolFilterColumn( "Search repository name, description",
- cols_to_filter=[ columns[0], columns[1] ],
+ columns.append( grids.MulticolFilterColumn( "Search repository name",
+ cols_to_filter=[ columns[0] ],
key="free-text-search",
visible=False,
filterable="standard" ) )
@@ -89,12 +86,14 @@ class RepositoriesWithReviewsGrid( RepositoryListGrid ):
]
def build_initial_query( self, trans, **kwd ):
return trans.sa_session.query( model.Repository ) \
+ .filter( model.Repository.table.c.deprecated == False ) \
.join( ( model.RepositoryReview.table, model.RepositoryReview.table.c.repository_id == model.Repository.table.c.id ) ) \
.join( ( model.User.table, model.User.table.c.id == model.Repository.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 RepositoriesWithoutReviewsGrid( RepositoriesWithReviewsGrid ):
+ # This grid filters out repositories that have been marked as deprecated.
title = "Repositories with no reviews"
columns = [
RepositoriesWithReviewsGrid.NameColumn( "Repository name",
@@ -119,12 +118,15 @@ class RepositoriesWithoutReviewsGrid( RepositoriesWithReviewsGrid ):
async_compatible=False ) ]
def build_initial_query( self, trans, **kwd ):
return trans.sa_session.query( model.Repository ) \
- .filter( model.Repository.reviews == None ) \
+ .filter( and_( model.Repository.table.c.deprecated == False,
+ model.Repository.reviews == None ) ) \
.join( model.User.table )
class RepositoriesReviewedByMeGrid( RepositoriesWithReviewsGrid ):
+ # This grid filters out repositories that have been marked as deprecated.
def build_initial_query( self, trans, **kwd ):
return trans.sa_session.query( model.Repository ) \
+ .filter( 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 ) ) \
@@ -132,6 +134,7 @@ class RepositoriesReviewedByMeGrid( RepositoriesWithReviewsGrid ):
.outerjoin( ( model.Component.table, model.Component.table.c.id == model.ComponentReview.table.c.component_id ) )
class RepositoryReviewsByUserGrid( grids.Grid ):
+ # This grid filters out repositories that have been marked as deprecated.
class RepositoryNameColumn( grids.TextColumn ):
def get_value( self, trans, grid, review ):
return review.repository.name
@@ -166,33 +169,61 @@ class RepositoryReviewsByUserGrid( grids.Grid ):
default_sort_key = 'repository_id'
columns = [
RepositoryNameColumn( "Repository Name",
- model_class=model.Repository,
- key="Repository.name",
- attach_popup=False ),
+ model_class=model.Repository,
+ key="Repository.name",
+ link=( lambda item: dict( operation="view_or_manage_repository", id=item.id ) ),
+ attach_popup=True ),
RepositoryDescriptionColumn( "Description",
- model_class=model.Repository,
- key="Repository.description",
- attach_popup=False ),
- RevisionColumn( "Revision",
- attach_popup=False ),
- RatingColumn( "Rating",
- attach_popup=False )
+ model_class=model.Repository,
+ key="Repository.description",
+ attach_popup=False ),
+ RevisionColumn( "Revision", attach_popup=False ),
+ RatingColumn( "Rating", attach_popup=False ),
]
# Override these
default_filter = {}
global_actions = []
- operations = []
+ operations = [
+ grids.GridOperation( "Inspect repository revisions",
+ allow_multiple=False,
+ condition=( lambda item: not item.deleted ),
+ async_compatible=False )
+ ]
standard_filters = []
num_rows_per_page = 50
preserve_state = False
use_paging = True
def build_initial_query( self, trans, **kwd ):
user_id = trans.security.decode_id( kwd[ 'id' ] )
- return trans.sa_session.query( self.model_class ) \
+ return trans.sa_session.query( model.RepositoryReview ) \
.filter( and_( model.RepositoryReview.table.c.deleted == False, \
- model.RepositoryReview.table.c.user_id == user_id ) )
+ model.RepositoryReview.table.c.user_id == user_id ) ) \
+ .join( ( model.Repository.table, model.RepositoryReview.table.c.repository_id == model.Repository.table.c.id ) ) \
+ .filter( model.Repository.table.c.deprecated == False )
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 ) ) \
@@ -655,10 +686,26 @@ class RepositoryReviewController( BaseUIController, ItemRatings ):
@web.expose
@web.require_login( "repository reviews by user" )
def repository_reviews_by_user( self, trans, **kwd ):
- # The user may not be the current user. The value of the received id is the encoded user id.
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
+
+ if 'operation' in kwd:
+ operation = kwd['operation'].lower()
+ # The value of the received id is the encoded review id.
+ review = get_review( trans, kwd[ 'id' ] )
+ repository = review.repository
+ kwd[ 'id' ] = trans.security.encode_id( repository.id )
+ if operation == "inspect repository revisions":
+ return trans.response.send_redirect( web.url_for( controller='repository_review',
+ action='manage_repository_reviews',
+ **kwd ) )
+ if operation == "view_or_manage_repository":
+ kwd[ 'changeset_revision' ] = review.changeset_revision
+ return trans.response.send_redirect( web.url_for( controller='repository_review',
+ action='view_or_manage_repository',
+ **kwd ) )
+ # The user may not be the current user. The value of the received id is the encoded user id.
user = get_user( trans, kwd[ 'id' ] )
self.repository_reviews_by_user_grid.title = "All repository revision reviews for user '%s'" % user.username
return self.repository_reviews_by_user_grid( trans, **kwd )
@@ -668,6 +715,13 @@ class RepositoryReviewController( BaseUIController, ItemRatings ):
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
+ # The value of the received id is the encoded repository id.
+ if 'operation' in kwd:
+ operation = kwd['operation'].lower()
+ if operation == "view_or_manage_repository":
+ return trans.response.send_redirect( web.url_for( controller='repository_review',
+ action='view_or_manage_repository',
+ **kwd ) )
return self.reviewed_repositories_i_own_grid( trans, **kwd )
@web.expose
@web.require_login( "select previous review" )
diff --git a/lib/galaxy/webapps/community/model/__init__.py b/lib/galaxy/webapps/community/model/__init__.py
index 7d8c2dd8905..c2ec7828f1a 100644
--- a/lib/galaxy/webapps/community/model/__init__.py
+++ b/lib/galaxy/webapps/community/model/__init__.py
@@ -109,7 +109,8 @@ class Repository( object ):
MARKED_FOR_REMOVAL = 'r',
MARKED_FOR_ADDITION = 'a',
NOT_TRACKED = '?' )
- def __init__( self, name=None, description=None, long_description=None, user_id=None, private=False, email_alerts=None, times_downloaded=0 ):
+ def __init__( self, name=None, description=None, long_description=None, user_id=None, private=False, email_alerts=None, times_downloaded=0,
+ deprecated=False ):
self.name = name or "Unnamed repository"
self.description = description
self.long_description = long_description
@@ -117,6 +118,7 @@ class Repository( object ):
self.private = private
self.email_alerts = email_alerts
self.times_downloaded = times_downloaded
+ self.deprecated = deprecated
@property
def repo_path( self ):
# Repository locations on disk are defined in the hgweb.config file
diff --git a/lib/galaxy/webapps/community/model/mapping.py b/lib/galaxy/webapps/community/model/mapping.py
index 184dfd222f2..7ad1203ea8b 100644
--- a/lib/galaxy/webapps/community/model/mapping.py
+++ b/lib/galaxy/webapps/community/model/mapping.py
@@ -111,7 +111,8 @@ Repository.table = Table( "repository", metadata,
Column( "private", Boolean, default=False ),
Column( "deleted", Boolean, index=True, default=False ),
Column( "email_alerts", JSONType, nullable=True ),
- Column( "times_downloaded", Integer ) )
+ Column( "times_downloaded", Integer ),
+ Column( "deprecated", Boolean, default=False ) )
RepositoryMetadata.table = Table( "repository_metadata", metadata,
Column( "id", Integer, primary_key=True ),
@@ -218,7 +219,10 @@ assign_mapper( context, Tag, Tag.table,
properties=dict( children=relation(Tag, backref=backref( 'parent', remote_side=[ Tag.table.c.id ] ) ) ) )
assign_mapper( context, Category, Category.table,
- properties=dict( repositories=relation( RepositoryCategoryAssociation ) ) )
+ properties=dict( repositories=relation( RepositoryCategoryAssociation,
+ secondary=Repository.table,
+ primaryjoin=( Category.table.c.id == RepositoryCategoryAssociation.table.c.category_id ),
+ secondaryjoin=( ( RepositoryCategoryAssociation.table.c.repository_id == Repository.table.c.id ) & ( Repository.table.c.deprecated == False ) ) ) ) )
assign_mapper( context, Repository, Repository.table,
properties = dict(
diff --git a/lib/galaxy/webapps/community/model/migrate/versions/0014_add_deprecated_column.py b/lib/galaxy/webapps/community/model/migrate/versions/0014_add_deprecated_column.py
new file mode 100644
index 00000000000..e0e8de4ff53
--- /dev/null
+++ b/lib/galaxy/webapps/community/model/migrate/versions/0014_add_deprecated_column.py
@@ -0,0 +1,53 @@
+"""
+Migration script to add the deprecated column to the repository table.
+"""
+
+from sqlalchemy import *
+from sqlalchemy.orm import *
+from migrate import *
+from migrate.changeset import *
+
+# Need our custom types, but don't import anything else from model
+from galaxy.model.custom_types import *
+
+import sys, logging
+log = logging.getLogger( __name__ )
+log.setLevel(logging.DEBUG)
+handler = logging.StreamHandler( sys.stdout )
+format = "%(name)s %(levelname)s %(asctime)s %(message)s"
+formatter = logging.Formatter( format )
+handler.setFormatter( formatter )
+log.addHandler( handler )
+
+metadata = MetaData( migrate_engine )
+db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) )
+
+def upgrade():
+ print __doc__
+ metadata.reflect()
+ # Create and initialize imported column in job table.
+ Repository_table = Table( "repository", metadata, autoload=True )
+ c = Column( "deprecated", Boolean, default=False )
+ try:
+ # Create
+ c.create( Repository_table )
+ assert c is Repository_table.c.deprecated
+ # Initialize.
+ if migrate_engine.name == 'mysql' or migrate_engine.name == 'sqlite':
+ default_false = "0"
+ elif migrate_engine.name == 'postgres':
+ default_false = "false"
+ db_session.execute( "UPDATE repository SET deprecated=%s" % default_false )
+ except Exception, e:
+ print "Adding deprecated column to the repository table failed: %s" % str( e )
+ log.debug( "Adding deprecated column to the repository table failed: %s" % str( e ) )
+
+def downgrade():
+ metadata.reflect()
+ # Drop email_alerts column from repository table.
+ Repository_table = Table( "repository", metadata, autoload=True )
+ try:
+ Repository_table.c.deprecated.drop()
+ except Exception, e:
+ print "Dropping column deprecated from the repository table failed: %s" % str( e )
+ log.debug( "Dropping column deprecated from the repository table failed: %s" % str( e ) )
diff --git a/templates/webapps/community/category/grid.mako b/templates/webapps/community/category/grid.mako
index 84833a4ce66..653c1dd4abe 100644
--- a/templates/webapps/community/category/grid.mako
+++ b/templates/webapps/community/category/grid.mako
@@ -49,8 +49,8 @@
<%def name="grid_body( grid )">
<%
- from galaxy.webapps.community.controllers.repository import RepositoryListGrid
- repo_grid = RepositoryListGrid()
+ from galaxy.webapps.community.controllers.repository import RepositoryGrid
+ repo_grid = RepositoryGrid()
%>
${self.make_grid( grid, repo_grid )}
%def>
diff --git a/templates/webapps/community/category/valid_grid.mako b/templates/webapps/community/category/valid_grid.mako
index f3c8633918b..1ec8d367a2d 100644
--- a/templates/webapps/community/category/valid_grid.mako
+++ b/templates/webapps/community/category/valid_grid.mako
@@ -48,8 +48,8 @@
<%def name="grid_body( grid )">
<%
- from galaxy.webapps.community.controllers.repository import ValidRepositoryListGrid
- repo_grid = ValidRepositoryListGrid()
+ from galaxy.webapps.community.controllers.repository import ValidRepositoryGrid
+ repo_grid = ValidRepositoryGrid()
%>
${self.make_grid( grid, repo_grid )}
%def>
diff --git a/templates/webapps/community/index.mako b/templates/webapps/community/index.mako
index 4c2d27531a9..708ba96359e 100644
--- a/templates/webapps/community/index.mako
+++ b/templates/webapps/community/index.mako
@@ -78,8 +78,13 @@
Reviewed repositories I own
%endif
+ %if has_deprecated_repositories:
+
+ %endif