From ba15c34ce12a104f3f2d9ccce96a35c2925b028d Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 30 Nov 2018 15:16:12 +0100 Subject: [PATCH] Fix #1106 -- Do not send reminders to orders placed in the last two hours --- src/pretix/base/services/orders.py | 6 ++++-- src/tests/base/test_orders.py | 23 +++++++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index d7d019b620..6283d0442c 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -661,7 +661,9 @@ def send_expiry_warnings(sender, **kwargs): eventcache = {} today = now().replace(hour=0, minute=0, second=0) - for o in Order.objects.filter(expires__gte=today, expiry_reminder_sent=False, status=Order.STATUS_PENDING).only('pk'): + for o in Order.objects.filter( + expires__gte=today, expiry_reminder_sent=False, status=Order.STATUS_PENDING, datetime__lte=now() - timedelta(hours=2) + ).only('pk'): with transaction.atomic(): o = Order.objects.select_related('event').select_for_update().get(pk=o.pk) if o.status != Order.STATUS_PENDING or o.expiry_reminder_sent: @@ -723,7 +725,7 @@ def send_download_reminders(sender, **kwargs): if now() < reminder_date: continue - for o in e.orders.filter(status=Order.STATUS_PAID, download_reminder_sent=False).only('pk'): + for o in e.orders.filter(status=Order.STATUS_PAID, download_reminder_sent=False, datetime__lte=now() - timedelta(hours=2)).only('pk'): with transaction.atomic(): o = Order.objects.select_related('event').select_for_update().get(pk=o.pk) if o.download_reminder_sent: diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 0edc45462e..6bf69fa0f9 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -301,8 +301,8 @@ class PaymentReminderTests(TestCase): self.order = Order.objects.create( code='FOO', event=self.event, email='dummy@dummy.test', status=Order.STATUS_PENDING, locale='en', - datetime=now(), - expires=now() + timedelta(days=10), + datetime=now() - timedelta(hours=4), + expires=now() - timedelta(hours=4) + timedelta(days=10), total=Decimal('46.00'), ) self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket', @@ -336,6 +336,14 @@ class PaymentReminderTests(TestCase): send_expiry_warnings(sender=self.event) assert len(djmail.outbox) == 1 + def test_sent_not_immediately_after_purchase(self): + self.order.datetime = now() + self.order.expires = now() + timedelta(hours=3) + self.order.save() + self.event.settings.mail_days_order_expire_warning = 2 + send_expiry_warnings(sender=self.event) + assert len(djmail.outbox) == 0 + class DownloadReminderTests(TestCase): def setUp(self): @@ -349,8 +357,8 @@ class DownloadReminderTests(TestCase): self.order = Order.objects.create( code='FOO', event=self.event, email='dummy@dummy.test', status=Order.STATUS_PAID, locale='en', - datetime=now(), - expires=now() + timedelta(days=10), + datetime=now() - timedelta(hours=4), + expires=now() - timedelta(hours=4) + timedelta(days=10), total=Decimal('46.00'), ) self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket', @@ -385,6 +393,13 @@ class DownloadReminderTests(TestCase): send_download_reminders(sender=self.event) assert len(djmail.outbox) == 0 + def test_not_sent_too_soon_after_purchase(self): + self.order.datetime = now() + self.order.save() + self.event.settings.mail_days_download_reminder = 2 + send_download_reminders(sender=self.event) + assert len(djmail.outbox) == 0 + class OrderChangeManagerTests(TestCase): def setUp(self):