mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-21 13:50:20 +08:00
Merge pull request #17227 from mvdbeek/fix_display_applications
[23.2] Fix Display Application link generation
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
# Contains parameters that are used in Display Applications
|
||||
import mimetypes
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional
|
||||
from urllib.parse import quote_plus
|
||||
|
||||
from galaxy.model.base import transaction
|
||||
from galaxy.schema.schema import DatasetState
|
||||
from galaxy.util import string_as_bool
|
||||
from galaxy.util.bunch import Bunch
|
||||
from galaxy.util.template import fill_template
|
||||
|
||||
DEFAULT_DATASET_NAME = "dataset"
|
||||
@@ -57,6 +58,13 @@ class DisplayApplicationParameter:
|
||||
return fill_template(self.url, context=other_values)
|
||||
|
||||
|
||||
@dataclass
|
||||
class DatasetLikeObject:
|
||||
file_name: str
|
||||
state: DatasetState
|
||||
extension: str
|
||||
|
||||
|
||||
class DisplayApplicationDataParameter(DisplayApplicationParameter):
|
||||
"""Parameter that returns a file_name containing the requested content"""
|
||||
|
||||
@@ -95,27 +103,29 @@ class DisplayApplicationDataParameter(DisplayApplicationParameter):
|
||||
)
|
||||
return None
|
||||
|
||||
def _get_dataset_like_object(self, other_values):
|
||||
def _get_dataset_like_object(self, other_values) -> Optional[DatasetLikeObject]:
|
||||
# this returned object has file_name, state, and states attributes equivalent to a DatasetAssociation
|
||||
data = other_values.get(self.dataset, None)
|
||||
assert data, "Base dataset could not be found in values provided to DisplayApplicationDataParameter"
|
||||
if isinstance(data, DisplayDataValueWrapper):
|
||||
data = data.value
|
||||
if data.state != data.states.OK:
|
||||
if data.state != DatasetState.OK:
|
||||
return None
|
||||
if self.metadata:
|
||||
rval = getattr(data.metadata, self.metadata, None)
|
||||
assert rval, f'Unknown metadata name "{self.metadata}" provided for dataset type "{data.ext}".'
|
||||
return Bunch(file_name=rval.get_file_name(), state=data.state, states=data.states, extension="data")
|
||||
elif self.extensions and (self.force_conversion or not isinstance(data.datatype, self.formats)):
|
||||
return DatasetLikeObject(file_name=rval.get_file_name(), state=data.state, extension="data")
|
||||
elif (
|
||||
self.formats and self.extensions and (self.force_conversion or not isinstance(data.datatype, self.formats))
|
||||
):
|
||||
for ext in self.extensions:
|
||||
rval = data.get_converted_files_by_type(ext)
|
||||
if rval:
|
||||
return rval
|
||||
return DatasetLikeObject(file_name=rval.get_file_name(), state=rval.state, extension=rval.extension)
|
||||
direct_match, target_ext, _ = data.find_conversion_destination(self.formats)
|
||||
assert direct_match or target_ext is not None, f"No conversion path found for data param: {self.name}"
|
||||
return None
|
||||
return data
|
||||
return DatasetLikeObject(file_name=data.get_file_name(), state=data.state, extension=data.extension)
|
||||
|
||||
def get_value(self, other_values, dataset_hash, user_hash, trans):
|
||||
data = self._get_dataset_like_object(other_values)
|
||||
@@ -154,22 +164,22 @@ class DisplayApplicationDataParameter(DisplayApplicationParameter):
|
||||
trans.sa_session.add(assoc)
|
||||
with transaction(trans.sa_session):
|
||||
trans.sa_session.commit()
|
||||
elif converted_dataset and converted_dataset.state == converted_dataset.states.ERROR:
|
||||
elif converted_dataset and converted_dataset.state == DatasetState.ERROR:
|
||||
raise Exception(f"Dataset conversion failed for data parameter: {self.name}")
|
||||
return self.get_value(other_values, dataset_hash, user_hash, trans)
|
||||
|
||||
def is_preparing(self, other_values):
|
||||
value = self._get_dataset_like_object(other_values)
|
||||
if value and value.state in (value.states.NEW, value.states.UPLOAD, value.states.QUEUED, value.states.RUNNING):
|
||||
if value and value.state in (DatasetState.NEW, DatasetState.UPLOAD, DatasetState.QUEUED, DatasetState.RUNNING):
|
||||
return True
|
||||
return False
|
||||
|
||||
def ready(self, other_values):
|
||||
value = self._get_dataset_like_object(other_values)
|
||||
if value:
|
||||
if value.state == value.states.OK:
|
||||
if value.state == DatasetState.OK:
|
||||
return True
|
||||
elif value.state == value.states.ERROR:
|
||||
elif value.state == DatasetState.ERROR:
|
||||
raise Exception(f"A data display parameter is in the error state: {self.name}")
|
||||
return False
|
||||
|
||||
|
||||
@@ -674,7 +674,7 @@ class DatasetInterface(BaseUIController, UsesAnnotations, UsesItemRatings, UsesE
|
||||
), f"Extra file content requested ({action_param_extra}), but allow_extra_files_access is False."
|
||||
file_name = os.path.join(value.extra_files_path, action_param_extra)
|
||||
else:
|
||||
file_name = value.get_file_name()
|
||||
file_name = value.file_name
|
||||
content_length = os.path.getsize(file_name)
|
||||
rval = open(file_name, "rb")
|
||||
except OSError as e:
|
||||
|
||||
Reference in New Issue
Block a user