Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Change delivery/payment queues into CheckoutApp attributes
  • Loading branch information
paluh committed Jan 22, 2012
1 parent 6b83217 commit fa6d4ea
Show file tree
Hide file tree
Showing 15 changed files with 107 additions and 137 deletions.
@@ -1,7 +1,6 @@
{% extends 'satchless/checkout/base.html' %}
{% load i18n %}
{% load form_display %}
{% load order_tags %}
{% block title %}{{ block.super }} | {% trans "Delivery details" %}{% endblock %}

{% block body-class %}{{ block.super }} delivery-details{% endblock %}
Expand All @@ -26,8 +25,8 @@
<div class="container">
<h1>{% trans "Delivery details" %}</h1>
<form method="post" action="">{% csrf_token %}
{% for group, typ, form in delivery_group_forms %}
<h2>{% trans "Delivery method" %}: {{ typ|delivery_type }}</h2>
{% for group, delivery_type, form in delivery_group_forms %}
<h2>{% trans "Delivery method" %}: {{ delivery_type.name }}</h2>
<h3>{% trans "Items deliverd using this method" %}:</h3>
<ul>
{% include 'satchless/checkout/snippets/delivery_group.html' %}
Expand Down
10 changes: 9 additions & 1 deletion satchless/checkout/app.py
@@ -1,4 +1,5 @@
from django.conf.urls.defaults import patterns, url
from django.conf import settings
from django.shortcuts import get_object_or_404, redirect
from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator
Expand All @@ -21,6 +22,13 @@ class CheckoutApp(SatchlessApp):
]

def __init__(self, *args, **kwargs):
delivery_providers = kwargs.pop('delivery_providers',
getattr(settings, 'SATCHLESS_DELIVERY_PROVIDERS', []))
self.delivery_queue = handler.DeliveryQueue(*delivery_providers)

