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])