From 8616cbcd57ef99e0ed7bf7cc4ef6013d4b63659e Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Mon, 8 Apr 2024 12:57:45 +0200 Subject: [PATCH] Fix tool form building if select filters from unavailable dataset metadata Fixes: ``` Message Uncaught exception in exposed API method: Stack Trace(most recent call first) TypeError: 'NoneType' object is not iterable File "galaxy/web/framework/decorators.py", line 346, in decorator rval = func(self, trans, *args, **kwargs) File "galaxy/webapps/galaxy/api/tools.py", line 247, in build return tool.to_json(trans, kwd.get("inputs", kwd), history=history) File "galaxy/tools/__init__.py", line 2509, in to_json populate_state(request_context, self.inputs, params.__dict__, state_inputs, state_errors) File "galaxy/tools/parameters/__init__.py", line 412, in populate_state _populate_state_legacy( File "galaxy/tools/parameters/__init__.py", line 525, in _populate_state_legacy state[input.name] = input.get_initial_value(request_context, context) File "galaxy/tools/parameters/basic.py", line 1107, in get_initial_value options = list(self.get_options(trans, other_values)) File "galaxy/tools/parameters/basic.py", line 960, in get_options return self.options.get_options(trans, other_values) File "galaxy/tools/parameters/dynamic_options.py", line 893, in get_options rval = filter.filter_options(rval, trans, other_values) File "galaxy/tools/parameters/dynamic_options.py", line 227, in filter_options for r in ref: ``` from https://sentry.galaxyproject.org/share/issue/ac3a350198604034aca07eaca3cc9cb8/ This happens if you have the following input section: ``` ``` but the first input collection to mothur.list or mothur.shared dataset has no elements. --- lib/galaxy/model/__init__.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 707187296652..53bd1e5faedb 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -6854,14 +6854,23 @@ def touch(self): if self.collection: flag_modified(self.collection, "collection_type") - def to_hda_representative(self, multiple=False): + @overload + def to_hda_representative(self, multiple: Literal[False] = False) -> Optional[HistoryDatasetAssociation]: ... + + @overload + def to_hda_representative(self, multiple: Literal[True]) -> List[HistoryDatasetAssociation]: ... + + def to_hda_representative( + self, multiple: bool = False + ) -> Union[List[HistoryDatasetAssociation], Optional[HistoryDatasetAssociation]]: rval = [] for dataset in self.collection.dataset_elements: rval.append(dataset.dataset_instance) if multiple is False: break - if len(rval) > 0: - return rval if multiple else rval[0] + if multiple: + return rval + return rval[0] if rval else None def _serialize(self, id_encoder, serialization_options): rval = dict_for(