Source code for shuup.front.views.payment

# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
from __future__ import unicode_literals, with_statement

from django.core.exceptions import ImproperlyConfigured
from django.shortcuts import get_object_or_404, redirect
from django.views.generic import DetailView

from shuup.core.models import Order, PaymentUrls
from shuup.utils.django_compat import reverse


[docs]def get_payment_urls(request, order): """ :type request: django.http.HttpRequest """ kwargs = dict(pk=order.pk, key=order.key) def absolute_url_for(name): return request.build_absolute_uri(reverse(name, kwargs=kwargs)) return PaymentUrls( payment_url=absolute_url_for("shuup:order_process_payment"), return_url=absolute_url_for("shuup:order_process_payment_return"), cancel_url=absolute_url_for("shuup:order_payment_canceled"), )
[docs]class ProcessPaymentView(DetailView): model = Order context_object_name = "order"
[docs] def get_object(self, queryset=None): return get_object_or_404(self.model, pk=self.kwargs["pk"], key=self.kwargs["key"])
[docs] def get_context_data(self, **kwargs): context = super(ProcessPaymentView, self).get_context_data(**kwargs) context["payment_urls"] = get_payment_urls(self.request, self.object) return context
[docs] def dispatch(self, request, *args, **kwargs): mode = self.kwargs["mode"] order = self.object = self.get_object() payment_method = order.payment_method if order.payment_method_id else None if mode == "payment": if not order.is_paid(): if payment_method: return payment_method.get_payment_process_response( order=order, urls=get_payment_urls(request, order) ) elif mode == "return": if payment_method: payment_method.process_payment_return_request(order=order, request=request) elif mode == "cancel": self.template_name = "shuup/front/order/payment_canceled.jinja" return self.render_to_response(self.get_context_data(object=order)) else: raise ImproperlyConfigured("Error! Unknown ProcessPaymentView mode: `%s`." % mode) return redirect("shuup:order_complete", pk=order.pk, key=order.key)