Warning

This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.

Source code for tool_shed.grids.repository_review_grids

import logging

from markupsafe import escape
from sqlalchemy import (
    and_,
    false,
    null,
    or_,
    true,
)

from galaxy.web.legacy_framework import grids
from tool_shed.grids.repository_grids import RepositoryGrid
from tool_shed.util import (
    hg_util,
    metadata_util,
)
from tool_shed.webapp import model

log = logging.getLogger(__name__)


[docs]class ComponentGrid(grids.Grid):
[docs] class NameColumn(grids.TextColumn):
[docs] def get_value(self, trans, grid, component): return escape(component.name)
[docs] class DescriptionColumn(grids.TextColumn):
[docs] def get_value(self, trans, grid, component): return escape(component.description)
title = "Repository review components" model_class = model.Component template = "/webapps/tool_shed/repository_review/grid.mako" default_sort_key = "name" use_hide_message = False columns = [ NameColumn( "Name", key="Component.name", link=(lambda item: dict(operation="edit", id=item.id)), attach_popup=False ), DescriptionColumn("Description", key="Component.description", attach_popup=False), ] global_actions = [ grids.GridAction( "Add new component", dict(controller="repository_review", action="manage_components", operation="create") ) ] num_rows_per_page = 50
[docs]class RepositoriesWithReviewsGrid(RepositoryGrid): # This grid filters out repositories that have been marked as either deprecated or deleted.
[docs] class WithReviewsRevisionColumn(grids.GridColumn):
[docs] def get_value(self, trans, grid, repository): # Restrict to revisions that have been reviewed. if repository.reviews: rval = "" repo = repository.hg_repo for review in repository.reviews: changeset_revision = review.changeset_revision rev, label = hg_util.get_rev_label_from_changeset_revision(repo, changeset_revision) 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 return ""
[docs] class WithoutReviewsRevisionColumn(grids.GridColumn):
[docs] def get_value(self, trans, grid, repository): # Restrict the options to revisions that have not yet been reviewed. repository_metadata_revisions = metadata_util.get_repository_metadata_revisions_for_review( repository, reviewed=False ) if repository_metadata_revisions: rval = "" for repository_metadata in repository_metadata_revisions: rev, label, changeset_revision = hg_util.get_rev_label_changeset_revision_from_repository_metadata( trans.app, repository_metadata, repository=repository, include_date=True, include_hash=False ) 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 return ""
[docs] class ReviewersColumn(grids.TextColumn):
[docs] def get_value(self, trans, grid, repository): rval = "" if repository.reviewers: for user in repository.reviewers: rval += f'<a class="view-info" href="repository_reviews_by_user?id={trans.security.encode_id(user.id)}">' rval += f"{user.username}</a> | " if rval[-3:] == " | ": rval = rval[:-3] return rval
[docs] class RatingColumn(grids.TextColumn):
[docs] def get_value(self, trans, grid, repository): rval = "" for review in repository.reviews: if review.rating: for index in range(1, 6): rval += "<input " rval += f'name="star1-{trans.security.encode_id(review.id)}" ' rval += 'type="radio" ' rval += 'class="community_rating_star star" ' rval += 'disabled="disabled" ' rval += f'value="{str(review.rating)}" ' if review.rating > (index - 0.5) and review.rating < (index + 0.5): rval += 'checked="checked" ' rval += "/>" rval += "<br/>" return rval
[docs] class ApprovedColumn(grids.TextColumn):
[docs] def get_value(self, trans, grid, repository): rval = "" for review in repository.reviews: if review.approved: rval += f"{review.approved}<br/>" return rval
title = "All reviewed repositories" model_class = model.Repository template = "/webapps/tool_shed/repository_review/grid.mako" default_sort_key = "Repository.name" columns = [ RepositoryGrid.NameColumn( "Repository name", key="name", link=(lambda item: dict(operation="view_or_manage_repository", id=item.id)), attach_popup=True, ), RepositoryGrid.UserColumn("Owner", model_class=model.User, attach_popup=False, key="User.username"), WithReviewsRevisionColumn("Reviewed revisions"), ReviewersColumn("Reviewers", attach_popup=False), RatingColumn("Rating", attach_popup=False), 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", ) ) operations = [ grids.GridOperation( "Inspect repository revisions", allow_multiple=False, condition=(lambda item: not item.deleted), async_compatible=False, ) ]
[docs] 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, ) ) .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) ) )
[docs]class RepositoriesWithoutReviewsGrid(RepositoriesWithReviewsGrid): # This grid filters out repositories that have been marked as either deprecated or deleted. 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", 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, ) ]
[docs] 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 == null(), ) ) .join(model.User.table) )
[docs]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, ) ]
[docs] 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 == null(), ) ) .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) )
[docs]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", ) )
[docs] 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) ) )
[docs]class RepositoryReviewsByUserGrid(grids.Grid): # This grid filters out repositories that have been marked as deprecated.
[docs] class RepositoryNameColumn(grids.TextColumn):
[docs] def get_value(self, trans, grid, review): return escape(review.repository.name)
[docs] class RepositoryDescriptionColumn(grids.TextColumn):
[docs] def get_value(self, trans, grid, review): return escape(review.repository.description)
[docs] class RevisionColumn(grids.TextColumn):
[docs] def get_value(self, trans, grid, review): encoded_review_id = trans.security.encode_id(review.id) rval = '<a class="action-button" href="' if review.user == trans.user: rval += "edit_review" else: rval += "browse_review" revision_label = hg_util.get_revision_label( trans.app, review.repository, review.changeset_revision, include_date=True, include_hash=False ) rval += f'?id={encoded_review_id}">{revision_label}</a>' return rval
[docs] class RatingColumn(grids.TextColumn):
[docs] def get_value(self, trans, grid, review): if review.rating: for index in range(1, 6): rval = "<input " rval += f'name="star1-{trans.security.encode_id(review.id)}" ' rval += 'type="radio" ' rval += 'class="community_rating_star star" ' rval += 'disabled="disabled" ' rval += f'value="{str(review.rating)}" ' if review.rating > (index - 0.5) and review.rating < (index + 0.5): rval += 'checked="checked" ' rval += "/>" return rval return ""
title = "Reviews by user" model_class = model.RepositoryReview template = "/webapps/tool_shed/repository_review/grid.mako" default_sort_key = "repository_id" use_hide_message = False columns = [ RepositoryNameColumn( "Repository Name", 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), ] operations = [ grids.GridOperation( "Inspect repository revisions", allow_multiple=False, condition=(lambda item: not item.deleted), async_compatible=False, ) ] num_rows_per_page = 50
[docs] def build_initial_query(self, trans, **kwd): user_id = trans.security.decode_id(kwd["id"]) return ( trans.sa_session.query(model.RepositoryReview) .filter( and_( model.RepositoryReview.table.c.deleted == false(), 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()) )
[docs]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, ) ]
[docs] 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) ) )
[docs]class RepositoriesWithNoToolTestsGrid(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 that contain tools with no tests or test data" 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, ) ]
[docs] 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.RepositoryMetadata.table) .filter( and_( model.RepositoryMetadata.table.c.downloadable == true(), model.RepositoryMetadata.table.c.includes_tools == true(), model.RepositoryMetadata.table.c.tools_functionally_correct == false(), ) ) .join(model.User.table) )