From ff95512b9ad43c49c0aa2f89fa4d70355e2a28f8 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 28 Apr 2026 08:18:40 -0700 Subject: [PATCH] Fix: apply tag changes directly to document in db (#12664) --- src/documents/tests/test_workflows.py | 63 +++++++++++++++++++++++++++ src/documents/workflows/mutations.py | 4 +- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/documents/tests/test_workflows.py b/src/documents/tests/test_workflows.py index 87cc54779..813e30b84 100644 --- a/src/documents/tests/test_workflows.py +++ b/src/documents/tests/test_workflows.py @@ -2848,6 +2848,69 @@ class TestWorkflows( group_perms: QuerySet = get_groups_with_perms(doc) self.assertNotIn(self.group1, group_perms) + def test_document_updated_workflow_assignment_persists_when_removing_trigger_tag( + self, + ) -> None: + """ + GIVEN: + - A document updated workflow filtered on a tag + - The workflow assigns a new title and removes that same tag + WHEN: + - The document is updated while carrying the trigger tag + THEN: + - The new title persists and the trigger tag is removed + """ + trigger = WorkflowTrigger.objects.create( + type=WorkflowTrigger.WorkflowTriggerType.DOCUMENT_UPDATED, + ) + trigger.filter_has_tags.add(self.t1) + assignment = WorkflowAction.objects.create( + type=WorkflowAction.WorkflowActionType.ASSIGNMENT, + assign_title="workflow renamed", + order=0, + ) + removal = WorkflowAction.objects.create( + type=WorkflowAction.WorkflowActionType.REMOVAL, + order=1, + ) + removal.remove_tags.add(self.t1) + removal.save() + + workflow = Workflow.objects.create( + name="Workflow rename and remove trigger tag", + order=0, + ) + workflow.triggers.add(trigger) + workflow.actions.add(assignment, removal) + workflow.save() + + doc = Document.objects.create( + title="sample test", + mime_type="application/pdf", + checksum="rename-remove-trigger-tag", + original_filename="sample.pdf", + ) + generated = generate_unique_filename(doc) + destination = (settings.ORIGINALS_DIR / generated).resolve() + create_source_path_directory(destination) + shutil.copy(self.SAMPLE_DIR / "simple.pdf", destination) + Document.objects.filter(pk=doc.pk).update(filename=generated.as_posix()) + doc.refresh_from_db() + doc.tags.set([self.t1, self.t2]) + + superuser = User.objects.create_superuser("superuser") + self.client.force_authenticate(user=superuser) + self.client.patch( + f"/api/documents/{doc.id}/", + {"title": "user update to trigger workflow"}, + format="json", + ) + + doc.refresh_from_db() + self.assertEqual(doc.title, "workflow renamed") + self.assertFalse(doc.tags.filter(pk=self.t1.pk).exists()) + self.assertTrue(doc.tags.filter(pk=self.t2.pk).exists()) + def test_removal_action_document_updated_removeall(self) -> None: """ GIVEN: diff --git a/src/documents/workflows/mutations.py b/src/documents/workflows/mutations.py index 1a5e62ac6..4945d00d5 100644 --- a/src/documents/workflows/mutations.py +++ b/src/documents/workflows/mutations.py @@ -202,7 +202,7 @@ def apply_removal_to_document( """ if action.remove_all_tags: - document.tags.clear() + Document.objects.get(pk=document.pk).tags.clear() else: tag_ids_to_remove: set[int] = set() for tag in action.remove_tags.all(): @@ -210,7 +210,7 @@ def apply_removal_to_document( tag_ids_to_remove.update(int(pk) for pk in tag.get_descendants_pks()) if tag_ids_to_remove: - document.tags.remove(*tag_ids_to_remove) + Document.objects.get(pk=document.pk).tags.remove(*tag_ids_to_remove) if action.remove_all_correspondents or ( document.correspondent