From 221526c979c3872b24beba30b7f7bc152e97a75a Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sun, 22 Jan 2017 17:46:56 +0100 Subject: [PATCH] Prevent duplicate payment confirmation mails --- src/pretix/base/services/orders.py | 3 +++ src/pretix/plugins/paypal/payment.py | 6 +++++- src/pretix/presale/views/cart.py | 4 +++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index ad940c99c7a..8fdfa7173ea 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -85,6 +85,9 @@ def mark_order_paid(order: Order, provider: str=None, info: str=None, date: date :type mail_text: str :raises Quota.QuotaExceededException: if the quota is exceeded and ``force`` is ``False`` """ + if order.status == Order.STATUS_PAID: + return order + with order.event.lock() as now_dt: can_be_paid = order._can_be_paid() if not force and can_be_paid is not True: diff --git a/src/pretix/plugins/paypal/payment.py b/src/pretix/plugins/paypal/payment.py index fd441f82068..295905bb30d 100644 --- a/src/pretix/plugins/paypal/payment.py +++ b/src/pretix/plugins/paypal/payment.py @@ -8,7 +8,7 @@ from django.template.loader import get_template from django.utils.translation import ugettext as __, ugettext_lazy as _ -from pretix.base.models import Quota, RequiredAction +from pretix.base.models import Order, Quota, RequiredAction from pretix.base.payment import BasePaymentProvider from pretix.base.services.mail import SendMailException from pretix.base.services.orders import mark_order_paid, mark_order_refunded @@ -199,6 +199,10 @@ def _execute_payment(self, payment, request, order): logger.error('Invalid state: %s' % str(payment)) return + if order.status == Order.STATUS_PAID: + logger.warning('PayPal success event even though order is already marked as paid') + return + try: mark_order_paid(order, 'paypal', json.dumps(payment.to_dict())) except Quota.QuotaExceededException as e: diff --git a/src/pretix/presale/views/cart.py b/src/pretix/presale/views/cart.py index 37c5dd8345f..400a00cd0c7 100644 --- a/src/pretix/presale/views/cart.py +++ b/src/pretix/presale/views/cart.py @@ -42,8 +42,10 @@ def _item_from_post_value(self, key, value, voucher=None): amount = int(value) except ValueError: raise CartError(_('Please enter numbers only.')) - if amount <= 0: + if amount < 0: raise CartError(_('Please enter positive numbers only.')) + elif amount == 0: + return price = self.request.POST.get('price_' + "_".join(parts[1:]), "") if key.startswith('item_'):