From 730f3335d977818ad34244cc687ad59d3fd99b0f Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 13:58:38 -0500 Subject: [PATCH 01/25] Fix backref_cascade for DefaultHistoryPermissions --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 2be42fc989c..c543276061f 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -3291,6 +3291,7 @@ class DefaultHistoryPermissions(Base, RepresentById): role = relationship("Role") def __init__(self, history, action, role): + add_object_to_object_session(self, history) self.history = history self.action = action self.role = role From 8f4b6c1bad5fea4e6d7f668c3c02bc0ee3b7eabc Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 14:02:40 -0500 Subject: [PATCH 02/25] Fix backref_cascade for GalaxySessionToHistoryAssociation --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index c543276061f..b933be3b93d 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -6472,6 +6472,7 @@ class GalaxySessionToHistoryAssociation(Base, RepresentById): def __init__(self, galaxy_session, history): self.galaxy_session = galaxy_session + add_object_to_object_session(self, history) self.history = history From 66f4bde44f666a9ebd740bb0483ab8deb6a89669 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 14:04:31 -0500 Subject: [PATCH 03/25] Fix backref_cascade for ImplicitlyConvertedDatasetAssociation --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index b933be3b93d..c35d3191373 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -5393,6 +5393,7 @@ class ImplicitlyConvertedDatasetAssociation(Base, RepresentById): self, id=None, parent=None, dataset=None, file_type=None, deleted=False, purged=False, metadata_safe=True ): self.id = id + add_object_to_object_session(self, dataset) if isinstance(dataset, HistoryDatasetAssociation): self.dataset = dataset elif isinstance(dataset, LibraryDatasetDatasetAssociation): From 7a820732d0c3d0d0c11ddd6534a2fa4bf0dbd483 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 14:11:34 -0500 Subject: [PATCH 04/25] Fix backref_cascade for *RatingAssociation items Duplication is intetional: this way, after migrating to SA2.0m, we can remove such statements one at a time. --- lib/galaxy/model/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index c35d3191373..a13bd3f9fcc 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -9028,6 +9028,7 @@ class HistoryDatasetAssociationRatingAssociation(ItemRatingAssociation, Represen user = relationship("User") def _set_item(self, history_dataset_association): + add_object_to_object_session(self, history_dataset_association) self.history_dataset_association = history_dataset_association @@ -9042,6 +9043,7 @@ class StoredWorkflowRatingAssociation(ItemRatingAssociation, RepresentById): user = relationship("User") def _set_item(self, stored_workflow): + add_object_to_object_session(self, stored_workflow) self.stored_workflow = stored_workflow @@ -9056,6 +9058,7 @@ class PageRatingAssociation(ItemRatingAssociation, RepresentById): user = relationship("User") def _set_item(self, page): + add_object_to_object_session(self, page) self.page = page @@ -9070,6 +9073,7 @@ class VisualizationRatingAssociation(ItemRatingAssociation, RepresentById): user = relationship("User") def _set_item(self, visualization): + add_object_to_object_session(self, visualization) self.visualization = visualization @@ -9084,6 +9088,7 @@ class HistoryDatasetCollectionRatingAssociation(ItemRatingAssociation, Represent user = relationship("User") def _set_item(self, dataset_collection): + add_object_to_object_session(self, dataset_collection) self.dataset_collection = dataset_collection @@ -9098,6 +9103,7 @@ class LibraryDatasetCollectionRatingAssociation(ItemRatingAssociation, Represent user = relationship("User") def _set_item(self, dataset_collection): + add_object_to_object_session(self, dataset_collection) self.dataset_collection = dataset_collection From d8c282b3afe79c2b045590c478a46f2beb2d4e44 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 14:20:47 -0500 Subject: [PATCH 05/25] Fix backref_cascade for JobToOutputLibraryDatasetAssociation --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index a13bd3f9fcc..c9638afe990 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -1997,6 +1997,7 @@ class JobToOutputLibraryDatasetAssociation(Base, RepresentById): def __init__(self, name, dataset): self.name = name + add_object_to_object_session(self, dataset) self.dataset = dataset From 8d3a664a22fecae37c5343f05ecf866a596fc38a Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 14:22:42 -0500 Subject: [PATCH 06/25] Fix backref_cascade for JobExternalOutputMetadata --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index c9638afe990..c6a5270aa3f 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -2141,6 +2141,7 @@ class JobExternalOutputMetadata(Base, RepresentById): job = relationship("Job", back_populates="external_output_metadata") def __init__(self, job=None, dataset=None): + add_object_to_object_session(self, job) self.job = job if isinstance(dataset, galaxy.model.HistoryDatasetAssociation): self.history_dataset_association = dataset From d9c1acdd11892da5f0164aa7dc77b6582fbcda70 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 14:23:38 -0500 Subject: [PATCH 07/25] Fix backref_cascade for Task --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index c6a5270aa3f..2a500c7b298 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -1721,6 +1721,7 @@ class Task(Base, JobLike, RepresentById): self.parameters = [] self.state = Task.states.NEW self.working_directory = working_directory + add_object_to_object_session(self, job) self.job = job self.prepare_input_files_cmd = prepare_files_cmd self._init_metrics() From 286bff474d39b7fa8666066e6b67e954af0d1cfc Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 14:28:23 -0500 Subject: [PATCH 08/25] Fix backref_cascade for JobContainerAssociation --- lib/galaxy/model/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 2a500c7b298..b80886aa276 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -2283,6 +2283,8 @@ class JobContainerAssociation(Base, RepresentById): job = relationship("Job", back_populates="container") def __init__(self, **kwd): + if "job" in kwd: + add_object_to_object_session(self, kwd["job"]) super().__init__(**kwd) self.container_info = self.container_info or {} From 6570bde4dd0e7f9c32a9fa91da1fa1a6a0d8deb9 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 14:30:07 -0500 Subject: [PATCH 09/25] Fix backref_cascade for LibraryDatasetDatasetAssociationPermissions --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index b80886aa276..05428861b68 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -3262,6 +3262,7 @@ class LibraryDatasetDatasetAssociationPermissions(Base, RepresentById): def __init__(self, action, library_item, role): self.action = action if isinstance(library_item, LibraryDatasetDatasetAssociation): + add_object_to_object_session(self, library_item) self.library_dataset_dataset_association = library_item else: raise Exception(f"Invalid LibraryDatasetDatasetAssociation specified: {library_item.__class__.__name__}") From bdec0f6c1e4f4c21a79b2d279009ab24c35a2bf7 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 14:31:12 -0500 Subject: [PATCH 10/25] Fix backref_cascade for JobToInputLibraryDatasetAssociation --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 05428861b68..5fd20c2bed7 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -1981,6 +1981,7 @@ class JobToInputLibraryDatasetAssociation(Base, RepresentById): def __init__(self, name, dataset): self.name = name + add_object_to_object_session(self, dataset) self.dataset = dataset From f9f61f1ecd7d11f616fc9538630b0674508ad79f Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 15:09:56 -0500 Subject: [PATCH 11/25] Fix misc. backref_cascade issues in tests No need to fix in the model, as this only reflects the way model objects are handled in the test module. --- .../data/model/mapping/test_model_mapping.py | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/test/unit/data/model/mapping/test_model_mapping.py b/test/unit/data/model/mapping/test_model_mapping.py index 924e03eff6f..e9faca9285f 100644 --- a/test/unit/data/model/mapping/test_model_mapping.py +++ b/test/unit/data/model/mapping/test_model_mapping.py @@ -1375,8 +1375,7 @@ class TestHistory(BaseTest): workflow_invocation, job, ): - obj = cls_() - obj.user = user + obj = cls_(user=user) obj.datasets.append(history_dataset_association) obj.dataset_collections.append(history_dataset_collection_association) obj.exports.append(job_export_history_archive) @@ -1580,9 +1579,8 @@ class TestHistoryDatasetAssociation(BaseTest): icpda, ] - obj = cls_() + obj = cls_(dataset=dataset) obj.history = history - obj.dataset = dataset obj.copied_from_history_dataset_association = copied_from_hda obj.copied_from_library_dataset_dataset_association = copied_from_ldda obj.extended_metadata = extended_metadata @@ -2146,7 +2144,6 @@ class TestImplicitCollectionJobsJobAssociation(BaseTest): order_index = 1 obj = cls_() obj.implicit_collection_jobs = implicit_collection_jobs - session.add(job) # must be bound to a session for lazy load of attributes obj.job = job obj.order_index = order_index @@ -2160,7 +2157,6 @@ class TestImplicitCollectionJobsJobAssociation(BaseTest): def test_relationships(self, session, cls_, implicit_collection_jobs, job): obj = cls_() obj.implicit_collection_jobs = implicit_collection_jobs - session.add(job) # must be bound to a session for lazy load of attributes obj.job = job obj.order_index = 1 @@ -2566,9 +2562,7 @@ class TestJobContainerAssociation(BaseTest): created_time = now() modified_time = created_time + timedelta(hours=1) - session.add(job) # must be bound to a session for lazy load of attributes - obj = cls_() - obj.job = job + obj = cls_(job=job) obj.container_type = container_type obj.container_name = container_name obj.container_info = container_info @@ -2586,7 +2580,6 @@ class TestJobContainerAssociation(BaseTest): assert stored_obj.modified_time == modified_time def test_relationships(self, session, cls_, job): - session.add(job) # must be bound to a session for lazy load of attributes obj = cls_(job=job) with dbcleanup(session, obj) as obj_id: @@ -5674,9 +5667,6 @@ class TestWorkflowInvocationStep(BaseTest): update_time = create_time + timedelta(hours=1) state, action = "a", "b" - session.add(job) # must be bound to a session for lazy load of attributes - session.add(implicit_collection_jobs) # must be bound to a session for lazy load of attributes - obj = cls_() obj.create_time = create_time obj.update_time = update_time @@ -5711,9 +5701,6 @@ class TestWorkflowInvocationStep(BaseTest): workflow_invocation_step_output_dataset_association, workflow_invocation_output_value, ): - session.add(job) # must be bound to a session for lazy load of attributes - session.add(implicit_collection_jobs) # must be bound to a session for lazy load of attributes - # setup workflow_invocation_output_value to test the output_value attribute output_value = workflow_invocation_output_value output_value.workflow_invocation = workflow_invocation From 0ba4988fadb0ddc886e3e19d592d86614079e036 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Mon, 7 Mar 2022 15:25:20 -0500 Subject: [PATCH 12/25] Explicitly add obj to session in test module --- .../data/model/mapping/test_model_mapping.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/test/unit/data/model/mapping/test_model_mapping.py b/test/unit/data/model/mapping/test_model_mapping.py index e9faca9285f..b8dd8cdb1e6 100644 --- a/test/unit/data/model/mapping/test_model_mapping.py +++ b/test/unit/data/model/mapping/test_model_mapping.py @@ -74,6 +74,7 @@ from sqlalchemy import ( from galaxy import model from galaxy.model.orm.now import now +from galaxy.model.orm.util import add_object_to_object_session from .common import ( AbstractBaseTest, collection_consists_of_objects, @@ -1900,6 +1901,7 @@ class TestHistoryDatasetCollectionAssociation(BaseTest): obj = cls_() obj.collection = dataset_collection obj.history = history + add_object_to_object_session(obj, history_dataset_collection_association) obj.copied_from_history_dataset_collection_association = history_dataset_collection_association obj.copied_to_history_dataset_collection_association.append(copied_to_hdca) obj.job = job @@ -2498,6 +2500,7 @@ class TestJob(BaseTest): obj.implicit_collection_jobs_association = implicit_collection_jobs_job_association obj.container = job_container_association obj.data_manager_association = data_manager_job_association + add_object_to_object_session(obj, history_dataset_collection_association) obj.history_dataset_collection_associations.append(history_dataset_collection_association) obj.workflow_invocation_step = workflow_invocation_step @@ -3286,6 +3289,7 @@ class TestLibraryDatasetDatasetAssociation(BaseTest): obj = cls_() obj.library_dataset = library_dataset + add_object_to_object_session(obj, dataset) obj.dataset = dataset obj.create_time = create_time obj.copied_from_history_dataset_association = history_dataset_association @@ -3374,6 +3378,7 @@ class TestLibraryDatasetDatasetAssociation(BaseTest): obj = cls_() obj.library_dataset = library_dataset + add_object_to_object_session(obj, dataset) obj.dataset = dataset obj.copied_from_history_dataset_association = history_dataset_association obj.copied_from_library_dataset_dataset_association = copied_from_ldda @@ -3600,6 +3605,7 @@ class TestLibraryFolder(BaseTest): library_folder_factory, ): obj = cls_() + add_object_to_object_session(obj, library_folder) obj.parent = library_folder folder1 = library_folder_factory() obj.folders.append(folder1) @@ -4394,6 +4400,7 @@ class TestStoredWorkflowMenuEntry(BaseTest): order_index = 1 obj = cls_() obj.stored_workflow = stored_workflow + add_object_to_object_session(obj, user) obj.user = user obj.order_index = order_index @@ -4407,6 +4414,7 @@ class TestStoredWorkflowMenuEntry(BaseTest): def test_relationships(self, session, cls_, stored_workflow, user): obj = cls_() obj.stored_workflow = stored_workflow + add_object_to_object_session(obj, user) obj.user = user with dbcleanup(session, obj) as obj_id: @@ -5636,6 +5644,7 @@ class TestWorkflowInvocationOutputValue(BaseTest): persist(session, workflow_invocation_step) obj = cls_() + add_object_to_object_session(obj, workflow_invocation) obj.workflow_invocation = workflow_invocation obj.workflow_step = workflow_step obj.workflow_output = workflow_output @@ -5708,6 +5717,7 @@ class TestWorkflowInvocationStep(BaseTest): persist(session, output_value) obj = cls_() + add_object_to_object_session(obj, workflow_invocation) obj.workflow_invocation = workflow_invocation obj.workflow_step = workflow_step obj.job = job @@ -6936,6 +6946,7 @@ def role(session): @pytest.fixture def stored_workflow(session, user): instance = model.StoredWorkflow() + add_object_to_object_session(instance, user) instance.user = user yield from dbcleanup_wrapper(session, instance) @@ -7169,6 +7180,7 @@ def workflow_request_to_input_dataset_collection_association(session): @pytest.fixture def workflow_step(session, workflow): instance = model.WorkflowStep() + add_object_to_object_session(instance, workflow) instance.workflow = workflow yield from dbcleanup_wrapper(session, instance) @@ -7376,7 +7388,9 @@ def workflow_step_connection_factory(): def workflow_step_factory(workflow): def make_instance(*args, **kwds): instance = model.WorkflowStep() - instance.workflow = kwds.get("workflow", workflow) + workflow2 = kwds.get("workflow", workflow) # rename workflow not to confuse pytest + add_object_to_object_session(instance, workflow2) + instance.workflow = workflow2 instance.subworkflow = kwds.get("subworkflow") return instance From 9698b5b3c4fe6d50178991d6f2a4228b84cb855a Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 14:48:15 -0500 Subject: [PATCH 13/25] Explicitly add obj to session --- test/unit/data/test_galaxy_mapping.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/unit/data/test_galaxy_mapping.py b/test/unit/data/test_galaxy_mapping.py index 4a16c2dcafb..ab5101b36d1 100644 --- a/test/unit/data/test_galaxy_mapping.py +++ b/test/unit/data/test_galaxy_mapping.py @@ -18,6 +18,7 @@ import galaxy.model.mapping as mapping from galaxy import model from galaxy.model.database_utils import create_database from galaxy.model.metadata import MetadataTempFile +from galaxy.model.orm.util import add_object_to_object_session from galaxy.model.security import GalaxyRBACAgent datatypes_registry = galaxy.datatypes.registry.Registry() @@ -82,6 +83,7 @@ class MappingTests(BaseModelTestCase): annotated_association.annotation = "Test Annotation" annotated_association.user = u for key, value in kwds.items(): + add_object_to_object_session(annotated_association, value) setattr(annotated_association, key, value) self.persist(annotated_association) self.expunge() @@ -90,6 +92,7 @@ class MappingTests(BaseModelTestCase): assert stored_annotation.user.email == "annotator@example.com" sw = model.StoredWorkflow() + add_object_to_object_session(sw, u) sw.user = u self.persist(sw) persist_and_check_annotation(model.StoredWorkflowAnnotationAssociation, stored_workflow=sw) @@ -99,6 +102,7 @@ class MappingTests(BaseModelTestCase): self.persist(workflow) ws = model.WorkflowStep() + add_object_to_object_session(ws, workflow) ws.workflow = workflow self.persist(ws) persist_and_check_annotation(model.WorkflowStepAnnotationAssociation, workflow_step=ws) @@ -152,6 +156,7 @@ class MappingTests(BaseModelTestCase): assert stored_rating.user.email == user_email sw = model.StoredWorkflow() + add_object_to_object_session(sw, u) sw.user = u self.persist(sw) persist_and_check_rating(model.StoredWorkflowRatingAssociation, sw) @@ -801,6 +806,7 @@ class MappingTests(BaseModelTestCase): def workflow_from_steps(steps): stored_workflow = model.StoredWorkflow() + add_object_to_object_session(stored_workflow, user) stored_workflow.user = user workflow = model.Workflow() workflow.steps = steps @@ -816,6 +822,7 @@ class MappingTests(BaseModelTestCase): workflow_step_2 = model.WorkflowStep() workflow_step_2.order_index = 1 workflow_step_2.type = "subworkflow" + add_object_to_object_session(workflow_step_2, child_workflow) workflow_step_2.subworkflow = child_workflow workflow_step_1.get_or_add_input("moo1") @@ -830,6 +837,7 @@ class MappingTests(BaseModelTestCase): annotation = model.WorkflowStepAnnotationAssociation() annotation.annotation = "Test Step Annotation" annotation.user = user + add_object_to_object_session(annotation, workflow_step_1) annotation.workflow_step = workflow_step_1 self.persist(annotation) @@ -840,9 +848,11 @@ class MappingTests(BaseModelTestCase): workflow_invocation = model.WorkflowInvocation() workflow_invocation.uuid = invocation_uuid + add_object_to_object_session(workflow_invocation, h1) workflow_invocation.history = h1 workflow_invocation_step1 = model.WorkflowInvocationStep() + add_object_to_object_session(workflow_invocation_step1, workflow_invocation) workflow_invocation_step1.workflow_invocation = workflow_invocation workflow_invocation_step1.workflow_step = workflow_step_1 @@ -850,6 +860,7 @@ class MappingTests(BaseModelTestCase): workflow_invocation.attach_subworkflow_invocation_for_step(workflow_step_2, subworkflow_invocation) workflow_invocation_step2 = model.WorkflowInvocationStep() + add_object_to_object_session(workflow_invocation_step2, workflow_invocation) workflow_invocation_step2.workflow_invocation = workflow_invocation workflow_invocation_step2.workflow_step = workflow_step_2 @@ -857,6 +868,7 @@ class MappingTests(BaseModelTestCase): d1 = self.new_hda(h1, name="1") workflow_request_dataset = model.WorkflowRequestToInputDatasetAssociation() + add_object_to_object_session(workflow_request_dataset, workflow_invocation) workflow_request_dataset.workflow_invocation = workflow_invocation workflow_request_dataset.workflow_step = workflow_step_1 workflow_request_dataset.dataset = d1 From e76ba0d2ef8a46e5c53317942cafdd1aa3b77932 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 15:05:21 -0500 Subject: [PATCH 14/25] Fix backref_cascade for StoredWorkflow --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 5fd20c2bed7..5a5bacbe541 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -6583,6 +6583,7 @@ class StoredWorkflow(Base, HasTags, Dictifiable, RepresentById): workflow=None, hidden=False, ): + add_object_to_object_session(self, user) self.user = user self.name = name self.slug = slug From 5c93ccf4b9ec1b41b7b5731c5c830516417e5511 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 15:06:43 -0500 Subject: [PATCH 15/25] Fix backref_cascase for WorkflowStepInput --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 5a5bacbe541..61cbe405e46 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -7069,6 +7069,7 @@ class WorkflowStepInput(Base, RepresentById): ) def __init__(self, workflow_step): + add_object_to_object_session(self, workflow_step) self.workflow_step = workflow_step self.default_value_set = False From 65bdb39a13e3315ca606673e853a751d2d22c656 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 15:07:59 -0500 Subject: [PATCH 16/25] Fix backref_cascade for WorkflowInvocation --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 61cbe405e46..d95d359473a 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -7258,6 +7258,7 @@ class WorkflowInvocation(Base, UsesCreateAndUpdateTime, Dictifiable, RepresentBy assoc = WorkflowInvocationToSubworkflowInvocationAssociation() assoc.workflow_invocation = self assoc.workflow_step = step + add_object_to_object_session(subworkflow_invocation, self.history) subworkflow_invocation.history = self.history subworkflow_invocation.workflow = step.subworkflow assoc.subworkflow_invocation = subworkflow_invocation From 057e4eb441365af58e278df27e36c082fecf6610 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 15:09:00 -0500 Subject: [PATCH 17/25] Fix backref_cascade for WorkflowStep --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index d95d359473a..5272d542835 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -6901,6 +6901,7 @@ class WorkflowStep(Base, RepresentById): conn = WorkflowStepConnection() conn.input_step_input = step_input conn.output_name = output_name + add_object_to_object_session(conn, output_step) conn.output_step = output_step if input_subworkflow_step_index is not None: input_subworkflow_step = self.subworkflow.step_by_index(input_subworkflow_step_index) From c80b7db9bdbf8d2218e43ac042ad1ce7b2895502 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 15:16:12 -0500 Subject: [PATCH 18/25] Fix backref_cascade for Workflow (added from WorkflowSteps) --- test/unit/data/test_galaxy_mapping.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/unit/data/test_galaxy_mapping.py b/test/unit/data/test_galaxy_mapping.py index ab5101b36d1..6b1fb7e3491 100644 --- a/test/unit/data/test_galaxy_mapping.py +++ b/test/unit/data/test_galaxy_mapping.py @@ -18,7 +18,10 @@ import galaxy.model.mapping as mapping from galaxy import model from galaxy.model.database_utils import create_database from galaxy.model.metadata import MetadataTempFile -from galaxy.model.orm.util import add_object_to_object_session +from galaxy.model.orm.util import ( + add_object_to_object_session, + get_object_session, +) from galaxy.model.security import GalaxyRBACAgent datatypes_registry = galaxy.datatypes.registry.Registry() @@ -809,6 +812,13 @@ class MappingTests(BaseModelTestCase): add_object_to_object_session(stored_workflow, user) stored_workflow.user = user workflow = model.Workflow() + + if steps: + for step in steps: + if get_object_session(step): + add_object_to_object_session(workflow, step) + break + workflow.steps = steps workflow.stored_workflow = stored_workflow return workflow From d921727d6aecf739bcdd125978d7b9e3a5f3935f Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 15:21:05 -0500 Subject: [PATCH 19/25] Fix backref_config for UserQuotaAssociation --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 5272d542835..79b4dd83a68 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -3058,6 +3058,7 @@ class UserQuotaAssociation(Base, Dictifiable, RepresentById): dict_element_visible_keys = ["user"] def __init__(self, user, quota): + add_object_to_object_session(self, user) self.user = user self.quota = quota From d3b0519cc044ea6c8b2dc65b49d0e7261c0dcfa8 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 15:21:38 -0500 Subject: [PATCH 20/25] Fix backref_cascase for UserGroupAssociation --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 79b4dd83a68..525b9dbd102 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -2377,6 +2377,7 @@ class UserGroupAssociation(Base, RepresentById): group = relationship("Group", back_populates="users") def __init__(self, user, group): + add_object_to_object_session(self, user) self.user = user self.group = group From 09b67a078768429c6dcf73fd3b71ab5d0815da06 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 15:22:14 -0500 Subject: [PATCH 21/25] Fix backref_cascade for GroupQuotaAssociation --- lib/galaxy/model/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 525b9dbd102..f0f5050c6ae 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -3078,6 +3078,7 @@ class GroupQuotaAssociation(Base, Dictifiable, RepresentById): dict_element_visible_keys = ["group"] def __init__(self, group, quota): + add_object_to_object_session(self, group) self.group = group self.quota = quota From 7747dcc5878e94483f014c238a3b5c2e6a1de095 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 16:13:41 -0500 Subject: [PATCH 22/25] Fix backref_cascade (unit/app/tools/test_execution) --- test/unit/app/tools/test_execution.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/unit/app/tools/test_execution.py b/test/unit/app/tools/test_execution.py index 0f22d7471ee..1c4f9d8d292 100644 --- a/test/unit/app/tools/test_execution.py +++ b/test/unit/app/tools/test_execution.py @@ -6,6 +6,7 @@ from unittest import TestCase import webob.exc import galaxy.model +from galaxy.model.orm.util import add_object_to_object_session from galaxy.app_unittest_utils import tools_support from galaxy.util.bunch import Bunch @@ -126,6 +127,7 @@ class ToolExecutionTestCase(TestCase, tools_support.UsesTools): hda.dataset.state = "ok" self.trans.sa_session.add(hda) + add_object_to_object_session(self.history, hda) self.history.datasets.append(hda) self.trans.sa_session.flush() return hda From 7f51ead4a4d7d2a1fb0a161375cb8630b90f6573 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 16:19:37 -0500 Subject: [PATCH 23/25] Fix backref_config. (see note) Note: Both user and custos_authnz_token are explicitly added to the session; however, user is in the session already, so that may be reducndant. This needs to be checked after migrating to 2.0. --- lib/galaxy/authnz/custos_authnz.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/galaxy/authnz/custos_authnz.py b/lib/galaxy/authnz/custos_authnz.py index f3aa897a7c1..6a82db7243d 100644 --- a/lib/galaxy/authnz/custos_authnz.py +++ b/lib/galaxy/authnz/custos_authnz.py @@ -22,6 +22,7 @@ from galaxy.model import ( CustosAuthnzToken, User, ) +from galaxy.model.orm.util import add_object_to_object_session from ..authnz import IdentityProvider log = logging.getLogger(__name__) @@ -186,7 +187,6 @@ class CustosAuthnz(IdentityProvider): trans.app.user_manager.send_activation_email(trans, email, username) custos_authnz_token = CustosAuthnzToken( - user=user, external_user_id=user_id, provider=self.config["provider"], access_token=access_token, @@ -195,6 +195,8 @@ class CustosAuthnz(IdentityProvider): expiration_time=expiration_time, refresh_expiration_time=refresh_expiration_time, ) + add_object_to_object_session(custos_authnz_token, user) + custos_authnz_token.user = user trans.sa_session.add(user) trans.sa_session.add(custos_authnz_token) From 5844d2cbe6a7d1161c0dac3b72ba4d6332999690 Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 16:22:59 -0500 Subject: [PATCH 24/25] Fix backref_cascase in TS's model --- lib/tool_shed/webapp/model/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/tool_shed/webapp/model/__init__.py b/lib/tool_shed/webapp/model/__init__.py index 07dd38feac5..52def04404b 100644 --- a/lib/tool_shed/webapp/model/__init__.py +++ b/lib/tool_shed/webapp/model/__init__.py @@ -39,6 +39,7 @@ from galaxy.model.custom_types import ( TrimmedString, ) from galaxy.model.orm.now import now +from galaxy.model.orm.util import add_object_to_object_session from galaxy.security.validate_user_input import validate_password_str from galaxy.util import unique_id from galaxy.util.bunch import Bunch @@ -182,6 +183,7 @@ class PasswordResetToken(Base, _HasTable): self.token = token else: self.token = unique_id() + add_object_to_object_session(self, user) self.user = user self.expiration_time = now() + timedelta(hours=24) @@ -252,6 +254,7 @@ class UserGroupAssociation(Base, _HasTable): group = relationship("Group", back_populates="users") def __init__(self, user, group): + add_object_to_object_session(self, user) self.user = user self.group = group @@ -268,7 +271,9 @@ class UserRoleAssociation(Base, _HasTable): role = relationship("Role", back_populates="users") def __init__(self, user, role): + add_object_to_object_session(self, user) self.user = user + add_object_to_object_session(self, role) self.role = role @@ -300,6 +305,7 @@ class RepositoryRoleAssociation(Base, _HasTable): role = relationship("Role", back_populates="repositories") def __init__(self, repository, role): + add_object_to_object_session(self, repository) self.repository = repository self.role = role From f4508768045fa52c4b928ac0405999e09143447d Mon Sep 17 00:00:00 2001 From: Sergey Golitsynskiy Date: Tue, 8 Mar 2022 16:25:39 -0500 Subject: [PATCH 25/25] Fix linting --- test/unit/app/tools/test_execution.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/app/tools/test_execution.py b/test/unit/app/tools/test_execution.py index 1c4f9d8d292..bc12e9c4d37 100644 --- a/test/unit/app/tools/test_execution.py +++ b/test/unit/app/tools/test_execution.py @@ -6,8 +6,8 @@ from unittest import TestCase import webob.exc import galaxy.model -from galaxy.model.orm.util import add_object_to_object_session from galaxy.app_unittest_utils import tools_support +from galaxy.model.orm.util import add_object_to_object_session from galaxy.util.bunch import Bunch BASE_REPEAT_TOOL_CONTENTS = """