]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix: ensure only matched scheduled workflows are applied (#9580)
authorshamoon <4887959+shamoon@users.noreply.github.com>
Tue, 8 Apr 2025 15:55:03 +0000 (08:55 -0700)
committerGitHub <noreply@github.com>
Tue, 8 Apr 2025 15:55:03 +0000 (08:55 -0700)
src/documents/signals/handlers.py
src/documents/tasks.py

index 21ea768366896d2d35a17ef9d997410665fb86eb..073026b192a28350b6dc50c8775e9cf4e01702b0 100644 (file)
@@ -649,11 +649,12 @@ def send_webhook(
 def run_workflows(
     trigger_type: WorkflowTrigger.WorkflowTriggerType,
     document: Document | ConsumableDocument,
+    workflow_to_run: Workflow | None = None,
     logging_group=None,
     overrides: DocumentMetadataOverrides | None = None,
     original_file: Path | None = None,
 ) -> tuple[DocumentMetadataOverrides, str] | None:
-    """Run workflows which match a Document (or ConsumableDocument) for a specific trigger type.
+    """Run workflows which match a Document (or ConsumableDocument) for a specific trigger type or a single workflow if given.
 
     Assignment or removal actions are either applied directly to the document or an overrides object. If an overrides
     object is provided, the function returns the object with the applied changes or None if no actions were applied and a string
@@ -1192,24 +1193,28 @@ def run_workflows(
     messages = []
 
     workflows = (
-        Workflow.objects.filter(enabled=True, triggers__type=trigger_type)
-        .prefetch_related(
-            "actions",
-            "actions__assign_view_users",
-            "actions__assign_view_groups",
-            "actions__assign_change_users",
-            "actions__assign_change_groups",
-            "actions__assign_custom_fields",
-            "actions__remove_tags",
-            "actions__remove_correspondents",
-            "actions__remove_document_types",
-            "actions__remove_storage_paths",
-            "actions__remove_custom_fields",
-            "actions__remove_owners",
-            "triggers",
+        (
+            Workflow.objects.filter(enabled=True, triggers__type=trigger_type)
+            .prefetch_related(
+                "actions",
+                "actions__assign_view_users",
+                "actions__assign_view_groups",
+                "actions__assign_change_users",
+                "actions__assign_change_groups",
+                "actions__assign_custom_fields",
+                "actions__remove_tags",
+                "actions__remove_correspondents",
+                "actions__remove_document_types",
+                "actions__remove_storage_paths",
+                "actions__remove_custom_fields",
+                "actions__remove_owners",
+                "triggers",
+            )
+            .order_by("order")
+            .distinct()
         )
-        .order_by("order")
-        .distinct()
+        if workflow_to_run is None
+        else [workflow_to_run]
     )
 
     for workflow in workflows:
@@ -1220,7 +1225,14 @@ def run_workflows(
             document.refresh_from_db()
             doc_tag_ids = list(document.tags.values_list("pk", flat=True))
 
-        if matching.document_matches_workflow(document, workflow, trigger_type):
+        # If a workflow is supplied, we don't need to check if it matches
+        matches = (
+            matching.document_matches_workflow(document, workflow, trigger_type)
+            if workflow_to_run is None
+            else True
+        )
+
+        if matches:
             action: WorkflowAction
             for action in workflow.actions.all():
                 message = f"Applying {action} from {workflow}"
index e60418c3b10777ab2fb2d271af05864d0e2309b6..7d71d48c95bfb3f47c0ca52279359fe624b2d231 100644 (file)
@@ -461,6 +461,7 @@ def check_scheduled_workflows():
                             )
                             continue
                         run_workflows(
-                            WorkflowTrigger.WorkflowTriggerType.SCHEDULED,
-                            document,
+                            trigger_type=WorkflowTrigger.WorkflowTriggerType.SCHEDULED,
+                            workflow_to_run=workflow,
+                            document=document,
                         )