From c14db55910411e5e532a3500f87f8f35ad177bbb Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 5 May 2023 15:44:06 +0200 Subject: [PATCH] Fix re-run with DCE inputs --- client/src/mvc/ui/ui-select-content.js | 17 +++++++++----- lib/galaxy/model/security.py | 4 +--- lib/galaxy/tools/parameters/basic.py | 32 +++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/client/src/mvc/ui/ui-select-content.js b/client/src/mvc/ui/ui-select-content.js index 11de437c075..292d7a32147 100644 --- a/client/src/mvc/ui/ui-select-content.js +++ b/client/src/mvc/ui/ui-select-content.js @@ -424,12 +424,12 @@ const View = Backbone.View.extend({ const select_options = { hda: [], hdca: [] }; _.each(options, (items, src) => { _.each(items, (item) => { - self._patchValue(item); + self._patchValue(item, src); const current_src = item.src || src; const addOption = !this.model.attributes.tag || item.tags.includes(this.model.attributes.tag); if (addOption) { select_options[current_src].push({ - hid: item.hid, + hid: item.hid || Infinity, // if we got no hid we have a "Selected" item keep: item.keep, label: `${item.hid || "Selected"}: ${item.name}`, value: item.id, @@ -455,7 +455,12 @@ const View = Backbone.View.extend({ list.push(value.id); }); // sniff first suitable field type from config list - const src = new_value.values[0].src; + let src = new_value.values[0].src; + if (src === "dce") { + src = + this.cache[`dce${new_value.values[0].id}_hda`]?.src || + this.cache[`dce${new_value.values[0].id}_hdca`]?.src; + } const multiple = new_value.values.length > 1; for (let i = 0; i < this.config.length; i++) { const field = this.fields[i]; @@ -480,11 +485,11 @@ const View = Backbone.View.extend({ /** Library datasets are displayed and selected together with history datasets, Dataset collection elements are displayed together with history dataset collections **/ - _patchValue: function (v) { - const patchTo = { ldda: "hda", dce: "hdca" }; + _patchValue: function (v, src) { + const patchTo = { ldda: "hda", dce: src }; if (v.values) { _.each(v.values, (v) => { - this._patchValue(v); + this._patchValue(v, src); }); } else if (patchTo[v.src]) { v.origin = v.src; diff --git a/lib/galaxy/model/security.py b/lib/galaxy/model/security.py index 68cbaa9ea31..b92b0014e24 100644 --- a/lib/galaxy/model/security.py +++ b/lib/galaxy/model/security.py @@ -520,9 +520,7 @@ class GalaxyRBACAgent(RBACAgent): return True - def can_access_collection( - self, user_roles: List[galaxy.model.Role], collection: galaxy.model.DatasetCollection - ): + def can_access_collection(self, user_roles: List[galaxy.model.Role], collection: galaxy.model.DatasetCollection): action_tuples = collection.dataset_action_tuples if not self.can_access_datasets(user_roles, action_tuples): return False diff --git a/lib/galaxy/tools/parameters/basic.py b/lib/galaxy/tools/parameters/basic.py index 15d5df5a6e1..8c5305be6cf 100644 --- a/lib/galaxy/tools/parameters/basic.py +++ b/lib/galaxy/tools/parameters/basic.py @@ -2092,6 +2092,9 @@ class DataToolParameter(BaseDataToolParameter): elif single_value["src"] == "ldda": decoded_id = trans.security.decode_id(single_value["id"]) rval.append(trans.sa_session.query(LibraryDatasetDatasetAssociation).get(decoded_id)) + elif single_value["src"] == "dce": + decoded_id = trans.security.decode_id(single_value["id"]) + rval.append(trans.sa_session.query(DatasetCollectionElement).get(decoded_id)) else: raise ValueError(f"Unknown input source {single_value['src']} passed to job submission API.") elif isinstance( @@ -2127,6 +2130,9 @@ class DataToolParameter(BaseDataToolParameter): elif value["src"] == "hdca": decoded_id = trans.security.decode_id(value["id"]) rval.append(trans.sa_session.query(HistoryDatasetCollectionAssociation).get(decoded_id)) + elif value["src"] == "dce": + decoded_id = trans.security.decode_id(value["id"]) + rval.append(trans.sa_session.query(DatasetCollectionElement).get(decoded_id)) else: raise ValueError(f"Unknown input source {value['src']} passed to job submission API.") elif str(value).startswith("__collection_reduce__|"): @@ -2280,6 +2286,28 @@ class DataToolParameter(BaseDataToolParameter): value["map_over_type"] = subcollection_type return list.append(value) + def append_dce(dce): + if dce.hda: + # well this isn't good, but what's the alternative ? + # we should be precise about what we're (re-)running here. + key = "hda" + else: + key = "hdca" + d["options"][key].append( + { + "id": trans.security.encode_id(dce.id), + "name": dce.element_identifier, + "src": "dce", + "tags": [], + "keep": True, + } + ) + + # append DCE + if isinstance(other_values.get(self.name), DatasetCollectionElement): + dce = other_values[self.name] + append_dce(dce) + # add datasets hda_list = util.listify(other_values.get(self.name)) # Prefetch all at once, big list of visible, non-deleted datasets. @@ -2299,6 +2327,8 @@ class DataToolParameter(BaseDataToolParameter): else: hda_state = "unavailable" append(d["options"]["hda"], hda, f"({hda_state}) {hda.name}", "hda", True) + elif isinstance(hda, DatasetCollectionElement): + append_dce(hda) # add dataset collections dataset_collection_matcher = dataset_matcher_factory.dataset_collection_matcher(dataset_matcher) @@ -2460,7 +2490,7 @@ class DataCollectionToolParameter(BaseDataToolParameter): # append DCE if isinstance(other_values.get(self.name), DatasetCollectionElement): dce = other_values[self.name] - d["options"]["dce"].append( + d["options"]["hdca"].append( { "id": trans.security.encode_id(dce.id), "hid": None,