From f608a07f83a17210ea58324ea27ff03a30bd7135 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Tue, 19 Oct 2010 15:28:35 +0200 Subject: [PATCH] tickets: Add an interface for processing payments. --- tickets/templates/tickets/payments.html | 49 +++++++++++++++++++ tickets/views.py | 62 +++++++++++++++++++++++++ urls.py | 1 + 3 files changed, 112 insertions(+) create mode 100644 tickets/templates/tickets/payments.html diff --git a/tickets/templates/tickets/payments.html b/tickets/templates/tickets/payments.html new file mode 100644 index 0000000..bf41e72 --- /dev/null +++ b/tickets/templates/tickets/payments.html @@ -0,0 +1,49 @@ +{% extends "tickets/base.html" %} + +{% block content %} +{% if confirmed %} +

Betalingen verwerkt

+{% else %} +

Betalingen verwerken

+{% endif %} + +{% if confirmed %} +Onderstaande reserveringen zijn als betaald gemarkeerd en bevestigingen +zijn verstuurd. +{% else %}{% if confirm %} +Druk op "Bevestigen" om de betalingen definitief te maken en een +bevestiging per email te versturen voor iedere onderstaande reservering. +{% else %} +Hieronder staat een lijst van alle onbetaalde reserveringen. Vink de +reserveringen aan waarvoor de betaling binnen is. Druk op "Verwerken" om +de betalingen te registreren. +{% endif %}{% endif %} + +{% if not confirmed %} +
+{% csrf_token %} +{{ form.as_p }} +{% endif %} +{% if confirm or confirmed %} + + + + + +
Aantal reserveringen:{{ bookings|length }}
Aantal kaarten:{{ numtickets }}
Totaalbedrag:€{{ amount|floatformat:2}}
+{% if confirmed %} +Meer betalingen verwerken +{% else %} + +
+{% endif %} +{% else %} + + +{% endif %} + +{% endblock %} diff --git a/tickets/views.py b/tickets/views.py index d37674b..f8ec3ba 100644 --- a/tickets/views.py +++ b/tickets/views.py @@ -1,5 +1,7 @@ # Create your views here. +import datetime + import django from django.shortcuts import render_to_response from django.template import RequestContext @@ -62,3 +64,63 @@ def book(request): return render_to_response('tickets/booked.html', {'booking' : booking}, context_instance=RequestContext(request)) return render_to_response('tickets/bookingform.html', {'form' : f}, context_instance=RequestContext(request)) + +# These two forms are used for entering payment details. They aren't +# very different, so it should really be possible to merge them (but +# initial attempts to add the confirm field dynamically or setting its +# value dynamically, didn't work out all too well, so leave it at this +# for now). +class PaymentForm(django.forms.Form): + bookings = django.forms.models.ModelMultipleChoiceField( + queryset=Booking.objects.filter(payment__isnull=True).order_by('pk'), + widget=django.forms.CheckboxSelectMultiple, + label="Reserveringen") + +class PaymentConfirmForm(django.forms.Form): + bookings = django.forms.models.ModelMultipleChoiceField( + queryset=Booking.objects.filter(payment__isnull=True).order_by('pk'), + widget=django.forms.MultipleHiddenInput, + label="Reserveringen") + # This field is used to distinguish these two forms + confirm = django.forms.BooleanField(initial=True, widget=django.forms.HiddenInput) + +def payments(request): + c = {} + bookings = None + if request.method != "POST": + # First step: Just show an empty form + f = PaymentForm() + elif not 'confirm' in request.POST: + # Second step: Process form and show a summary for confirmation + f = PaymentForm(request.POST) + if f.is_valid(): + bookings = f.cleaned_data['bookings'] + # Output a confirmation form + f = PaymentConfirmForm() + f.initial['bookings'] = bookings + c['confirm'] = True + else: + # Third step: Summary was confirmed, do the work + f = PaymentConfirmForm(request.POST) + if f.is_valid(): + bookings = f.cleaned_data['bookings'] + + # Do the work + for b in bookings: + b.payment = datetime.datetime.now() + b.save() + + # Don't show the form again + f = None + c['confirmed'] = True + + # Add the form to show + c['form'] = f + + # Add some data about the selected bookings + if bookings: + c['bookings'] = bookings + c['numtickets'] = sum([b.tickets for b in bookings]) + c['amount'] = sum([b.price for b in bookings]) + + return render_to_response('tickets/payments.html', c, context_instance=RequestContext(request)) diff --git a/urls.py b/urls.py index c40951e..0eef5e4 100644 --- a/urls.py +++ b/urls.py @@ -5,6 +5,7 @@ admin.autodiscover() urlpatterns = patterns('', (r'^$', 'dorestad-bookings.tickets.views.book'), + url(r'^betalingen/$', 'dorestad-bookings.tickets.views.payments', name='payments'), # Example: # (r'^dorestad1493/', include('dorestad1493.foo.urls')), -- 2.30.2