Skip to content

Commit

Permalink
Merge branch 'release_22.05' into dev
Browse files Browse the repository at this point in the history
  • Loading branch information
nsoranzo committed Jul 13, 2022
2 parents d6b771c + b308b9f commit 5f11aa4
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 57 deletions.
8 changes: 7 additions & 1 deletion client/src/components/Tool/ToolForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
@onUpdateFavorites="onUpdateFavorites">
<template v-slot:body>
<FormDisplay
:id="formConfig.id"
:id="toolId"
:inputs="formConfig.inputs"
:validation-scroll-to="validationScrollTo"
@onChange="onChange"
Expand Down Expand Up @@ -170,6 +170,12 @@ export default {
toolName() {
return this.formConfig.name;
},
toolId() {
// ensure version is included in tool id, otherwise form inputs are
// not re-rendered when versions change.
const { id, version } = this.formConfig;
return id.endsWith(version) ? id : `${id}/${version}`;
},
tooltip() {
return `Execute: ${this.formConfig.name} (${this.formConfig.version})`;
},
Expand Down
6 changes: 3 additions & 3 deletions client/src/components/Workflow/WorkflowDropdown.vue
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,9 @@ export default {
return `/workflows/${this.workflow.id}/invocations`;
},
urlViewShared() {
return `${getAppRoot()}workflow/display_by_username_and_slug?username=${this.workflow.owner}&slug=${
this.workflow.slug
}`;
return `${getAppRoot()}workflow/display_by_username_and_slug?username=${
this.workflow.owner
}&slug=${encodeURIComponent(this.workflow.slug)}`;
},
readOnly() {
return !!this.workflow.shared;
Expand Down
6 changes: 4 additions & 2 deletions lib/galaxy/datatypes/interval.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
parse_gff3_attributes,
parse_gff_attributes,
)
from galaxy.model import DatasetInstance
from galaxy.util import compression_utils
from . import (
data,
Expand Down Expand Up @@ -167,10 +168,11 @@ def set_meta(self, dataset, overwrite=True, first_line_is_header=False, **kwd):
else:
empty_line_count += 1

def displayable(self, dataset):
def displayable(self, dataset: DatasetInstance):
try:
return (
dataset.has_data()
not dataset.dataset.purged
and dataset.has_data()
and dataset.state == dataset.states.OK
and dataset.metadata.columns > 0
and dataset.metadata.data_lines != 0
Expand Down
6 changes: 4 additions & 2 deletions lib/galaxy/datatypes/tabular.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
iter_headers,
validate_tabular,
)
from galaxy.model import DatasetInstance
from galaxy.util import compression_utils
from . import dataproviders

Expand Down Expand Up @@ -90,10 +91,11 @@ def set_peek(self, dataset, line_count=None, WIDTH=256, skipchars=None, line_wra
if dataset.metadata.comment_lines:
dataset.blurb = f"{dataset.blurb}, {util.commaify(str(dataset.metadata.comment_lines))} comments"

def displayable(self, dataset):
def displayable(self, dataset: DatasetInstance):
try:
return (
dataset.has_data()
not dataset.dataset.purged
and dataset.has_data()
and dataset.state == dataset.states.OK
and dataset.metadata.columns > 0
and dataset.metadata.data_lines != 0
Expand Down
103 changes: 55 additions & 48 deletions lib/galaxy/webapps/galaxy/controllers/dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
HDAManager,
)
from galaxy.managers.histories import HistoryManager
from galaxy.model import Dataset
from galaxy.model.item_attrs import (
UsesAnnotations,
UsesItemRatings,
Expand Down Expand Up @@ -147,17 +148,27 @@ def _check_dataset(self, trans, hda_id):
except Exception:
data = None
if not data:
raise paste.httpexceptions.HTTPRequestRangeNotSatisfiable(f"Invalid reference dataset id: {str(hda_id)}.")
raise web.httpexceptions.HTTPNotFound(f"Invalid reference dataset id: {str(hda_id)}.")
if not self._can_access_dataset(trans, data):
return trans.show_error_message("You are not allowed to access this dataset")
if data.purged:
return trans.show_error_message("The dataset you are attempting to view has been purged.")
if data.deleted and not (trans.user_is_admin or (data.history and trans.get_user() == data.history.user)):
elif data.deleted and not (trans.user_is_admin or (data.history and trans.get_user() == data.history.user)):
return trans.show_error_message("The dataset you are attempting to view has been deleted.")
if data.state == trans.model.Dataset.states.UPLOAD:
elif data.state == Dataset.states.UPLOAD:
return trans.show_error_message(
"Please wait until this dataset finishes uploading before attempting to view it."
)
elif data.state == Dataset.states.DISCARDED:
return trans.show_error_message("The dataset you are attempting to view has been discarded.")
elif data.state == Dataset.states.DEFERRED:
return trans.show_error_message(
"The dataset you are attempting to view has deferred data. You can only use this dataset as input for jobs."
)
elif data.state == Dataset.states.PAUSED:
return trans.show_error_message(
"The dataset you are attempting to view is in paused state. One of the inputs for the job that creates this dataset has failed."
)
return data

@web.expose
Expand Down Expand Up @@ -563,55 +574,51 @@ def rate_async(self, trans, id, rating):
@web.expose
def display_by_username_and_slug(self, trans, username, slug, filename=None, preview=True):
"""Display dataset by username and slug; because datasets do not yet have slugs, the slug is the dataset's id."""
id = slug
decoded_id = self.decode_id(id)
dataset = self.hda_manager.get_accessible(decoded_id, trans.user)
dataset = self.hda_manager.error_if_uploading(dataset)
if dataset:
# Filename used for composite types.
if filename:
return self.display(trans, dataset_id=slug, filename=filename)

truncated, dataset_data = self.hda_manager.text_data(dataset, preview)
dataset.annotation = self.get_item_annotation_str(trans.sa_session, dataset.history.user, dataset)
dataset = self._check_dataset(trans, slug)
if not isinstance(dataset, trans.app.model.DatasetInstance):
return dataset
# Filename used for composite types.
if filename:
return self.display(trans, dataset_id=slug, filename=filename)

# If dataset is chunkable, get first chunk.
first_chunk = None
if dataset.datatype.CHUNKABLE:
first_chunk = dataset.datatype.get_chunk(trans, dataset, 0)
truncated, dataset_data = self.hda_manager.text_data(dataset, preview)
dataset.annotation = self.get_item_annotation_str(trans.sa_session, dataset.history.user, dataset)

# If data is binary or an image, stream without template; otherwise, use display template.
# TODO: figure out a way to display images in display template.
if (
isinstance(dataset.datatype, datatypes.binary.Binary)
or isinstance(dataset.datatype, datatypes.images.Image)
or isinstance(dataset.datatype, datatypes.text.Html)
):
trans.response.set_content_type(dataset.get_mime())
return open(dataset.file_name, "rb")
else:
# Get rating data.
user_item_rating = 0
if trans.get_user():
user_item_rating = self.get_user_item_rating(trans.sa_session, trans.get_user(), dataset)
if user_item_rating:
user_item_rating = user_item_rating.rating
else:
user_item_rating = 0
ave_item_rating, num_ratings = self.get_ave_item_rating_data(trans.sa_session, dataset)
# If dataset is chunkable, get first chunk.
first_chunk = None
if dataset.datatype.CHUNKABLE:
first_chunk = dataset.datatype.get_chunk(trans, dataset, 0)

return trans.fill_template_mako(
"/dataset/display.mako",
item=dataset,
item_data=dataset_data,
truncated=truncated,
user_item_rating=user_item_rating,
ave_item_rating=ave_item_rating,
num_ratings=num_ratings,
first_chunk=first_chunk,
)
# If data is binary or an image, stream without template; otherwise, use display template.
# TODO: figure out a way to display images in display template.
if (
isinstance(dataset.datatype, datatypes.binary.Binary)
or isinstance(dataset.datatype, datatypes.images.Image)
or isinstance(dataset.datatype, datatypes.text.Html)
):
trans.response.set_content_type(dataset.get_mime())
return open(dataset.file_name, "rb")
else:
raise web.httpexceptions.HTTPNotFound()
# Get rating data.
user_item_rating = 0
if trans.get_user():
user_item_rating = self.get_user_item_rating(trans.sa_session, trans.get_user(), dataset)
if user_item_rating:
user_item_rating = user_item_rating.rating
else:
user_item_rating = 0
ave_item_rating, num_ratings = self.get_ave_item_rating_data(trans.sa_session, dataset)

return trans.fill_template_mako(
"/dataset/display.mako",
item=dataset,
item_data=dataset_data,
truncated=truncated,
user_item_rating=user_item_rating,
ave_item_rating=ave_item_rating,
num_ratings=num_ratings,
first_chunk=first_chunk,
)

@web.expose
def get_item_content_async(self, trans, id):
Expand Down
9 changes: 8 additions & 1 deletion lib/galaxy/webapps/galaxy/services/dataset_collections.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
BaseModel,
Extra,
Field,
ValidationError,
)

from galaxy import exceptions
Expand Down Expand Up @@ -254,4 +255,10 @@ def serialize_element(dsc_element) -> DCESummary:
return result

rval = [serialize_element(el) for el in contents]
return DatasetCollectionContentElements.parse_obj(rval)
try:
return DatasetCollectionContentElements.parse_obj(rval)
except ValidationError:
log.exception(
f"Serializing DatasetCollectionContentsElements failed. Collection is populated: {hdca.collection.populated}"
)
raise

0 comments on commit 5f11aa4

Please sign in to comment.