Include the changeset revision date whenever displaying the changeset revision for a repository in the tool shed per request by Ross Lazarus.

This commit is contained in:
Greg Von Kuster
2014-01-10 14:30:18 -05:00
parent d85edddba1
commit d6ce2f475f
18 changed files with 175 additions and 47 deletions
@@ -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 = "<b>%s:%s</b> <i>(%s)</i>" % ( 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 = "<b>%s:%s</b> <i>(%s)</i>" % ( ctx_child_rev, ctx_child, ctx_child_date )
else:
next = None
return trans.fill_template( '/webapps/tool_shed/repository/view_changeset.mako',
+100 -4
View File
@@ -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 <b>%s</b><br/>' % ( 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<br/>' % 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<br/>' % 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 )
+5 -1
View File
@@ -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 = '<i><font color="#666666">%s</font></i>' % 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 ):
@@ -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 += '<a href="manage_repository_reviews_of_revision?id=%s&changeset_revision=%s">%s</a><br/>' % \
( trans.security.encode_id( repository.id ), changeset_revision, label )
return rval
+6 -2
View File
@@ -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,
+6 -3
View File
@@ -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 = []
+12 -5
View File
@@ -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 <i><font color="#666666">(%s)</font></i>' % \
( 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 <i><font color="#666666">(%s)</font></i>' % \
( 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,
@@ -174,7 +174,9 @@
<a class="action-button" target="galaxy_main" href="${h.url_for( controller='repository', action='deprecate', id=trans.security.encode_id( repository.id ), mark_deprecated=False )}">Mark repository as not deprecated</a>
%endif
%if can_download:
<a class="action-button" href="${h.url_for( controller='repository', action='export', repository_id=trans.app.security.encode_id( repository.id ), changeset_revision=changeset_revision )}">Export this revision</a>
%if changeset_revision is not None:
<a class="action-button" href="${h.url_for( controller='repository', action='export', repository_id=trans.app.security.encode_id( repository.id ), changeset_revision=changeset_revision )}">Export this revision</a>
%endif
<a class="action-button" href="${h.url_for( controller='repository', action='download', repository_id=trans.app.security.encode_id( repository.id ), changeset_revision=repository.tip( trans.app ), file_type='gz' )}">Download as a .tar.gz file</a>
<a class="action-button" href="${h.url_for( controller='repository', action='download', repository_id=trans.app.security.encode_id( repository.id ), changeset_revision=repository.tip( trans.app ), file_type='bz2' )}">Download as a .tar.bz2 file</a>
<a class="action-button" href="${h.url_for( controller='repository', action='download', repository_id=trans.app.security.encode_id( repository.id ), changeset_revision=repository.tip( trans.app ), file_type='zip' )}">Download as a zip file</a>
@@ -181,9 +181,9 @@ ${render_tool_shed_repository_actions( repository, metadata=metadata, changeset_
<div class="form-row">
<label>Revision:</label>
%if can_view_change_log:
<a href="${h.url_for( controller='repository', action='view_changelog', id=trans.app.security.encode_id( repository.id ) )}">${revision_label | h}</a>
<a href="${h.url_for( controller='repository', action='view_changelog', id=trans.app.security.encode_id( repository.id ) )}">${revision_label}</a>
%else:
${revision_label | h}
${revision_label}
%endif
</div>
<div class="form-row">
@@ -51,7 +51,7 @@ ${render_galaxy_repository_actions( repository=repository )}
%else:
<div class="form-row">
<label>Revision:</label>
${revision_label | h}
${revision_label}
</div>
%endif
</div>
@@ -44,16 +44,20 @@ ${render_tool_shed_repository_actions( repository, metadata=None, changeset_revi
${render_clone_str( repository )}
</div>
%endif
${render_repository_type_select_field( repository_type_select_field, render_help=False )}
<div class="toolFormBody">
<div class="form-row">
<label>Type:</label>
${repository.type | h}
<div style="clear: both"></div>
</div>
<div class="form-row">
<label>Description:</label>
${repository.description | h}
<div style="clear: both"></div>
</div>
<div class="form-row">
<label>Version:</label>
${repository.revision( trans.app ) | h}
<label>Revision:</label>
${revision_label}
<div style="clear: both"></div>
</div>
<div class="form-row">
@@ -5,7 +5,6 @@
<%namespace file="/webapps/tool_shed/common/repository_actions_menu.mako" import="render_tool_shed_repository_actions" />
<%
from galaxy.web.framework.helpers import time_ago
is_new = repository.is_new( trans.app )
can_push = trans.app.security_agent.can_push( trans.app, trans.user, repository )
can_download = not is_new and ( not is_malicious or can_push )
@@ -108,7 +107,7 @@ ${render_tool_shed_repository_actions( repository=repository )}
</div>
<div class="form-row">
<label>Pushed:</label>
${time_ago( changeset[ 'date' ] )}
${changeset[ 'display_date' ]}
</div>
</td>
</tr>
@@ -49,13 +49,15 @@ ${render_tool_shed_repository_actions( repository=repository )}
%endif
<div class="toolForm">
<%
from tool_shed.util.shed_util_common import get_readable_ctx_date
changeset_revision_date = get_readable_ctx_date( ctx )
if can_download:
title_str = 'Changeset %s:%s' % ( ctx.rev(), ctx )
title_str = 'Changeset <b>%s:%s</b> <i>(%s)</i>' % ( ctx.rev(), ctx, changeset_revision_date )
else:
title_str = '%s changeset %s:%s' % ( repository.name, ctx.rev(), ctx )
title_str = '%s changeset <b>%s:%s</b> <i>(%s)</i>' % ( repository.name, ctx.rev(), ctx, changeset_revision_date )
%>
<div class="toolFormTitle">
${title_str | h}
${title_str}
</div>
<div class="toolFormBody">
<table class="grid">
@@ -63,10 +65,10 @@ ${render_tool_shed_repository_actions( repository=repository )}
<tr>
<td>
%if prev:
<a class="action-button" href="${h.url_for( controller='repository', action='view_changeset', id=trans.security.encode_id( repository.id ), ctx_str=ctx_parent )}">Previous changeset ${prev | h}</a>
<a class="action-button" href="${h.url_for( controller='repository', action='view_changeset', id=trans.security.encode_id( repository.id ), ctx_str=ctx_parent )}">Previous changeset ${prev}</a>
%endif
%if next:
<a class="action-button" href="${h.url_for( controller='repository', action='view_changeset', id=trans.security.encode_id( repository.id ), ctx_str=ctx_child )}">Next changeset ${next | h}</a>
<a class="action-button" href="${h.url_for( controller='repository', action='view_changeset', id=trans.security.encode_id( repository.id ), ctx_str=ctx_child )}">Next changeset ${next}</a>
%endif
</td>
</tr>
@@ -100,7 +100,11 @@
${repository.name | h}
%endif
</div>
${render_repository_type_select_field( repository_type_select_field, render_help=False )}
<div class="form-row">
<label>Type:</label>
${repository.type | h}
<div style="clear: both"></div>
</div>
<div class="form-row">
<label>Synopsis:</label>
${repository.description | h}
@@ -113,7 +117,7 @@
%if can_view_change_log:
<a href="${h.url_for( controller='repository', action='view_changelog', id=trans.app.security.encode_id( repository.id ) )}">${revision_label}</a>
%else:
${revision_label | h}
${revision_label}
%endif
</div>
<div class="form-row">
@@ -34,7 +34,7 @@ ${render_tool_shed_repository_actions( repository=repository, changeset_revision
</div>
<div class="form-row">
<label>Repository revision:</label>
<a class="action-button" href="${h.url_for( controller='repository_review', action='view_or_manage_repository', id=trans.security.encode_id( repository.id ), changeset_revision=review.changeset_revision )}">${changeset_revision_label | h}</a>
<a class="action-button" href="${h.url_for( controller='repository_review', action='view_or_manage_repository', id=trans.security.encode_id( repository.id ), changeset_revision=review.changeset_revision )}">${changeset_revision_label}</a>
<div style="clear: both"></div>
</div>
<div class="form-row">
@@ -45,7 +45,7 @@ ${render_tool_shed_repository_actions( repository=repository, changeset_revision
<div class="toolFormBody">
<div class="form-row">
<label>Revision:</label>
<a class="action-button" href="${h.url_for( controller='repository_review', action='view_or_manage_repository', id=trans.security.encode_id( repository.id ), changeset_revision=changeset_revision )}">${changeset_revision_label | h}</a>
<a class="action-button" href="${h.url_for( controller='repository_review', action='view_or_manage_repository', id=trans.security.encode_id( repository.id ), changeset_revision=changeset_revision )}">${changeset_revision_label}</a>
<div style="clear: both"></div>
</div>
<div class="form-row">
@@ -67,7 +67,7 @@ ${render_tool_shed_repository_actions( repository=repository )}
<tr>
<td>
<div style="float:left;" class="menubutton split popup" id="${changeset_revision}-popup">
<a class="view-info" href="${h.url_for( controller='repository_review', action='view_or_manage_repository', id=trans.security.encode_id( repository.id ), changeset_revision=changeset_revision )}">${changeset_revision_label | h}</a>
<a class="view-info" href="${h.url_for( controller='repository_review', action='view_or_manage_repository', id=trans.security.encode_id( repository.id ), changeset_revision=changeset_revision )}">${changeset_revision_label}</a>
</div>
<div popupmenu="${changeset_revision}-popup">
%if repository_reviews:
@@ -30,7 +30,7 @@ ${render_tool_shed_repository_actions( repository=repository )}
%endif
<div class="warningmessage">
You have elected to create a new review for revision <b>${changeset_revision_label | h}</b>of this repository. Since previous revisions have been reviewed,
You have elected to create a new review for revision <b>${changeset_revision_label}</b>of this repository. Since previous revisions have been reviewed,
you can select a previous review to copy to your new review, or click the <b>Create a review without copying</b> button.
</div>
@@ -39,7 +39,7 @@ ${render_tool_shed_repository_actions( repository=repository )}
<div class="toolFormBody">
<div class="form-row">
<label>Revision for new review:</label>
<a class="action-button" href="${h.url_for( controller='repository_review', action='view_or_manage_repository', id=trans.security.encode_id( repository.id ), changeset_revision=changeset_revision )}">${changeset_revision_label | h}</a>
<a class="action-button" href="${h.url_for( controller='repository_review', action='view_or_manage_repository', id=trans.security.encode_id( repository.id ), changeset_revision=changeset_revision )}">${changeset_revision_label}</a>
<div style="clear: both"></div>
</div>
<div class="form-row">
@@ -76,7 +76,7 @@ ${render_tool_shed_repository_actions( repository=repository )}
<a class="action-button" href="${h.url_for( controller='repository_review', action='create_review', id=trans.security.encode_id( repository.id ), changeset_revision=changeset_revision, previous_review_id=encoded_review_id )}">Copy this review</a>
</div>
</td>
<td>${previous_changeset_revision_label | h}</td>
<td>${previous_changeset_revision_label}</td>
<td>${render_star_rating( repository_rating_name, review.rating, disabled=True )}</td>
<td>${approved_str | h}</td>
</tr>