Fix #1106 -- Do not send reminders to orders placed in the last two hours

This commit is contained in:
Raphael Michel
2018-11-30 15:16:12 +01:00
parent 94f2ad9325
commit ba15c34ce1
2 changed files with 23 additions and 6 deletions

View File

@@ -661,7 +661,9 @@ def send_expiry_warnings(sender, **kwargs):
eventcache = {} eventcache = {}
today = now().replace(hour=0, minute=0, second=0) 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(): with transaction.atomic():
o = Order.objects.select_related('event').select_for_update().get(pk=o.pk) o = Order.objects.select_related('event').select_for_update().get(pk=o.pk)
if o.status != Order.STATUS_PENDING or o.expiry_reminder_sent: 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: if now() < reminder_date:
continue 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(): with transaction.atomic():
o = Order.objects.select_related('event').select_for_update().get(pk=o.pk) o = Order.objects.select_related('event').select_for_update().get(pk=o.pk)
if o.download_reminder_sent: if o.download_reminder_sent:

View File

@@ -301,8 +301,8 @@ class PaymentReminderTests(TestCase):
self.order = Order.objects.create( self.order = Order.objects.create(
code='FOO', event=self.event, email='dummy@dummy.test', code='FOO', event=self.event, email='dummy@dummy.test',
status=Order.STATUS_PENDING, locale='en', status=Order.STATUS_PENDING, locale='en',
datetime=now(), datetime=now() - timedelta(hours=4),
expires=now() + timedelta(days=10), expires=now() - timedelta(hours=4) + timedelta(days=10),
total=Decimal('46.00'), total=Decimal('46.00'),
) )
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket', 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) send_expiry_warnings(sender=self.event)
assert len(djmail.outbox) == 1 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): class DownloadReminderTests(TestCase):
def setUp(self): def setUp(self):
@@ -349,8 +357,8 @@ class DownloadReminderTests(TestCase):
self.order = Order.objects.create( self.order = Order.objects.create(
code='FOO', event=self.event, email='dummy@dummy.test', code='FOO', event=self.event, email='dummy@dummy.test',
status=Order.STATUS_PAID, locale='en', status=Order.STATUS_PAID, locale='en',
datetime=now(), datetime=now() - timedelta(hours=4),
expires=now() + timedelta(days=10), expires=now() - timedelta(hours=4) + timedelta(days=10),
total=Decimal('46.00'), total=Decimal('46.00'),
) )
self.ticket = Item.objects.create(event=self.event, name='Early-bird ticket', 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) send_download_reminders(sender=self.event)
assert len(djmail.outbox) == 0 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): class OrderChangeManagerTests(TestCase):
def setUp(self): def setUp(self):