From c64667d3967f272f690ef2994e037e3e7aac562e Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 7 Jan 2024 14:27:57 -0800 Subject: [PATCH] Fix: workflow assignment of customfield fails if field exists in v2.3.1 (#5302) --- src/documents/signals/handlers.py | 16 +++++++--- src/documents/tests/test_workflows.py | 42 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index a86868462..b782cfa7f 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -610,10 +610,18 @@ def run_workflow( if action.assign_custom_fields is not None: for field in action.assign_custom_fields.all(): - CustomFieldInstance.objects.create( - field=field, - document=document, - ) # adds to document + if ( + CustomFieldInstance.objects.filter( + field=field, + document=document, + ).count() + == 0 + ): + # can be triggered on existing docs, so only add the field if it doesnt already exist + CustomFieldInstance.objects.create( + field=field, + document=document, + ) document.save() diff --git a/src/documents/tests/test_workflows.py b/src/documents/tests/test_workflows.py index 92207742f..b4ad4aa57 100644 --- a/src/documents/tests/test_workflows.py +++ b/src/documents/tests/test_workflows.py @@ -13,6 +13,7 @@ from documents.data_models import DocumentSource from documents.matching import document_matches_workflow from documents.models import Correspondent from documents.models import CustomField +from documents.models import CustomFieldInstance from documents.models import Document from documents.models import DocumentType from documents.models import MatchingModel @@ -997,6 +998,47 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase): self.assertEqual(doc.custom_fields.all().count(), 1) + def test_document_updated_workflow_existing_custom_field(self): + """ + GIVEN: + - Existing workflow with UPDATED trigger and action that adds a custom field + WHEN: + - Document is updated that already contains the field + THEN: + - Document update succeeds without trying to re-create the field + """ + trigger = WorkflowTrigger.objects.create( + type=WorkflowTrigger.WorkflowTriggerType.DOCUMENT_UPDATED, + filter_has_document_type=self.dt, + ) + action = WorkflowAction.objects.create() + action.assign_custom_fields.add(self.cf1) + w = Workflow.objects.create( + name="Workflow 1", + order=0, + ) + w.triggers.add(trigger) + w.actions.add(action) + w.save() + + doc = Document.objects.create( + title="sample test", + correspondent=self.c, + original_filename="sample.pdf", + ) + CustomFieldInstance.objects.create(document=doc, field=self.cf1) + + superuser = User.objects.create_superuser("superuser") + self.client.force_authenticate(user=superuser) + + self.client.patch( + f"/api/documents/{doc.id}/", + {"document_type": self.dt.id}, + format="json", + ) + + self.assertEqual(doc.custom_fields.all().count(), 1) + def test_workflow_enabled_disabled(self): trigger = WorkflowTrigger.objects.create( type=WorkflowTrigger.WorkflowTriggerType.DOCUMENT_ADDED,