From 2efde1669d55c879e0e71036b31c72951360353d Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 29 Nov 2016 16:33:27 +0100 Subject: [PATCH] PayPal: Refactor callback view --- src/pretix/plugins/paypal/payment.py | 1 - src/pretix/plugins/paypal/views.py | 57 ++++++++++++++++------------ 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/pretix/plugins/paypal/payment.py b/src/pretix/plugins/paypal/payment.py index 40dc3553f7..0bf044b53e 100644 --- a/src/pretix/plugins/paypal/payment.py +++ b/src/pretix/plugins/paypal/payment.py @@ -114,7 +114,6 @@ class Paypal(BasePaymentProvider): logger.error('Invalid payment state: ' + str(payment)) return request.session['payment_paypal_id'] = payment.id - request.session['payment_paypal_event'] = self.event.id for link in payment.links: if link.method == "REDIRECT" and link.rel == "approval_url": return str(link.href) diff --git a/src/pretix/plugins/paypal/views.py b/src/pretix/plugins/paypal/views.py index 058a1b6b7c..26aea7064f 100644 --- a/src/pretix/plugins/paypal/views.py +++ b/src/pretix/plugins/paypal/views.py @@ -4,41 +4,48 @@ from django.contrib import messages from django.shortcuts import redirect from django.utils.translation import ugettext_lazy as _ -from pretix.base.models import Event, Order +from pretix.base.models import Order from pretix.multidomain.urlreverse import eventreverse from pretix.plugins.paypal.payment import Paypal +from pretix.presale.utils import event_view logger = logging.getLogger('pretix.plugins.paypal') -def success(request, organizer=None, event=None): +@event_view(require_live=False) +def success(request, *args, **kwargs): pid = request.GET.get('paymentId') token = request.GET.get('token') payer = request.GET.get('PayerID') - if pid == request.session.get('payment_paypal_id', None): - request.session['payment_paypal_token'] = token - request.session['payment_paypal_payer'] = payer - try: - event = Event.objects.get(id=request.session['payment_paypal_event']) - if request.session.get('payment_paypal_order'): - prov = Paypal(event) - order = Order.objects.get(pk=request.session.get('payment_paypal_order')) - resp = prov.payment_perform(request, order) - return redirect(resp or eventreverse(event, 'presale:event.order', kwargs={ - 'order': order.code, - 'secret': order.secret - }) + '?paid=yes') - return redirect(eventreverse(event, 'presale:event.checkout', kwargs={'step': 'confirm'})) - except Event.DoesNotExist: - pass # TODO: Handle this + request.session['payment_paypal_token'] = token + request.session['payment_paypal_payer'] = payer + + if request.session.get('payment_paypal_order'): + order = Order.objects.get(pk=request.session.get('payment_paypal_order')) else: - pass # TODO: Handle this + order = None + + if pid == request.session.get('payment_paypal_id', None): + if order: + prov = Paypal(request.event) + resp = prov.payment_perform(request, order) + if resp: + return resp + else: + messages.error(request, _('Invalid response from PayPal received.')) + logger.error('Session did not contain payment_paypal_id') + return redirect(eventreverse(request.event, 'presale:event.checkout', kwargs={'step': 'payment'})) + + if order: + return redirect(eventreverse(request.event, 'presale:event.order', kwargs={ + 'order': order.code, + 'secret': order.secret + }) + ('?paid=yes' if order.status == Order.STATUS_PAID else '')) + else: + return redirect(eventreverse(request.event, 'presale:event.checkout', kwargs={'step': 'confirm'})) -def abort(request, organizer=None, event=None): +@event_view(require_live=False) +def abort(request, *args, **kwargs): messages.error(request, _('It looks like you canceled the PayPal payment')) - try: - event = Event.objects.get(id=request.session['payment_paypal_event']) - return redirect(eventreverse(event, 'presale:event.checkout', kwargs={'step': 'payment'})) - except Event.DoesNotExist: - pass # TODO: Handle this + return redirect(eventreverse(request.event, 'presale:event.checkout', kwargs={'step': 'payment'}))