]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix: apply tag changes directly to document in db (#12664) dev
authorshamoon <4887959+shamoon@users.noreply.github.com>
Tue, 28 Apr 2026 15:18:40 +0000 (08:18 -0700)
committerGitHub <noreply@github.com>
Tue, 28 Apr 2026 15:18:40 +0000 (08:18 -0700)
src/documents/tests/test_workflows.py
src/documents/workflows/mutations.py

index 87cc54779b39e16cfd5d26f187b56fe4c2de3231..813e30b84cf9cf9b0c868f7a0260c848bf8425f6 100644 (file)
@@ -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:
index 1a5e62ac6a31c52716121fd3a5a5f59b94df36cf..4945d00d5d508a8095d214c67d5763ba0d035cd3 100644 (file)
@@ -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