Unverified Commit 3b65665b authored by mvdbeek's avatar mvdbeek
Browse files

Raise ``ParameterValueError`` if input collection elements deleted

This is a prerequisite to fixing https://github.com/galaxyproject/galaxy/issues/18006
parent ee56d70b
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -6499,6 +6499,14 @@ class DatasetCollection(Base, Dictifiable, UsesAnnotations, Serializable):
        q = q.order_by(*order_by_columns)
        return q

    @property
    def elements_deleted(self):
        stmt = self._build_nested_collection_attributes_stmt(
            hda_attributes=("deleted",), dataset_attributes=("deleted",)
        )
        stmt = exists(stmt).where(or_(HistoryDatasetAssociation.deleted == true(), Dataset.deleted == true()))
        return object_session(self).execute(select(stmt)).scalar()

    @property
    def dataset_states_and_extensions_summary(self):
        if not hasattr(self, "_dataset_states_and_extensions_summary"):
+40 −13
Original line number Diff line number Diff line
@@ -2188,19 +2188,37 @@ class DataToolParameter(BaseDataToolParameter):
        dataset_matcher_factory = get_dataset_matcher_factory(trans)
        dataset_matcher = dataset_matcher_factory.dataset_matcher(self, other_values)
        for v in rval:
            if v:
                if hasattr(v, "deleted") and v.deleted:
            if isinstance(v, DatasetCollectionElement):
                if hda := v.hda:
                    v = hda
                elif ldda := v.ldda:
                    v = ldda
                elif collection := v.child_collection:
                    v = collection
                elif not v.collection and v.collection.populated_optimized:
                    raise ParameterValueError("the selected collection has not been populated.", self.name)
                else:
                    raise ParameterValueError("Collection element in unexpected state", self.name)
            if isinstance(v, DatasetInstance):
                if v.deleted:
                    raise ParameterValueError("the previously selected dataset has been deleted.", self.name)
                elif hasattr(v, "dataset") and v.dataset.state in [Dataset.states.ERROR, Dataset.states.DISCARDED]:
                elif v.dataset and v.dataset.state in [Dataset.states.ERROR, Dataset.states.DISCARDED]:
                    raise ParameterValueError(
                        "the previously selected dataset has entered an unusable state", self.name
                    )
                elif hasattr(v, "dataset"):
                    if isinstance(v, DatasetCollectionElement):
                        v = v.hda
                match = dataset_matcher.hda_match(v)
                if match and match.implicit_conversion:
                    v.implicit_conversion = True  # type:ignore[union-attr]
            elif isinstance(v, HistoryDatasetCollectionAssociation):
                if v.deleted:
                    raise ParameterValueError("the previously selected dataset collection has been deleted.", self.name)
                v = v.collection
            if isinstance(v, DatasetCollection):
                if v.elements_deleted:
                    raise ParameterValueError(
                        "the previously selected dataset collection has elements that are deleted.", self.name
                    )

        if not self.multiple:
            if len(rval) > 1:
                raise ParameterValueError("more than one dataset supplied to single input dataset parameter", self.name)
@@ -2497,10 +2515,19 @@ class DataCollectionToolParameter(BaseDataToolParameter):
                rval = session.get(HistoryDatasetCollectionAssociation, int(value[len("hdca:") :]))
            else:
                rval = session.get(HistoryDatasetCollectionAssociation, int(value))
        if rval and isinstance(rval, HistoryDatasetCollectionAssociation):
        if rval:
            if isinstance(rval, HistoryDatasetCollectionAssociation):
                if rval.deleted:
                    raise ParameterValueError("the previously selected dataset collection has been deleted", self.name)
            # TODO: Handle error states, implement error states ...
                if rval.collection.elements_deleted:
                    raise ParameterValueError(
                        "the previously selected dataset collection has elements that are deleted.", self.name
                    )
            if isinstance(rval, DatasetCollectionElement):
                if (child_collection := rval.child_collection) and child_collection.elements_deleted:
                    raise ParameterValueError(
                        "the previously selected dataset collection has elements that are deleted.", self.name
                    )
        return rval

    def to_text(self, value):