From ee2050b8f9ce4028f2baac3a83b9bbdd1496cf63 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 15 Mar 2019 11:40:30 +0100 Subject: [PATCH] Do not ever ask people to select a payment method for 0.00 --- src/pretix/presale/views/order.py | 32 ++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index ad1eba462d..12aba9eb94 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -16,7 +16,9 @@ from django.utils.translation import ugettext_lazy as _ from django.views.decorators.clickjacking import xframe_options_exempt from django.views.generic import TemplateView, View -from pretix.base.models import CachedTicket, Invoice, Order, OrderPosition +from pretix.base.models import ( + CachedTicket, Invoice, Order, OrderPosition, Quota, +) from pretix.base.models.orders import ( CachedCombinedTicket, OrderFee, OrderPayment, OrderRefund, QuestionAnswer, ) @@ -25,6 +27,7 @@ from pretix.base.services.invoices import ( generate_cancellation, generate_invoice, invoice_pdf, invoice_pdf_task, invoice_qualified, ) +from pretix.base.services.mail import SendMailException from pretix.base.services.orders import cancel_order, change_payment_provider from pretix.base.services.tickets import generate from pretix.base.signals import allow_ticket_download, register_ticket_outputs @@ -376,6 +379,33 @@ class OrderPayChangeMethod(EventViewMixin, OrderDetailMixin, TemplateView): def _position_sum(self): return self.order.positions.aggregate(sum=Sum('price'))['sum'] or Decimal('0.00') + @transaction.atomic() + def mark_paid_free(self): + p = self.order.payments.create( + state=OrderPayment.PAYMENT_STATE_CREATED, + provider='manual', + amount=Decimal('0.00'), + fee=None + ) + try: + p.confirm() + except SendMailException: + pass + + def get(self, request, *args, **kwargs): + if self.order.pending_sum <= Decimal('0.00'): + try: + self.mark_paid_free() + except Quota.QuotaExceededException as e: + messages.error(self.request, str(e)) + return redirect(self.get_order_url()) + except PaymentException as e: + messages.error(self.request, str(e)) + return redirect(self.get_order_url()) + else: + return redirect(self.get_order_url() + '?paid=1') + return super().get(request, *args, **kwargs) + @cached_property def provider_forms(self): providers = []