Merge branch 'dev' into fix-7807
This commit is contained in:
@@ -8,7 +8,7 @@ class TestMigrateWorkflow(TestMigrations):
|
||||
dependencies = (
|
||||
(
|
||||
"paperless_mail",
|
||||
"0025_alter_mailaccount_owner_alter_mailrule_owner_and_more",
|
||||
"0026_mailrule_enabled",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ class MailRuleAdmin(GuardedModelAdmin):
|
||||
}
|
||||
|
||||
fieldsets = (
|
||||
(None, {"fields": ("name", "order", "account", "folder")}),
|
||||
(None, {"fields": ("name", "order", "account", "enabled", "folder")}),
|
||||
(
|
||||
_("Filter"),
|
||||
{
|
||||
|
||||
@@ -544,6 +544,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,
|
||||
|
||||
21
src/paperless_mail/migrations/0026_mailrule_enabled.py
Normal file
21
src/paperless_mail/migrations/0026_mailrule_enabled.py
Normal file
@@ -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"),
|
||||
),
|
||||
]
|
||||
@@ -115,6 +115,8 @@ class MailRule(document_models.ModelWithOwner):
|
||||
verbose_name=_("account"),
|
||||
)
|
||||
|
||||
enabled = models.BooleanField(_("enabled"), default=True)
|
||||
|
||||
folder = models.CharField(
|
||||
_("folder"),
|
||||
default="INBOX",
|
||||
|
||||
@@ -74,6 +74,7 @@ class MailRuleSerializer(OwnedObjectSerializer):
|
||||
"id",
|
||||
"name",
|
||||
"account",
|
||||
"enabled",
|
||||
"folder",
|
||||
"filter_from",
|
||||
"filter_to",
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -497,6 +497,7 @@ class TestParser:
|
||||
|
||||
assert mail_parser.archive_path is not None
|
||||
|
||||
@pytest.mark.httpx_mock(can_send_already_matched_responses=True)
|
||||
def test_generate_pdf_html_email(
|
||||
self,
|
||||
httpx_mock: HTTPXMock,
|
||||
@@ -575,6 +576,7 @@ class TestParser:
|
||||
with pytest.raises(ParseError):
|
||||
mail_parser.parse(html_email_file, "message/rfc822")
|
||||
|
||||
@pytest.mark.httpx_mock(can_send_already_matched_responses=True)
|
||||
def test_generate_pdf_html_email_merge_failure(
|
||||
self,
|
||||
httpx_mock: HTTPXMock,
|
||||
|
||||
@@ -5,7 +5,6 @@ from pathlib import Path
|
||||
|
||||
import pytest
|
||||
from httpx import codes
|
||||
from httpx._multipart import DataField
|
||||
from pytest_django.fixtures import SettingsWrapper
|
||||
from pytest_httpx import HTTPXMock
|
||||
|
||||
@@ -128,11 +127,22 @@ class TestTikaParser:
|
||||
tika_parser.convert_to_pdf(sample_odt_file, None)
|
||||
|
||||
request = httpx_mock.get_request()
|
||||
found = False
|
||||
for field in request.stream.fields:
|
||||
if isinstance(field, DataField) and field.name == "pdfa":
|
||||
assert field.value == expected_form_value
|
||||
found = True
|
||||
assert found, "pdfFormat was not found"
|
||||
|
||||
httpx_mock.reset(assert_all_responses_were_requested=False)
|
||||
expected_field_name = "pdfa"
|
||||
|
||||
content_type = request.headers["Content-Type"]
|
||||
assert "multipart/form-data" in content_type
|
||||
|
||||
boundary = content_type.split("boundary=")[1]
|
||||
|
||||
parts = request.content.split(f"--{boundary}".encode())
|
||||
|
||||
form_field_found = any(
|
||||
f'name="{expected_field_name}"'.encode() in part
|
||||
and expected_form_value.encode() in part
|
||||
for part in parts
|
||||
)
|
||||
|
||||
assert form_field_found
|
||||
|
||||
httpx_mock.reset()
|
||||
|
||||
Reference in New Issue
Block a user