diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index 258ce064ba..bec57b8476 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -2858,7 +2858,7 @@ class OutgoingMailFilterForm(FilterForm): qs = qs.filter( Q(to__containsstring=query) | Q(cc__containsstring=query) - | Q(bcc_containsstring=query) + | Q(bcc__containsstring=query) | Q(subject__icontains=query) ) diff --git a/src/tests/control/test_organizer.py b/src/tests/control/test_organizer.py index d1d42f5a04..3dd1b45728 100644 --- a/src/tests/control/test_organizer.py +++ b/src/tests/control/test_organizer.py @@ -24,12 +24,13 @@ from smtplib import SMTPResponseException import pytest import responses +from django.conf import settings from django.db import transaction from django.test.utils import override_settings from django_scopes import scopes_disabled from tests.base import SoupTest, extract_form_fields -from pretix.base.models import Event, Organizer, Team, User +from pretix.base.models import Event, Organizer, OutgoingMail, Team, User @pytest.fixture @@ -453,3 +454,111 @@ class OrganizerTest(SoupTest): self.event1.refresh_from_db() assert 'pretix.plugins.banktransfer' not in self.event1.get_plugins() assert 'pretix.plugins.stripe' in self.event1.get_plugins() + + def test_outgoing_mails_list_and_detail(self): + m1 = OutgoingMail.objects.create( + organizer=self.orga1, + to=['rightrecipient@example.com'], + subject='Test', + body_plain='Test', + sender='sender@example.com', + headers={}, + ) + m2 = OutgoingMail.objects.create( + organizer=self.orga2, + to=['wrongrecipient@example.com'], + subject='Test', + body_plain='Test', + sender='sender@example.com', + headers={}, + ) + resp = self.client.get('/control/organizer/%s/outgoingmails' % self.orga1.slug) + assert resp.status_code == 200 + assert b"rightrecipient@example.com" in resp.content + assert b"wrongrecipient@example.com" not in resp.content + + resp = self.client.get('/control/organizer/%s/outgoingmails?status=queued' % self.orga1.slug) + assert resp.status_code == 200 + assert b"rightrecipient@example.com" in resp.content + resp = self.client.get('/control/organizer/%s/outgoingmails?status=sent' % self.orga1.slug) + assert resp.status_code == 200 + assert b"rightrecipient@example.com" not in resp.content + + if 'postgresql' in settings.DATABASES['default']['ENGINE']: + resp = self.client.get('/control/organizer/%s/outgoingmails?query=rightrecipient' % self.orga1.slug) + assert resp.status_code == 200 + assert b"rightrecipient@example.com" in resp.content + resp = self.client.get('/control/organizer/%s/outgoingmails?query=wrongrecipient' % self.orga1.slug) + assert resp.status_code == 200 + assert b"rightrecipient@example.com" not in resp.content + + resp = self.client.get('/control/organizer/%s/outgoingmail/%d/' % (self.orga1.slug, m1.pk)) + assert resp.status_code == 200 + assert b"rightrecipient@example.com" in resp.content + + resp = self.client.get('/control/organizer/%s/outgoingmail/%d/' % (self.orga1.slug, m2.pk)) + assert resp.status_code == 404 + + def test_outgoing_mails_retry(self): + m1 = OutgoingMail.objects.create( + organizer=self.orga1, + status=OutgoingMail.STATUS_SENT, + to=['rightrecipient@example.com'], + subject='Test', + body_plain='Test', + sender='sender@example.com', + headers={}, + ) + m2 = OutgoingMail.objects.create( + organizer=self.orga1, + status=OutgoingMail.STATUS_FAILED, + to=['rightrecipient@example.com'], + subject='Test', + body_plain='Test', + sender='sender@example.com', + headers={}, + ) + resp = self.client.post( + '/control/organizer/%s/outgoingmail/bulk_action' % self.orga1.slug, + data={ + "action": "retry", + "outgoingmail": [m1.pk, m2.pk] + } + ) + assert resp.status_code == 302 + m1.refresh_from_db() + m2.refresh_from_db() + assert m1.status == OutgoingMail.STATUS_SENT + assert m2.status in (OutgoingMail.STATUS_SENT, OutgoingMail.STATUS_QUEUED) + + def test_outgoing_mails_abort(self): + m1 = OutgoingMail.objects.create( + organizer=self.orga1, + status=OutgoingMail.STATUS_SENT, + to=['rightrecipient@example.com'], + subject='Test', + body_plain='Test', + sender='sender@example.com', + headers={}, + ) + m2 = OutgoingMail.objects.create( + organizer=self.orga1, + status=OutgoingMail.STATUS_QUEUED, + to=['rightrecipient@example.com'], + subject='Test', + body_plain='Test', + sender='sender@example.com', + headers={}, + ) + resp = self.client.post( + '/control/organizer/%s/outgoingmail/bulk_action' % self.orga1.slug, + data={ + "action": "abort", + "__ALL": "on", + } + ) + assert resp.status_code == 302 + m1.refresh_from_db() + m2.refresh_from_db() + assert m1.status == OutgoingMail.STATUS_SENT + assert m2.status == OutgoingMail.STATUS_ABORTED diff --git a/src/tests/control/test_permissions.py b/src/tests/control/test_permissions.py index 3b3c11fc0b..605e8fce7f 100644 --- a/src/tests/control/test_permissions.py +++ b/src/tests/control/test_permissions.py @@ -192,6 +192,9 @@ organizer_urls = [ 'organizer/abc/team/1/edit', 'organizer/abc/team/1/delete', 'organizer/abc/team/add', + 'organizer/abc/outgoingmails', + 'organizer/abc/outgoingmail/bulk_action', + 'organizer/abc/outgoingmail/1/', 'organizer/abc/devices', 'organizer/abc/device/add', 'organizer/abc/device/bulk_edit', @@ -528,6 +531,9 @@ organizer_permission_urls = [ ("can_change_organizer_settings", "organizer/dummy/settings/plugins/pretix.plugins.sendmail/events", 200), ("can_change_organizer_settings", "organizer/dummy/settings/email", 200), ("can_change_organizer_settings", "organizer/dummy/settings/email/setup", 200), + ("can_change_organizer_settings", "organizer/dummy/outgoingmails", 200), + ("can_change_organizer_settings", "organizer/dummy/outgoingmail/1/", 404), + ("can_change_organizer_settings", "organizer/dummy/outgoingmail/bulk_action", 405), ("can_change_organizer_settings", "organizer/dummy/devices", 200), ("can_change_organizer_settings", "organizer/dummy/devices/select2", 200), ("can_change_organizer_settings", "organizer/dummy/device/add", 200),