Source code for shuup.front.views.checkout

# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2017, Shoop Commerce Ltd. 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.core.urlresolvers import reverse
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.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