Fix: ensure only matched scheduled workflows are applied (#9580)

This commit is contained in:
shamoon 2025-04-08 08:55:03 -07:00 committed by GitHub
parent 0d5a2b4382
commit 358db10fe3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 34 additions and 21 deletions

View File

@ -649,11 +649,12 @@ def send_webhook(
def run_workflows( def run_workflows(
trigger_type: WorkflowTrigger.WorkflowTriggerType, trigger_type: WorkflowTrigger.WorkflowTriggerType,
document: Document | ConsumableDocument, document: Document | ConsumableDocument,
workflow_to_run: Workflow | None = None,
logging_group=None, logging_group=None,
overrides: DocumentMetadataOverrides | None = None, overrides: DocumentMetadataOverrides | None = None,
original_file: Path | None = None, original_file: Path | None = None,
) -> tuple[DocumentMetadataOverrides, str] | 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 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 object is provided, the function returns the object with the applied changes or None if no actions were applied and a string
@ -1192,6 +1193,7 @@ def run_workflows(
messages = [] messages = []
workflows = ( workflows = (
(
Workflow.objects.filter(enabled=True, triggers__type=trigger_type) Workflow.objects.filter(enabled=True, triggers__type=trigger_type)
.prefetch_related( .prefetch_related(
"actions", "actions",
@ -1211,6 +1213,9 @@ def run_workflows(
.order_by("order") .order_by("order")
.distinct() .distinct()
) )
if workflow_to_run is None
else [workflow_to_run]
)
for workflow in workflows: for workflow in workflows:
if not use_overrides: if not use_overrides:
@ -1220,7 +1225,14 @@ def run_workflows(
document.refresh_from_db() document.refresh_from_db()
doc_tag_ids = list(document.tags.values_list("pk", flat=True)) 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 action: WorkflowAction
for action in workflow.actions.all(): for action in workflow.actions.all():
message = f"Applying {action} from {workflow}" message = f"Applying {action} from {workflow}"

View File

@ -461,6 +461,7 @@ def check_scheduled_workflows():
) )
continue continue
run_workflows( run_workflows(
WorkflowTrigger.WorkflowTriggerType.SCHEDULED, trigger_type=WorkflowTrigger.WorkflowTriggerType.SCHEDULED,
document, workflow_to_run=workflow,
document=document,
) )