diff --git a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html index 050a2068c..763589cc6 100644 --- a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html +++ b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html @@ -32,6 +32,7 @@
+ diff --git a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts index 079af9cc5..c3db33e2d 100644 --- a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts +++ b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts @@ -107,6 +107,7 @@ export class ConsumptionTemplateEditDialogComponent extends EditDialogComponent< sources: new FormControl([]), assign_title: new FormControl(null), assign_tags: new FormControl([]), + skip_inbox: new FormControl(false), assign_owner: new FormControl(null), assign_document_type: new FormControl(null), assign_correspondent: new FormControl(null), diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 6a0d1ec02..901551c1f 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -327,6 +327,7 @@ class Consumer(LoggingMixin): override_correspondent_id=None, override_document_type_id=None, override_tag_ids=None, + override_skip_inbox=False, override_storage_path_id=None, task_id=None, override_created=None, @@ -348,6 +349,7 @@ class Consumer(LoggingMixin): self.override_correspondent_id = override_correspondent_id self.override_document_type_id = override_document_type_id self.override_tag_ids = override_tag_ids + self.override_skip_inbox = override_skip_inbox self.override_storage_path_id = override_storage_path_id self.task_id = task_id or str(uuid.uuid4()) self.override_created = override_created @@ -516,6 +518,7 @@ class Consumer(LoggingMixin): document=document, logging_group=self.logging_group, classifier=classifier, + skip_inbox=self.override_skip_inbox, ) # After everything is in the database, copy the files into @@ -621,6 +624,8 @@ class Consumer(LoggingMixin): template_overrides.tag_ids = [ tag.pk for tag in template.assign_tags.all() ] + if template.skip_inbox: + template_overrides.skip_inbox = True if template.assign_correspondent is not None: template_overrides.correspondent_id = ( template.assign_correspondent.pk diff --git a/src/documents/data_models.py b/src/documents/data_models.py index 0d506cd6a..ba58fe642 100644 --- a/src/documents/data_models.py +++ b/src/documents/data_models.py @@ -20,6 +20,7 @@ class DocumentMetadataOverrides: correspondent_id: Optional[int] = None document_type_id: Optional[int] = None tag_ids: Optional[list[int]] = None + skip_inbox: bool = False storage_path_id: Optional[int] = None created: Optional[datetime.datetime] = None asn: Optional[int] = None @@ -57,6 +58,8 @@ class DocumentMetadataOverrides: self.tag_ids.extend(other.tag_ids) self.tag_ids = list(set(self.tag_ids)) + self.skip_inbox = self.skip_inbox or other.skip_inbox + if self.view_users is None: self.view_users = other.view_users elif other.view_users is not None: diff --git a/src/documents/migrations/1044_consumptiontemplate_skip_inbox.py b/src/documents/migrations/1044_consumptiontemplate_skip_inbox.py new file mode 100644 index 000000000..a885b6355 --- /dev/null +++ b/src/documents/migrations/1044_consumptiontemplate_skip_inbox.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.8 on 2023-12-29 15:22 + +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "1043_alter_savedviewfilterrule_rule_type"), + ] + + operations = [ + migrations.AddField( + model_name="consumptiontemplate", + name="skip_inbox", + field=models.BooleanField( + default=False, + verbose_name="Skip assigning inbox tag(s)", + ), + ), + ] diff --git a/src/documents/models.py b/src/documents/models.py index d95bf46e1..6e01479bb 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -953,6 +953,11 @@ class ConsumptionTemplate(models.Model): verbose_name=_("assign this tag"), ) + skip_inbox = models.BooleanField( + _("Skip assigning inbox tag(s)"), + default=False, + ) + assign_document_type = models.ForeignKey( DocumentType, null=True, diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index b6be62d9b..6b6142a00 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -1286,6 +1286,7 @@ class ConsumptionTemplateSerializer(serializers.ModelSerializer): "filter_mailrule", "assign_title", "assign_tags", + "skip_inbox", "assign_correspondent", "assign_document_type", "assign_storage_path", diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index 117e3c38d..2cb447b71 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -36,7 +36,16 @@ from documents.permissions import get_objects_for_user_owner_aware logger = logging.getLogger("paperless.handlers") -def add_inbox_tags(sender, document: Document, logging_group=None, **kwargs): +def add_inbox_tags( + sender, + document: Document, + logging_group=None, + skip_inbox=False, + **kwargs, +): + if skip_inbox: + return + if document.owner is not None: tags = get_objects_for_user_owner_aware( document.owner, diff --git a/src/documents/tasks.py b/src/documents/tasks.py index d0728a719..4af558098 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -171,6 +171,7 @@ def consume_file( override_correspondent_id=overrides.correspondent_id, override_document_type_id=overrides.document_type_id, override_tag_ids=overrides.tag_ids, + override_skip_inbox=overrides.skip_inbox, override_storage_path_id=overrides.storage_path_id, override_created=overrides.created, override_asn=overrides.asn, diff --git a/src/documents/tests/test_consumption_templates.py b/src/documents/tests/test_consumption_templates.py index 6f671bfc4..9b7828e04 100644 --- a/src/documents/tests/test_consumption_templates.py +++ b/src/documents/tests/test_consumption_templates.py @@ -227,6 +227,7 @@ class TestConsumptionTemplates(DirectoriesMixin, FileSystemAssertsMixin, TestCas order=0, sources=f"{DocumentSource.ApiUpload},{DocumentSource.ConsumeFolder},{DocumentSource.MailFetch}", filter_path="*/samples/*", + skip_inbox=True, assign_title="Doc from {correspondent}", assign_correspondent=self.c, assign_document_type=self.dt, @@ -240,6 +241,7 @@ class TestConsumptionTemplates(DirectoriesMixin, FileSystemAssertsMixin, TestCas order=0, sources=f"{DocumentSource.ApiUpload},{DocumentSource.ConsumeFolder},{DocumentSource.MailFetch}", filter_filename="*simple*", + skip_inbox=False, assign_title="Doc from {correspondent}", assign_correspondent=self.c2, assign_storage_path=self.sp, @@ -275,6 +277,7 @@ class TestConsumptionTemplates(DirectoriesMixin, FileSystemAssertsMixin, TestCas overrides["override_view_users"], [self.user2.pk, self.user3.pk], ) + self.assertTrue(overrides["override_skip_inbox"]) expected_str = f"Document matched template {ct1}" self.assertIn(expected_str, cm.output[0])