wagtail-longclaw/longclaw/longclawcheckout/views.py

81 wiersze
3.0 KiB
Python

from django.shortcuts import render, get_object_or_404
from django.views.generic import TemplateView
from django.views.decorators.http import require_GET
from django.http import HttpResponseRedirect
try:
from django.urls import reverse
except ImportError:
from django.core.urlresolvers import reverse
from longclaw.longclawshipping.forms import AddressForm
from longclaw.longclawcheckout.forms import CheckoutForm
from longclaw.longclawcheckout.utils import create_order
from longclaw.longclawbasket.utils import get_basket_items
from longclaw.longclaworders.models import Order
@require_GET
def checkout_success(request, pk):
order = get_object_or_404(Order, id=pk)
return render(request, "longclawcheckout/success.html", {'order': order})
class CheckoutView(TemplateView):
template_name = "longclawcheckout/checkout.html"
checkout_form = CheckoutForm
shipping_address_form = AddressForm
billing_address_form = AddressForm
def get_context_data(self, **kwargs):
context = super(CheckoutView, self).get_context_data(**kwargs)
items, _ = get_basket_items(self.request)
total_price = sum(item.total() for item in items)
site = getattr(self.request, 'site', None)
context['checkout_form'] = self.checkout_form(
self.request.POST or None)
context['shipping_form'] = self.shipping_address_form(
self.request.POST or None,
prefix='shipping',
site=site)
context['billing_form'] = self.billing_address_form(
self.request.POST or None,
prefix='billing',
site=site)
context['basket'] = items
context['total_price'] = total_price
return context
def post(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
checkout_form = context['checkout_form']
shipping_form = context['shipping_form']
all_ok = checkout_form.is_valid() and shipping_form.is_valid()
if all_ok:
email = checkout_form.cleaned_data['email']
shipping_option = checkout_form.cleaned_data.get(
'shipping_option', None)
shipping_address = shipping_form.save()
if checkout_form.cleaned_data['different_billing_address']:
billing_form = context['billing_form']
all_ok = billing_form.is_valid()
if all_ok:
billing_address = billing_form.save()
else:
billing_address = shipping_address
if all_ok:
order = create_order(
email,
request,
shipping_address=shipping_address,
billing_address=billing_address,
shipping_option=shipping_option,
capture_payment=True
)
return HttpResponseRedirect(reverse(
'longclaw_checkout_success',
kwargs={'pk': order.id}))
return super(CheckoutView, self).render_to_response(context)