diff --git a/.github/workflows/migrations-checker.yml b/.github/workflows/migrations-checker.yml index 13d6fcb..1060358 100644 --- a/.github/workflows/migrations-checker.yml +++ b/.github/workflows/migrations-checker.yml @@ -34,4 +34,4 @@ jobs: python -m pip install -r requirements - name: Apply Migrations run: | - POSTGRES_HOST=localhost python manage.py migrate_schemas \ No newline at end of file + POSTGRES_HOST=localhost python manage.py migrate_schemas diff --git a/apps/checkout/applicator.py b/apps/checkout/applicator.py index 6257d3e..a9ae00f 100644 --- a/apps/checkout/applicator.py +++ b/apps/checkout/applicator.py @@ -10,7 +10,7 @@ def __init__(self, request=None, context=None): super().__init__(request=request, context=context) def get_payment_method(self): - return self.request.POST.get('payment_method') + return self.request.POST.get('payment_method') or self.request.session.get('selected_payment_method') def get_surcharges(self, basket, **kwargs): from apps.payment.models import PaymentMethod diff --git a/apps/checkout/views.py b/apps/checkout/views.py index 84109f0..5e73cf1 100644 --- a/apps/checkout/views.py +++ b/apps/checkout/views.py @@ -23,11 +23,35 @@ class PaymentDetailsView(PaymentDetailsView): def get_context_data(self, **kwargs): ctx = super(PaymentDetailsView, self).get_context_data(**kwargs) + payment_method = self.get_payment_method(self.request) + payment_method_object = PaymentMethod.objects.get(pk=payment_method) if payment_method else None + + stripe_token = self.is_stripe_payment(self.request) + paypal_object_str = self.is_paypal_payment(self.request) + + basket_surcharges = SurchargeApplicator(request=self.request).get_surcharges(basket=self.request.basket) + + ctx.update(dict(basket_surcharges=basket_surcharges)) + + ctx.update(dict( + payment_method=payment_method_object, + stripe_token=stripe_token, + paypal_object_str=paypal_object_str + )) return ctx def get_payment_method(self, request): - return request.POST.get('payment_method') + return request.POST.get('payment_method') or request.session.get('selected_payment_method') + + def set_selected_payment_method(self, request, payment_method): + request.session['selected_payment_method'] = payment_method + + def set_paypal_object(self, request, paypal_object_str): + request.session['paypal_object_str'] = paypal_object_str + + def set_stripe_token(self, request, stripe_token): + request.session['stripe_token'] = stripe_token def handle_payment(self, order_number, total, **kwargs): payment_method = PaymentMethod.objects.get(pk=self.get_payment_method(request=self.request)) @@ -49,36 +73,47 @@ def handle_payment(self, order_number, total, **kwargs): self.add_payment_source(source) def handle_payment_details_submission(self, request): + self.clean_session(request) return self.render_preview(request) def is_stripe_payment(self, request): - return request.POST.get('stripe_token', False) + return request.POST.get('stripe_token', False) or request.session.get('stripe_token', False) def is_paypal_payment(self, request): - return request.POST.get('paypal_transaction_detail_object', False) + return request.POST.get('paypal_transaction_detail_object', False) or request.session.get('paypal_object_str', + False) def render_preview(self, request, **kwargs): stripe_token = self.is_stripe_payment(request) - payment_method = self.get_payment_method(request) + self.set_stripe_token(request, stripe_token) + paypal_object_str = self.is_paypal_payment(request) - try: - payment_method_object = PaymentMethod.objects.get(pk=payment_method) - basket_surcharges = SurchargeApplicator(request=request).get_surcharges(basket=request.basket) + self.set_paypal_object(request, paypal_object_str) + + payment_method = self.get_payment_method(request) + self.set_selected_payment_method(request, payment_method) - kwargs.update(dict(payment_method=payment_method_object, stripe_token=stripe_token, - paypal_object_str=paypal_object_str, basket_surcharges=basket_surcharges)) - except ValueError as e: - messages.error( - self.request, - _("Please select payment gateway " - "back to the checkout process")) - logger.error(e) return super(PaymentDetailsView, self).render_preview(request, **kwargs) + def clean_session(self, request): + try: + del request.session['selected_payment_method'] + except KeyError: + pass + try: + del request.session['stripe_token'] + except KeyError: + pass + try: + del request.session['paypal_object_str'] + except KeyError: + pass def handle_place_order_submission(self, request): response = super(PaymentDetailsView, self).handle_place_order_submission(request) payment_method = PaymentMethod.objects.get(pk=self.get_payment_method(request=self.request)) + self.clean_session(request) + module = importlib.import_module( 'primzel.payment_gateways.gateway.{gateway}.client'.format(gateway=payment_method.payment_gateway.slug)) Client = getattr(module, 'Client') @@ -92,7 +127,7 @@ def handle_place_order_submission(self, request): return response def get_message_context(self, order, code=None): - site=get_current_site(self.request) + site = get_current_site(self.request) ctx = { 'user': self.request.user, 'order': order,