payment_providers = kwargs.pop('payment_providers',
getattr(settings, 'SATCHLESS_PAYMENT_PROVIDERS', []))
self.payment_queue = handler.PaymentQueue(*payment_providers)
super(CheckoutApp, self).__init__(*args, **kwargs)
assert self.Order, ('You need to subclass CheckoutApp and provide Order')
assert self.Cart, ('You need to subclass CheckoutApp and provide Cart')
Expand Down Expand Up @@ -96,7 +104,7 @@ def confirmation(self, request, order_token):
order_pre_confirm.send(sender=self.Order, instance=order,
request=request)
try:
handler.payment_queue.confirm(order=order)
self.payment_queue.confirm(order=order)
except ConfirmationFormNeeded, e:
return TemplateResponse(request, self.confirmation_templates, {
'formdata': e,
Expand Down
70 changes: 31 additions & 39 deletions satchless/contrib/checkout/multistep/app.py
Expand Up @@ -5,7 +5,6 @@

from ....checkout import app
from ....order import forms
from ....order import handler

class MultiStepCheckoutApp(app.CheckoutApp):
checkout_templates = [
Expand Down Expand Up @@ -45,6 +44,7 @@ def __init__(self, *args, **kwargs):
self.DeliveryMethodFormSet = (
self.DeliveryMethodFormSet or
modelformset_factory(self.DeliveryMethodForm._meta.model,
formset=forms.DeliveryMethodFormSet,
form=self.DeliveryMethodForm,
extra=0))

Expand All @@ -59,19 +59,18 @@ def checkout(self, request, order_token):
return self.redirect_order(order)
billing_form = self.BillingForm(data=request.POST or None,
instance=order)
groups = order.groups.all()
delivery_groups = order.groups.all()
shipping_formset = self.ShippingFormSet(data=request.POST or None,
queryset=groups)
queryset=delivery_groups)
if all([billing_form.is_valid(),
shipping_formset.is_valid()]):
order = billing_form.save()
shipping_formset.save()
return self.redirect('delivery-method', order_token=order.token)
return TemplateResponse(request, self.checkout_templates, {
'billing_form': billing_form,
'shipping_formset': shipping_formset,
'order': order,
})
context = self.get_context_data(request, billing_form=billing_form,
shipping_formset=shipping_formset,
order=order)
return TemplateResponse(request, self.checkout_templates, context)

def delivery_method(self, request, order_token):
"""
Expand All @@ -83,40 +82,35 @@ def delivery_method(self, request, order_token):
return self.redirect_order(order)
delivery_groups = order.groups.all()
delivery_method_formset = self.DeliveryMethodFormSet(data=request.POST or None,
queryset=delivery_groups)
queryset=delivery_groups,
delivery_queue=self.delivery_queue)
if delivery_method_formset.is_valid():
delivery_method_formset.save()
return self.redirect('payment-method', order_token=order.token)
return TemplateResponse(request, self.delivery_method_templates, {
'delivery_method_formset': delivery_method_formset,
'order': order,
})
context = self.get_context_data(request, order=order,
delivery_method_formset=delivery_method_formset)
return TemplateResponse(request, self.delivery_method_templates, context)

def delivery_details(self, request, order_token):
"""
Checkout step 2½
User supplies further delivery details if needed.
"""
order = self.get_order(request, order_token)
groups = order.groups.all()
if not all([group.delivery_type for group in groups]):
delivery_groups = order.groups.all()
if not all([group.delivery_type for group in delivery_groups]):
return self.redirect('delivery-method', order_token=order.token)
delivery_group_forms = []
for group in groups:
delivery_type = group.delivery_type
form = handler.delivery_queue.get_configuration_form(group,
request.POST or None)
delivery_group_forms.append((group, delivery_type, form))
delivery_forms = [form for group, typ, form in delivery_group_forms]
delivery_group_forms = self.delivery_queue.get_configuration_forms_for_groups(
delivery_groups, request.POST or None)
delivery_forms = [form for group, delivery_type, form in delivery_group_forms]
if all(form.is_valid() if form else True
for form in delivery_forms):
for group, typ, form in delivery_group_forms:
handler.delivery_queue.save(group, form)
for group, delivery_type, form in delivery_group_forms:
self.delivery_queue.save(group, form)
return self.redirect('payment-method', order_token=order.token)
return TemplateResponse(request, self.delivery_details_templates, {
'delivery_group_forms': delivery_group_forms,
'order': order,
})
context = self.get_context_data(request, order=order,
delivery_group_forms=delivery_group_forms)
return TemplateResponse(request, self.delivery_details_templates, context)

def payment_method(self, request, order_token):
"""
Expand All @@ -127,15 +121,15 @@ def payment_method(self, request, order_token):
if not order or order.status != 'checkout':
return self.redirect_order(order)
payment_form = forms.PaymentMethodForm(data=request.POST or None,
instance=order)
instance=order,
payment_queue=self.payment_queue)
if request.method == 'POST':
if payment_form.is_valid():
payment_form.save()
return self.redirect('payment-details', order_token=order.token)
return TemplateResponse(request, self.payment_method_templates, {
'order': order,
'payment_form': payment_form,
})
context = self.get_context_data(request, order=order,
payment_form=payment_form)
return TemplateResponse(request, self.payment_method_templates, context)

def payment_details(self, request, order_token):
"""
Expand All @@ -148,19 +142,17 @@ def payment_details(self, request, order_token):
return self.redirect_order(order)
if not order.payment_type:
return self.redirect('payment-method', order_token=order.token)
form = forms.get_payment_details_form(order, request.POST)
form = self.payment_queue.get_configuration_form(order, request.POST)
def proceed(order, form):
handler.payment_queue.save(order, form=form)
self.payment_queue.save(order, form=form)
order.set_status('payment-pending')
return self.redirect('confirmation', order_token=order.token)
if form:
if request.method == 'POST':
if form.is_valid():
return proceed(order, form)
return TemplateResponse(request, self.payment_details_templates, {
'form': form,
'order': order,
})
context = self.get_context_data(request, form=form, order=order)
return TemplateResponse(request, self.payment_details_templates, context)
return proceed(order, form)

def get_urls(self):
Expand Down
@@ -1,6 +1,5 @@
{% extends 'satchless/order/base.html' %}
{% load i18n %}
{% load order_tags %}
{% block title %}{{ block.super }} | {% trans "Delivery details" %}{% endblock %}
{% block breadcrumbs %}
{{ block.super }}
Expand All @@ -9,8 +8,8 @@
{% block content %}
<h1>{% trans "Delivery details" %}</h1>
<form method="post" action="">{% csrf_token %}
{% for group, typ, form in delivery_group_forms %}
<h2>{% trans "Delivery method" %}: {{ typ|delivery_type }}</h2>
{% for group, delivery_type, form in delivery_group_forms %}
<h2>{% trans "Delivery method" %}: {{ delivery_type.name }}</h2>
<h3>{% trans "Items deliverd using this method" %}:</h3>
<ul>
{% include 'satchless/checkout/snippets/delivery_group.html' %}
Expand All @@ -20,4 +19,4 @@ <h3>{% trans "Delivery details" %}:</h3>
{% endfor %}
<button type="submit">{% trans "Proceed" %}</button>
</form>
{% endblock %}
{% endblock %}
28 changes: 13 additions & 15 deletions satchless/contrib/checkout/multistep/tests/__init__.py
Expand Up @@ -53,8 +53,10 @@ class TestCheckoutApp(app.MultiStepCheckoutApp):
fields=order_forms.DeliveryMethodForm._meta.fields)



class CheckoutTest(BaseCheckoutAppTests):
checkout_app = TestCheckoutApp()
checkout_app = TestCheckoutApp(delivery_providers=[TestDeliveryProvider],
payment_providers=[TestPaymentProviderWithConfirmation])
urls = BaseCheckoutAppTests.MockUrls(checkout_app=checkout_app)

def setUp(self):
Expand Down Expand Up @@ -91,20 +93,16 @@ def setUp(self):
'django.template.loaders.filesystem.Loader',
)
}
delivery_provider = TestDeliveryProvider()
TestDeliveryType.objects.create(price=10, typ='pidgin', name='Pidgin')
TestDeliveryType.objects.create(price=15, typ='courier', name='Courier',
with_customer_notes=True)

self.original_settings = self._setup_settings(self.custom_settings)
order_handler.delivery_queue = order_handler.DeliveryQueue(delivery_provider)
order_handler.payment_queue = order_handler.PaymentQueue(
TestPaymentProviderWithConfirmation)
self.anon_client = Client()

order_handler.partitioner_queue = order_handler.PartitionerQueue(
'satchless.contrib.order.partitioner.simple.SimplePhysicalPartitioner')

self.anon_client = Client()

PostShippingType.objects.create(price=12, typ='polecony',
name='list polecony')
PostShippingType.objects.create(price=20, typ='list',
Expand Down Expand Up @@ -223,14 +221,14 @@ def test_delivery_method_view(self):
order = self._create_order(self.anon_client)
group = order.groups.get()
self.assertTrue(group.require_shipping_address)
dtypes = list(order_handler.delivery_queue.enum_types(group))
dtypes = list(self.checkout_app.delivery_queue.enum_types(group))
dtype = dtypes[0].typ
response = self._test_status(
self.checkout_app.reverse('delivery-method',
kwargs={'order_token': order.token}),
client_instance=self.anon_client, status_code=200)
data = {}
df = response.context['delivery_formset']
df = response.context['delivery_method_formset']
data[df.add_prefix('INITIAL_FORMS')] = len(df.forms)
data[df.add_prefix('MAX_NUM_FORMS')] = ''
data[df.add_prefix('TOTAL_FORMS')] = len(df.forms)
Expand All @@ -251,7 +249,7 @@ def test_delivery_method_view(self):
def test_checkout_view(self):
order = self._create_order(self.anon_client)
group = order.groups.get()
dtypes = list(order_handler.delivery_queue.enum_types(group))
dtypes = list(self.checkout_app.delivery_queue.enum_types(group))
group.delivery_type = dtypes[0].typ
group.save()
response = self._test_status(
Expand Down Expand Up @@ -298,11 +296,11 @@ def test_checkout_view(self):
def test_payment_choice_view(self):
order = self._create_order(self.anon_client)
group = order.groups.get()
dtypes = list(order_handler.delivery_queue.enum_types(group))
dtypes = list(self.checkout_app.delivery_queue.enum_types(group))
group.delivery_type = dtypes[0].typ
group.save()

ptype = list(order_handler.payment_queue.enum_types(group))[0]
ptype = list(self.checkout_app.payment_queue.enum_types(group))[0]
self._test_GET_status(self.checkout_app.reverse('payment-method',
kwargs={'order_token':
order.token}),
Expand All @@ -325,15 +323,15 @@ def test_payment_choice_view(self):
def test_payment_details_view(self):
order = self._create_order(self.anon_client)
group = order.groups.get()
dtypes = list(order_handler.delivery_queue.enum_types(group))
dtypes = list(self.checkout_app.delivery_queue.enum_types(group))
group.delivery_type = dtypes[0].typ
group.save()

ptype = list(order_handler.payment_queue.enum_types(group))[0]
ptype = list(self.checkout_app.payment_queue.enum_types(group))[0]
order.payment_type = ptype.typ
order.save()

order_handler.payment_queue = order_handler.PaymentQueue(
self.checkout_app.payment_queue = order_handler.PaymentQueue(
TestPaymentProviderWithForm)

self._test_status(self.checkout_app.reverse('payment-details',
Expand Down
29 changes: 13 additions & 16 deletions satchless/contrib/checkout/singlestep/app.py
Expand Up @@ -2,7 +2,6 @@
from django.template.response import TemplateResponse

from ....checkout import app
from ....order import forms, handler

class SingleStepCheckoutApp(app.CheckoutApp):
BillingForm = None
Expand All @@ -26,44 +25,42 @@ def checkout(self, request, order_token):
return self.redirect_order(order)
delivery_groups = order.groups.all()
for group in delivery_groups:
delivery_types = list(handler.delivery_queue.enum_types(group))
delivery_types = list(self.delivery_queue.enum_types(group))
if len(delivery_types) != 1:
raise ImproperlyConfigured("The singlestep checkout requires "
"exactly one delivery type per group.")
group.delivery_type = delivery_types[0].typ
group.save()
delivery_group_forms = forms.get_delivery_details_forms_for_groups(delivery_groups,
request.POST)

delivery_group_forms = self.delivery_queue.get_configuration_forms_for_groups(
delivery_groups, request.POST or None)
delivery_valid = True
if request.method == 'POST':
delivery_valid = True
for group, typ, form in delivery_group_forms:
for group, delivery_type, form in delivery_group_forms:
if form:
delivery_valid = delivery_valid and form.is_valid()
payment_types = list(handler.payment_queue.enum_types(order))
payment_types = list(self.payment_queue.enum_types(order))
if len(payment_types) != 1:
raise ImproperlyConfigured("The singlestep checkout requires "
"exactly one payment methods.")
order.payment_type = payment_types[0].typ
order.save()
billing_form = self.BillingForm(request.POST or None,
instance=order)
payment_form = forms.get_payment_details_form(order, request.POST)
payment_form = self.payment_queue.get_configuration_form(order, request.POST)
if request.method == 'POST':
billing_valid = billing_form.is_valid()
payment_valid = payment_form.is_valid() if payment_form else True
if billing_valid and delivery_valid and payment_valid:
order = billing_form.save()
for group, typ, form in delivery_group_forms:
handler.delivery_queue.save(group, form)
handler.payment_queue.save(order, payment_form)
self.delivery_queue.save(group, form)
self.payment_queue.save(order, payment_form)
order.set_status('payment-pending')
return self.redirect('confirmation',
order_token=order.token)
return TemplateResponse(request, self.checkout_templates, {
'billing_form': billing_form,
'delivery_group_forms': delivery_group_forms,
'order': order,
'payment_form': payment_form,
})

context = self.get_context_data(request, billing_form=billing_form,
delivery_group_forms=delivery_group_forms,
order=order, payment_form=payment_form)
return TemplateResponse(request, self.checkout_templates, context)
@@ -1,6 +1,5 @@
{% extends 'satchless/order/base.html' %}
{% load i18n %}
{% load order_tags %}
{% block breadcrumbs %}
{{ block.super }}
<li><a href="">{% trans "Order (business)" %}</a></li>
Expand All @@ -11,8 +10,8 @@ <h1>{% trans "Order (business)" %}</h1>
<form method="post" action="">{% csrf_token %}
<h2>{% trans "Billing details" %}</h2>
{{ billing_form.as_p }}
{% for group, typ, form in delivery_group_forms %}
<h2>{% trans "Delivery method" %}: {{ typ|delivery_type }}</h2>
{% for group, delivery_type, form in delivery_group_forms %}
<h2>{% trans "Delivery method" %}: {{ delivery_type.name }}</h2>
<h3>{% trans "Items delivered using this method" %}:</h3>
<ul>
{% include 'satchless/checkout/snippets/delivery_group.html' %}
Expand Down

0 comments on commit fa6d4ea

Please sign in to comment.