From b1bc3abd366f69bc24044e7541d4b70a56706d3c Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 30 Sep 2024 08:17:24 -0700 Subject: [PATCH] Backend disableable mail rules --- .../tests/test_migration_workflows.py | 2 +- src/paperless_mail/admin.py | 2 +- src/paperless_mail/mail.py | 3 ++ .../migrations/0026_mailrule_enabled.py | 21 +++++++++++ src/paperless_mail/models.py | 2 ++ src/paperless_mail/serialisers.py | 1 + src/paperless_mail/tests/test_mail.py | 35 +++++++++++++++++++ 7 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 src/paperless_mail/migrations/0026_mailrule_enabled.py diff --git a/src/documents/tests/test_migration_workflows.py b/src/documents/tests/test_migration_workflows.py index 403067ca6..81bb577b2 100644 --- a/src/documents/tests/test_migration_workflows.py +++ b/src/documents/tests/test_migration_workflows.py @@ -8,7 +8,7 @@ class TestMigrateWorkflow(TestMigrations): dependencies = ( ( "paperless_mail", - "0025_alter_mailaccount_owner_alter_mailrule_owner_and_more", + "0026_mailrule_enabled", ), ) diff --git a/src/paperless_mail/admin.py b/src/paperless_mail/admin.py index adec5e17c..2ff313584 100644 --- a/src/paperless_mail/admin.py +++ b/src/paperless_mail/admin.py @@ -53,7 +53,7 @@ class MailRuleAdmin(GuardedModelAdmin): } fieldsets = ( - (None, {"fields": ("name", "order", "account", "folder")}), + (None, {"fields": ("name", "order", "account", "enabled", "folder")}), ( _("Filter"), { diff --git a/src/paperless_mail/mail.py b/src/paperless_mail/mail.py index b52a2ebe4..84f97b742 100644 --- a/src/paperless_mail/mail.py +++ b/src/paperless_mail/mail.py @@ -536,6 +536,9 @@ class MailAccountHandler(LoggingMixin): ) for rule in account.rules.order_by("order"): + if not rule.enabled: + self.log.debug(f"Rule {rule}: Skipping disabled rule") + continue try: total_processed_files += self._handle_mail_rule( M, diff --git a/src/paperless_mail/migrations/0026_mailrule_enabled.py b/src/paperless_mail/migrations/0026_mailrule_enabled.py new file mode 100644 index 000000000..c10ee698c --- /dev/null +++ b/src/paperless_mail/migrations/0026_mailrule_enabled.py @@ -0,0 +1,21 @@ +# Generated by Django 5.1.1 on 2024-09-30 15:17 + +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ( + "paperless_mail", + "0025_alter_mailaccount_owner_alter_mailrule_owner_and_more", + ), + ] + + operations = [ + migrations.AddField( + model_name="mailrule", + name="enabled", + field=models.BooleanField(default=True, verbose_name="enabled"), + ), + ] diff --git a/src/paperless_mail/models.py b/src/paperless_mail/models.py index c53b16f1f..c23ea48c7 100644 --- a/src/paperless_mail/models.py +++ b/src/paperless_mail/models.py @@ -115,6 +115,8 @@ class MailRule(document_models.ModelWithOwner): verbose_name=_("account"), ) + enabled = models.BooleanField(_("enabled"), default=True) + folder = models.CharField( _("folder"), default="INBOX", diff --git a/src/paperless_mail/serialisers.py b/src/paperless_mail/serialisers.py index 38ee9661e..9237b47de 100644 --- a/src/paperless_mail/serialisers.py +++ b/src/paperless_mail/serialisers.py @@ -74,6 +74,7 @@ class MailRuleSerializer(OwnedObjectSerializer): "id", "name", "account", + "enabled", "folder", "filter_from", "filter_to", diff --git a/src/paperless_mail/tests/test_mail.py b/src/paperless_mail/tests/test_mail.py index c12b54ffe..9078335a6 100644 --- a/src/paperless_mail/tests/test_mail.py +++ b/src/paperless_mail/tests/test_mail.py @@ -1388,6 +1388,41 @@ class TestMail( self.assertEqual(len(self.mailMocker.bogus_mailbox.fetch("UNSEEN", False)), 0) self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 3) + def test_disabled_rule(self): + """ + GIVEN: + - Mail rule is disabled + WHEN: + - Mail account is handled + THEN: + - Should not process any messages + """ + account = MailAccount.objects.create( + name="test", + imap_server="", + username="admin", + password="secret", + ) + MailRule.objects.create( + name="testrule", + account=account, + action=MailRule.MailAction.MARK_READ, + enabled=False, + ) + + self.mail_account_handler.handle_mail_account(account) + self.mailMocker.apply_mail_actions() + + self.assertEqual(len(self.mailMocker.bogus_mailbox.messages), 3) + self.assertEqual(len(self.mailMocker.bogus_mailbox.fetch("UNSEEN", False)), 2) + + self.mail_account_handler.handle_mail_account(account) + self.mailMocker.apply_mail_actions() + self.assertEqual( + len(self.mailMocker.bogus_mailbox.fetch("UNSEEN", False)), + 2, + ) # still 2 + class TestManagementCommand(TestCase): @mock.patch(