diff --git a/lib/galaxy/webapps/tool_shed/controllers/repository.py b/lib/galaxy/webapps/tool_shed/controllers/repository.py
index 454bcffa7ef..88cd5bdc531 100644
--- a/lib/galaxy/webapps/tool_shed/controllers/repository.py
+++ b/lib/galaxy/webapps/tool_shed/controllers/repository.py
@@ -2432,6 +2432,7 @@ class RepositoryController( BaseUIController, ratings_util.ItemRatings ):
message='Select a repository to rate',
status='error' ) )
repository = suc.get_repository_in_tool_shed( trans, id )
+ changeset_revision = repository.tip( trans.app )
repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) )
if repository.user == trans.user:
return trans.response.send_redirect( web.url_for( controller='repository',
@@ -2447,12 +2448,14 @@ class RepositoryController( BaseUIController, ratings_util.ItemRatings ):
rra = self.get_user_item_rating( trans.sa_session, trans.user, repository, webapp_model=trans.model )
metadata = metadata_util.get_repository_metadata_by_repository_id_changeset_revision( trans,
id,
- repository.tip( trans.app ),
+ changeset_revision,
metadata_only=True )
repository_type_select_field = rt_util.build_repository_type_select_field( trans, repository=repository )
+ revision_label = suc.get_revision_label( trans, repository, changeset_revision )
return trans.fill_template( '/webapps/tool_shed/repository/rate_repository.mako',
repository=repository,
metadata=metadata,
+ revision_label=revision_label,
avg_rating=avg_rating,
display_reviews=display_reviews,
num_ratings=num_ratings,
@@ -2862,13 +2865,10 @@ class RepositoryController( BaseUIController, ratings_util.ItemRatings ):
has_metadata = True
else:
has_metadata = False
- t, tz = ctx.date()
- date = datetime( *gmtime( float( t ) - tz )[:6] )
- display_date = date.strftime( "%Y-%m-%d" )
change_dict = { 'ctx' : ctx,
'rev' : str( ctx.rev() ),
'date' : date,
- 'display_date' : display_date,
+ 'display_date' : suc.get_readable_ctx_date( ctx ),
'description' : ctx.description(),
'files' : ctx.files(),
'user' : ctx.user(),
@@ -2923,16 +2923,18 @@ class RepositoryController( BaseUIController, ratings_util.ItemRatings ):
metadata = metadata_util.get_repository_metadata_by_repository_id_changeset_revision( trans, id, ctx_str, metadata_only=True )
# For rendering the prev button.
if ctx_parent:
+ ctx_parent_date = suc.get_readable_ctx_date( ctx_parent )
ctx_parent_rev = ctx_parent.rev()
if ctx_parent_rev < 0:
prev = None
else:
- prev = "%s:%s" % ( ctx_parent_rev, ctx_parent )
+ prev = "%s:%s (%s)" % ( ctx_parent_rev, ctx_parent, ctx_parent_date )
else:
prev = None
if ctx_child:
+ ctx_child_date = suc.get_readable_ctx_date( ctx_child )
ctx_child_rev = ctx_child.rev()
- next = "%s:%s" % ( ctx_child_rev, ctx_child )
+ next = "%s:%s (%s)" % ( ctx_child_rev, ctx_child, ctx_child_date )
else:
next = None
return trans.fill_template( '/webapps/tool_shed/repository/view_changeset.mako',
diff --git a/lib/tool_shed/grids/admin_grids.py b/lib/tool_shed/grids/admin_grids.py
index 8714e134187..967d9328afb 100644
--- a/lib/tool_shed/grids/admin_grids.py
+++ b/lib/tool_shed/grids/admin_grids.py
@@ -19,48 +19,72 @@ log = logging.getLogger( __name__ )
class UserGrid( grids.Grid ):
- # TODO: move this to an admin_common controller since it is virtually the same in the galaxy webapp.
+
+
class UserLoginColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, user ):
return user.email
+
+
class UserNameColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, user ):
if user.username:
return user.username
return 'not set'
+
+
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 StatusColumn( grids.GridColumn ):
+
def get_value( self, trans, grid, user ):
if user.purged:
return "purged"
elif user.deleted:
return "deleted"
return ""
+
+
class EmailColumn( grids.GridColumn ):
+
def filter( self, trans, user, query, column_filter ):
if column_filter == 'All':
return query
return query.filter( and_( model.Tool.table.c.user_id == model.User.table.c.id,
model.User.table.c.email == column_filter ) )
+
title = "Users"
model_class = model.User
template='/admin/user/grid.mako'
@@ -114,37 +138,56 @@ class UserGrid( grids.Grid ):
num_rows_per_page = 50
preserve_state = False
use_paging = True
+
def get_current_item( self, trans, **kwargs ):
return trans.user
+
class RoleGrid( grids.Grid ):
- # TODO: move this to an admin_common controller since it is virtually the same in the galaxy webapp.
+
+
class NameColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, role ):
return role.name
+
+
class DescriptionColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, role ):
if role.description:
return role.description
return ''
+
+
class TypeColumn( grids.TextColumn ):
def get_value( self, trans, grid, role ):
return role.type
+
+
class StatusColumn( grids.GridColumn ):
+
def get_value( self, trans, grid, role ):
if role.deleted:
return "deleted"
return ""
+
+
class GroupsColumn( grids.GridColumn ):
+
def get_value( self, trans, grid, role ):
if role.groups:
return len( role.groups )
return 0
+
+
class UsersColumn( grids.GridColumn ):
+
def get_value( self, trans, grid, role ):
if role.users:
return len( role.users )
return 0
+
title = "Roles"
model_class = model.Role
template='/admin/dataset_security/role/grid.mako'
@@ -205,29 +248,43 @@ class RoleGrid( grids.Grid ):
num_rows_per_page = 50
preserve_state = False
use_paging = True
+
def apply_query_filter( self, trans, query, **kwd ):
return query.filter( model.Role.type != model.Role.types.PRIVATE )
+
class GroupGrid( grids.Grid ):
- # TODO: move this to an admin_common controller since it is virtually the same in the galaxy webapp.
+
+
class NameColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, group ):
return group.name
+
+
class StatusColumn( grids.GridColumn ):
+
def get_value( self, trans, grid, group ):
if group.deleted:
return "deleted"
return ""
+
+
class RolesColumn( grids.GridColumn ):
+
def get_value( self, trans, grid, group ):
if group.roles:
return len( group.roles )
return 0
+
+
class UsersColumn( grids.GridColumn ):
+
def get_value( self, trans, grid, group ):
if group.members:
return len( group.members )
return 0
+
title = "Groups"
model_class = model.Group
template='/admin/dataset_security/group/grid.mako'
@@ -279,6 +336,7 @@ class GroupGrid( grids.Grid ):
preserve_state = False
use_paging = True
+
class ManageCategoryGrid( CategoryGrid ):
columns = [ col for col in CategoryGrid.columns ]
# Override the NameColumn to include an Edit link
@@ -292,12 +350,17 @@ class ManageCategoryGrid( CategoryGrid ):
dict( controller='admin', action='manage_categories', operation='create' ) )
]
+
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 ) ),
@@ -326,27 +389,43 @@ class AdminRepositoryGrid( RepositoryGrid ):
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 RepositoryMetadataGrid( grids.Grid ):
+
+
class IdColumn( grids.IntegerColumn ):
+
def get_value( self, trans, grid, repository_metadata ):
return repository_metadata.id
+
+
class NameColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, repository_metadata ):
return repository_metadata.repository.name
+
+
class OwnerColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, repository_metadata ):
return repository_metadata.repository.user.username
+
class RevisionColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, repository_metadata ):
repository = repository_metadata.repository
repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) )
ctx = suc.get_changectx_for_changeset( repo, repository_metadata.changeset_revision )
- return "%s:%s" % ( str( ctx.rev() ), repository_metadata.changeset_revision )
+ return suc.get_revision_label( trans, repository, repository_metadata.changeset_revision )
+
+
class ToolsColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, repository_metadata ):
tools_str = '0'
if repository_metadata:
@@ -358,7 +437,10 @@ class RepositoryMetadataGrid( grids.Grid ):
# tools_str += '%s %s
' % ( tool_metadata_dict[ 'id' ], tool_metadata_dict[ 'version' ] )
return '%d' % len( metadata[ 'tools' ] )
return tools_str
+
+
class DatatypesColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, repository_metadata ):
datatypes_str = '0'
if repository_metadata:
@@ -370,7 +452,10 @@ class RepositoryMetadataGrid( grids.Grid ):
# datatypes_str += '%s
' % datatype_metadata_dict[ 'extension' ]
return '%d' % len( metadata[ 'datatypes' ] )
return datatypes_str
+
+
class WorkflowsColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, repository_metadata ):
workflows_str = '0'
if repository_metadata:
@@ -387,21 +472,31 @@ class RepositoryMetadataGrid( grids.Grid ):
# workflows_str += '%s
' % workflow_metadata_dict[ 'name' ]
return '%d' % len( metadata[ 'workflows' ] )
return workflows_str
+
+
class DeletedColumn( grids.BooleanColumn ):
+
def get_value( self, trans, grid, repository_metadata ):
if repository_metadata.repository.deleted:
return 'yes'
return ''
+
+
class DeprecatedColumn( grids.BooleanColumn ):
+
def get_value( self, trans, grid, repository_metadata ):
if repository_metadata.repository.deprecated:
return 'yes'
return ''
+
+
class MaliciousColumn( grids.BooleanColumn ):
+
def get_value( self, trans, grid, repository_metadata ):
if repository_metadata.malicious:
return 'yes'
return ''
+
# Grid definition
title = "Repository Metadata"
model_class = model.RepositoryMetadata
@@ -440,6 +535,7 @@ class RepositoryMetadataGrid( grids.Grid ):
num_rows_per_page = 50
preserve_state = False
use_paging = True
+
def build_initial_query( self, trans, **kwd ):
return trans.sa_session.query( model.RepositoryMetadata ) \
.join( model.Repository.table )
diff --git a/lib/tool_shed/grids/repository_grids.py b/lib/tool_shed/grids/repository_grids.py
index 4a054851f6c..dc848038cac 100644
--- a/lib/tool_shed/grids/repository_grids.py
+++ b/lib/tool_shed/grids/repository_grids.py
@@ -101,6 +101,10 @@ class RepositoryGrid( grids.Grid ):
if len( select_field.options ) > 1:
return select_field.get_html()
elif len( select_field.options ) == 1:
+ option_items = select_field.options[ 0 ][ 0 ]
+ rev_label, rev_date = option_items.split( ' ' )
+ rev_date = '%s' % rev_date
+ return '%s %s' % ( rev_label, rev_date )
return select_field.options[ 0 ][ 0 ]
return ''
@@ -1134,7 +1138,7 @@ class RepositoryMetadataGrid( grids.Grid ):
repository = repository_metadata.repository
changeset_revision = repository_metadata.changeset_revision
changeset_revision_label = suc.get_revision_label( trans, repository, changeset_revision )
- return escape_html( changeset_revision_label )
+ return changeset_revision_label
class MaliciousColumn( grids.BooleanColumn ):
diff --git a/lib/tool_shed/grids/repository_review_grids.py b/lib/tool_shed/grids/repository_review_grids.py
index 99db9039b19..3a6428d3249 100644
--- a/lib/tool_shed/grids/repository_review_grids.py
+++ b/lib/tool_shed/grids/repository_review_grids.py
@@ -83,9 +83,10 @@ class RepositoriesWithReviewsGrid( RepositoryGrid ):
if repository_metadata_revisions:
rval = ''
for repository_metadata in repository_metadata_revisions:
- rev, label, changeset_revision = metadata_util.get_rev_label_changeset_revision_from_repository_metadata( trans,
- repository_metadata,
- repository=repository )
+ rev, label, changeset_revision = \
+ metadata_util.get_rev_label_changeset_revision_from_repository_metadata( trans,
+ repository_metadata,
+ repository=repository )
rval += '%s
' % \
( trans.security.encode_id( repository.id ), changeset_revision, label )
return rval
diff --git a/lib/tool_shed/grids/util.py b/lib/tool_shed/grids/util.py
index bd7450d607e..a9d036d9577 100644
--- a/lib/tool_shed/grids/util.py
+++ b/lib/tool_shed/grids/util.py
@@ -16,7 +16,8 @@ def build_approved_select_field( trans, name, selected_value=None, for_component
select_field.add_option( option_tup[ 0 ], option_tup[ 1 ], selected=selected )
return select_field
-def build_changeset_revision_select_field( trans, repository, selected_value=None, add_id_to_name=True, downloadable=False, reviewed=False, not_reviewed=False ):
+def build_changeset_revision_select_field( trans, repository, selected_value=None, add_id_to_name=True,
+ downloadable=False, reviewed=False, not_reviewed=False ):
"""Build a SelectField whose options are the changeset_rev strings of certain revisions of the received repository."""
options = []
changeset_tups = []
@@ -46,7 +47,10 @@ def build_changeset_revision_select_field( trans, repository, selected_value=Non
# Restrict the options to all revisions that have associated metadata.
repository_metadata_revisions = repository.metadata_revisions
for repository_metadata in repository_metadata_revisions:
- rev, label, changeset_revision = metadata_util.get_rev_label_changeset_revision_from_repository_metadata( trans, repository_metadata, repository=repository )
+ rev, label, changeset_revision = \
+ metadata_util.get_rev_label_changeset_revision_from_repository_metadata( trans,
+ repository_metadata,
+ repository=repository )
changeset_tups.append( ( rev, label, changeset_revision ) )
refresh_on_change_values.append( changeset_revision )
# Sort options by the revision label. Even though the downloadable_revisions query sorts by update_time,
diff --git a/lib/tool_shed/util/metadata_util.py b/lib/tool_shed/util/metadata_util.py
index cb08a572569..c196637a699 100644
--- a/lib/tool_shed/util/metadata_util.py
+++ b/lib/tool_shed/util/metadata_util.py
@@ -1108,16 +1108,19 @@ def get_rev_label_changeset_revision_from_repository_metadata( trans, repository
changeset_revision = repository_metadata.changeset_revision
ctx = suc.get_changectx_for_changeset( repo, changeset_revision )
if ctx:
+ changeset_revision_date = suc.get_readable_ctx_date( ctx )
rev = '%04d' % ctx.rev()
- label = "%s:%s" % ( str( ctx.rev() ), changeset_revision )
+ label = "%s:%s (%s)" % ( str( ctx.rev() ), changeset_revision, changeset_revision_date )
else:
rev = '-1'
label = "-1:%s" % changeset_revision
return rev, label, changeset_revision
-def get_sample_files_from_disk( repository_files_dir, tool_path=None, relative_install_dir=None, resetting_all_metadata_on_repository=False ):
+def get_sample_files_from_disk( repository_files_dir, tool_path=None, relative_install_dir=None,
+ resetting_all_metadata_on_repository=False ):
if resetting_all_metadata_on_repository:
- # Keep track of the location where the repository is temporarily cloned so that we can strip it when setting metadata.
+ # Keep track of the location where the repository is temporarily cloned so that we can strip
+ # it when setting metadata.
work_dir = repository_files_dir
sample_file_metadata_paths = []
sample_file_copy_paths = []
diff --git a/lib/tool_shed/util/shed_util_common.py b/lib/tool_shed/util/shed_util_common.py
index bf83152e1cc..3495ef49efe 100644
--- a/lib/tool_shed/util/shed_util_common.py
+++ b/lib/tool_shed/util/shed_util_common.py
@@ -924,6 +924,13 @@ def get_query_for_setting_metadata_on_repositories( trans, my_writable=False, or
return trans.install_model.context.query( trans.install_model.ToolShedRepository ) \
.filter( trans.install_model.ToolShedRepository.table.c.uninstalled == False )
+def get_readable_ctx_date( ctx ):
+ """Convert the date of the changeset (the received ctx) to a human-readable date."""
+ t, tz = ctx.date()
+ date = datetime( *gmtime( float( t ) - tz )[ :6 ] )
+ ctx_date = date.strftime( "%Y-%m-%d" )
+ return ctx_date
+
def get_repo_info_tuple_contents( repo_info_tuple ):
"""Take care in handling the repo_info_tuple as it evolves over time as new tool shed features are introduced."""
if len( repo_info_tuple ) == 6:
@@ -1206,7 +1213,8 @@ def get_revision_label( trans, repository, changeset_revision ):
repo = hg.repository( get_configured_ui(), repository.repo_path( trans.app ) )
ctx = get_changectx_for_changeset( repo, changeset_revision )
if ctx:
- return "%s:%s" % ( str( ctx.rev() ), changeset_revision )
+ return '%s:%s (%s)' % \
+ ( str( ctx.rev() ), changeset_revision, str( get_readable_ctx_date( ctx ) ) )
else:
return "-1:%s" % changeset_revision
@@ -1215,7 +1223,8 @@ def get_rev_label_from_changeset_revision( repo, changeset_revision ):
ctx = get_changectx_for_changeset( repo, changeset_revision )
if ctx:
rev = '%04d' % ctx.rev()
- label = "%s:%s" % ( str( ctx.rev() ), changeset_revision )
+ label = '%s:%s (%s)' % \
+ ( str( ctx.rev() ), changeset_revision, str( get_readable_ctx_date( ctx ) ) )
else:
rev = '-1'
label = "-1:%s" % changeset_revision
@@ -1477,9 +1486,6 @@ def handle_email_alerts( trans, repository, content_alert_str='', new_repo_alert
email_from = 'galaxy-no-reply@' + trans.request.host.split( ':' )[0]
tip_changeset = repo.changelog.tip()
ctx = repo.changectx( tip_changeset )
- t, tz = ctx.date()
- date = datetime( *gmtime( float( t ) - tz )[:6] )
- display_date = date.strftime( "%Y-%m-%d" )
try:
username = ctx.user().split()[0]
except:
@@ -1490,6 +1496,7 @@ def handle_email_alerts( trans, repository, content_alert_str='', new_repo_alert
template = new_repo_email_alert_template
else:
template = email_alert_template
+ display_date = get_readable_ctx_date( ctx )
admin_body = string.Template( template ).safe_substitute( host=trans.request.host,
sharable_link=sharable_link,
repository_name=repository.name,
diff --git a/templates/webapps/tool_shed/common/repository_actions_menu.mako b/templates/webapps/tool_shed/common/repository_actions_menu.mako
index 129fbfe091b..93364794687 100644
--- a/templates/webapps/tool_shed/common/repository_actions_menu.mako
+++ b/templates/webapps/tool_shed/common/repository_actions_menu.mako
@@ -174,7 +174,9 @@
Mark repository as not deprecated
%endif
%if can_download:
- Export this revision
+ %if changeset_revision is not None:
+ Export this revision
+ %endif
Download as a .tar.gz file
Download as a .tar.bz2 file
Download as a zip file
diff --git a/templates/webapps/tool_shed/repository/manage_repository.mako b/templates/webapps/tool_shed/repository/manage_repository.mako
index a8a93e2b07f..a14160533b5 100644
--- a/templates/webapps/tool_shed/repository/manage_repository.mako
+++ b/templates/webapps/tool_shed/repository/manage_repository.mako
@@ -181,9 +181,9 @@ ${render_tool_shed_repository_actions( repository, metadata=metadata, changeset_
| %if prev: - Previous changeset ${prev | h} + Previous changeset ${prev} %endif %if next: - Next changeset ${next | h} + Next changeset ${next} %endif | ||||
|
%if repository_reviews:
diff --git a/templates/webapps/tool_shed/repository_review/select_previous_review.mako b/templates/webapps/tool_shed/repository_review/select_previous_review.mako
index 285fd5b922f..8ccb9d12cf7 100644
--- a/templates/webapps/tool_shed/repository_review/select_previous_review.mako
+++ b/templates/webapps/tool_shed/repository_review/select_previous_review.mako
@@ -30,7 +30,7 @@ ${render_tool_shed_repository_actions( repository=repository )}
%endif
@@ -39,7 +39,7 @@ ${render_tool_shed_repository_actions( repository=repository )}
@@ -76,7 +76,7 @@ ${render_tool_shed_repository_actions( repository=repository )}
Copy this review
|
- ${previous_changeset_revision_label | h} | +${previous_changeset_revision_label} | ${render_star_rating( repository_rating_name, review.rating, disabled=True )} | ${approved_str | h} |