Source code for shuup.front.views.checkout

# -*- 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 django.shortcuts import redirect
from django.views.generic import View
from six.moves import urllib

from shuup.front.checkout import CheckoutProcess, VerticalCheckoutProcess
from shuup.utils.django_compat import reverse
from shuup.utils.importing import cached_load

__all__ = ["BaseCheckoutView"]


[docs]class BaseCheckoutView(View): url_namespace = "shuup:checkout" phase_specs = [] empty_phase_spec = None initial_phase = None process_class = CheckoutProcess
[docs] def dispatch(self, request, *args, **kwargs): if request.basket.is_empty and self.empty_phase_spec: self.phase_specs = [self.empty_phase_spec] phase_identifier = "empty" else: phase_identifier = kwargs.get("phase", self.initial_phase) process = self.process_class( phase_specs=self.phase_specs, phase_kwargs=dict(request=request, args=args, kwargs=kwargs), view=self ) request.basket = process.basket if phase_identifier == "reset": process.reset() return redirect(self.get_url()) current_phase = process.prepare_current_phase(phase_identifier) if not current_phase.final and current_phase.identifier != phase_identifier: url = current_phase.get_url() params = ("?" + urllib.parse.urlencode(request.GET)) if request.GET else "" return redirect(url + params) return current_phase.dispatch(request, *args, **kwargs)
[docs] def get_url(self, **kwargs): """ Get URL for given kwargs within the checkout process in this view. This can be overriden in a subclass to customize the URLs. :rtype: str """ return reverse(self.url_namespace, kwargs=kwargs)
[docs] def get_phase_url(self, phase): """ Get URL for the given phase in the checkout process of this view. :type phase: shuup.front.checkout.CheckoutPhaseViewMixin :rtype: str """ return self.get_url(phase=phase.identifier)
class DefaultCheckoutView(BaseCheckoutView): phase_specs = [ "shuup.front.checkout.addresses:AddressesPhase", "shuup.front.checkout.methods:MethodsPhase", "shuup.front.checkout.methods:ShippingMethodPhase", "shuup.front.checkout.methods:PaymentMethodPhase", "shuup.front.checkout.confirm:ConfirmPhase", ] empty_phase_spec = "shuup.front.checkout.empty:EmptyPhase" class SinglePageCheckoutView(DefaultCheckoutView): initial_phase = "addresses" process_class = VerticalCheckoutProcess class CheckoutViewWithLoginAndRegister(BaseCheckoutView): phase_specs = [ "shuup.front.checkout.checkout_method:CheckoutMethodPhase", "shuup.front.checkout.checkout_method:RegisterPhase", "shuup.front.checkout.addresses:AddressesPhase", "shuup.front.checkout.methods:MethodsPhase", "shuup.front.checkout.methods:ShippingMethodPhase", "shuup.front.checkout.methods:PaymentMethodPhase", "shuup.front.checkout.confirm:ConfirmPhase", ] empty_phase_spec = "shuup.front.checkout.empty:EmptyPhase" def get_checkout_view(): view = cached_load("SHUUP_CHECKOUT_VIEW_SPEC") if hasattr(view, "as_view"): # pragma: no branch view = view.as_view() return view