From 264d9f97fc85d878f758ee2c476873fe525c823f Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Tue, 26 Dec 2023 00:06:10 -0800
Subject: [PATCH] Implement trigger filter by tag, correspondent and doctype
---
.../workflow-edit-dialog.component.html | 7 ++--
.../workflow-edit-dialog.component.ts | 7 ++++
src-ui/src/app/data/workflow-trigger.ts | 6 ++++
src/documents/matching.py | 34 +++++++++++++++++++
...workflowaction_workflowtrigger_and_more.py | 28 +++++++++++++++
src/documents/models.py | 22 ++++++++++++
src/documents/serialisers.py | 3 ++
7 files changed, 105 insertions(+), 2 deletions(-)
diff --git a/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html b/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
index 5f0d63247..5a88e81fb 100644
--- a/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
+++ b/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.html
@@ -38,11 +38,14 @@
-
+
diff --git a/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts b/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
index bea297ef6..6e2391c52 100644
--- a/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
+++ b/src-ui/src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts
@@ -150,6 +150,13 @@ export class WorkflowEditDialogComponent
filter_filename: new FormControl(trigger.filter_filename),
filter_path: new FormControl(trigger.filter_path),
filter_mailrule: new FormControl(trigger.filter_mailrule),
+ filter_has_tags: new FormControl(trigger.filter_has_tags),
+ filter_has_correspondent: new FormControl(
+ trigger.filter_has_correspondent
+ ),
+ filter_has_document_type: new FormControl(
+ trigger.filter_has_document_type
+ ),
}),
{ emitEvent }
)
diff --git a/src-ui/src/app/data/workflow-trigger.ts b/src-ui/src/app/data/workflow-trigger.ts
index c8745c4ac..cab3762a9 100644
--- a/src-ui/src/app/data/workflow-trigger.ts
+++ b/src-ui/src/app/data/workflow-trigger.ts
@@ -22,4 +22,10 @@ export interface WorkflowTrigger extends ObjectWithId {
filter_path?: string
filter_mailrule?: number // MailRule.id
+
+ filter_has_tags?: number[] // Tag.id[]
+
+ filter_has_correspondent?: number // Correspondent.id
+
+ filter_has_document_type?: number // DocumentType.id
}
diff --git a/src/documents/matching.py b/src/documents/matching.py
index 045e2ba79..34e981797 100644
--- a/src/documents/matching.py
+++ b/src/documents/matching.py
@@ -311,6 +311,40 @@ def document_matches_workflow(
elif trigger_type is WorkflowTrigger.WorkflowTriggerType.DOCUMENT_ADDED:
# document is type Document
+ # Document has_tags vs document tags
+ if (
+ trigger.filter_has_tags.all().count() > 0
+ and document.tags.filter(
+ id__in=trigger.filter_has_tags.all().values_list("id"),
+ ).count()
+ == 0
+ ):
+ log_match_failure(
+ f"Document tags {document.tags} do not include"
+ f" {trigger.filter_has_tags}",
+ )
+ trigger_matched = False
+
+ # Document has_correspondent vs document correpondent
+ if (
+ trigger.filter_has_correspondent is not None
+ and document.correspondent != trigger.filter_has_correspondent
+ ):
+ log_match_failure(
+ f"Document correspondent {document.correspondent} does not match {trigger.filter_has_correspondent}",
+ )
+ trigger_matched = False
+
+ # Document has_correspondent vs document correpondent
+ if (
+ trigger.filter_has_document_type is not None
+ and document.document_type != trigger.filter_has_document_type
+ ):
+ log_match_failure(
+ f"Document doc type {document.document_type} does not match {trigger.filter_has_document_type}",
+ )
+ trigger_matched = False
+
# Document filename vs template filename
if (
trigger.filter_filename is not None
diff --git a/src/documents/migrations/1044_workflow_workflowaction_workflowtrigger_and_more.py b/src/documents/migrations/1044_workflow_workflowaction_workflowtrigger_and_more.py
index 8013bf5f1..c7106511a 100644
--- a/src/documents/migrations/1044_workflow_workflowaction_workflowtrigger_and_more.py
+++ b/src/documents/migrations/1044_workflow_workflowaction_workflowtrigger_and_more.py
@@ -395,6 +395,34 @@ class Migration(migrations.Migration):
verbose_name="filter documents from this mail rule",
),
),
+ (
+ "filter_has_tags",
+ models.ManyToManyField(
+ blank=True,
+ to="documents.tag",
+ verbose_name="has these tag(s)",
+ ),
+ ),
+ (
+ "filter_has_correspondent",
+ models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.SET_NULL,
+ to="documents.documenttype",
+ verbose_name="has this document type",
+ ),
+ ),
+ (
+ "filter_has_document_type",
+ models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.SET_NULL,
+ to="documents.correspondent",
+ verbose_name="has this correspondent",
+ ),
+ ),
],
options={
"verbose_name": "workflow trigger",
diff --git a/src/documents/models.py b/src/documents/models.py
index 972de8bca..5fab886d8 100644
--- a/src/documents/models.py
+++ b/src/documents/models.py
@@ -943,6 +943,28 @@ class WorkflowTrigger(models.Model):
verbose_name=_("filter documents from this mail rule"),
)
+ filter_has_tags = models.ManyToManyField(
+ Tag,
+ blank=True,
+ verbose_name=_("has these tag(s)"),
+ )
+
+ filter_has_correspondent = models.ForeignKey(
+ DocumentType,
+ null=True,
+ blank=True,
+ on_delete=models.SET_NULL,
+ verbose_name=_("has this document type"),
+ )
+
+ filter_has_document_type = models.ForeignKey(
+ Correspondent,
+ null=True,
+ blank=True,
+ on_delete=models.SET_NULL,
+ verbose_name=_("has this correspondent"),
+ )
+
class Meta:
verbose_name = _("workflow trigger")
verbose_name_plural = _("workflow triggers")
diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py
index c1bc4870e..123699135 100644
--- a/src/documents/serialisers.py
+++ b/src/documents/serialisers.py
@@ -1287,6 +1287,9 @@ class WorkflowTriggerSerializer(serializers.ModelSerializer):
"filter_path",
"filter_filename",
"filter_mailrule",
+ "filter_has_tags",
+ "filter_has_correspondent",
+ "filter_has_document_type",
]
def validate(self, attrs):