diff --git a/src/documents/tasks.py b/src/documents/tasks.py index 1e8b35891..30f163cbf 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -60,6 +60,7 @@ from documents.sanity_checker import SanityCheckFailedException from documents.signals import document_updated from documents.signals.handlers import cleanup_document_deletion from documents.signals.handlers import run_workflows +from documents.signals.handlers import send_websocket_document_updated from documents.workflows.utils import get_workflows_for_trigger from paperless.config import AIConfig from paperless_ai.indexing import llm_index_add_or_update_document @@ -534,6 +535,11 @@ def check_scheduled_workflows() -> None: workflow_to_run=workflow, document=document, ) + # Scheduled workflows dont send document_updated signal, so send a websocket update here to ensure clients are updated + send_websocket_document_updated( + sender=None, + document=document, + ) def update_document_parent_tags(tag: Tag, new_parent: Tag) -> None: diff --git a/src/documents/tests/test_workflows.py b/src/documents/tests/test_workflows.py index 1cd0a9826..18f4a0aef 100644 --- a/src/documents/tests/test_workflows.py +++ b/src/documents/tests/test_workflows.py @@ -1965,6 +1965,36 @@ class TestWorkflows( doc.refresh_from_db() self.assertEqual(doc.owner, self.user2) + @mock.patch("documents.tasks.send_websocket_document_updated") + def test_workflow_scheduled_trigger_sends_websocket_update( + self, + mock_send_websocket_document_updated, + ) -> None: + trigger = WorkflowTrigger.objects.create( + type=WorkflowTrigger.WorkflowTriggerType.SCHEDULED, + schedule_offset_days=1, + schedule_date_field=WorkflowTrigger.ScheduleDateField.CREATED, + ) + action = WorkflowAction.objects.create(assign_owner=self.user2) + workflow = Workflow.objects.create(name="Workflow 1", order=0) + workflow.triggers.add(trigger) + workflow.actions.add(action) + + doc = Document.objects.create( + title="sample test", + correspondent=self.c, + original_filename="sample.pdf", + created=timezone.now() - timedelta(days=2), + ) + + tasks.check_scheduled_workflows() + + self.assertEqual(mock_send_websocket_document_updated.call_count, 1) + self.assertEqual( + mock_send_websocket_document_updated.call_args.kwargs["document"].pk, + doc.pk, + ) + def test_workflow_scheduled_trigger_added(self) -> None: """ GIVEN: