X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=tickets%2Fviews.py;h=4eca48d94739342c8a0e87e5cc33931aa936152d;hb=97514165a01d41917c6eae9c0d43f6766296712e;hp=f0cdfa4be9d00616584d08ce01404dff4e9529e8;hpb=b0dc7832eac85f62c17de630b0dd5b3817db74ff;p=matthijs%2Fprojects%2Fdorestad-bookings.git diff --git a/tickets/views.py b/tickets/views.py index f0cdfa4..4eca48d 100644 --- a/tickets/views.py +++ b/tickets/views.py @@ -1,21 +1,25 @@ # Create your views here. +import datetime + import django from django.shortcuts import render_to_response from django.template import RequestContext +from django.contrib.auth.decorators import permission_required -from models import Booking +from models import Booking, TICKET_PRICE, SHOW_CHOICES class BookingForm(django.forms.ModelForm): class Meta: model=Booking + exclude=['payment'] -def confirm_booking(booking): +def confirm_booking(booking, template): from django.core.mail import EmailMessage context = {'booking' : booking} - rendered = django.template.loader.render_to_string('tickets/booked.eml', context) + rendered = django.template.loader.render_to_string(template, context) (headers, body) = rendered.strip().split('\n\n', 1) # Turn the headers into a dict so EmailMessage can turn them into a @@ -57,7 +61,81 @@ def book(request): if f.is_valid(): booking = f.save() - confirm_booking(booking) + confirm_booking(booking, 'tickets/booked.eml') 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)) + return render_to_response('tickets/bookingform.html', {'form' : f, 'price' : TICKET_PRICE}, 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) + +@permission_required('tickets.change_booking') +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() + confirm_booking(b, 'tickets/payed.eml') + + # 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)) + +@permission_required('tickets.change_booking') +def bookings(request): + shows = {} + for (show, show_desc) in SHOW_CHOICES: + shows[show_desc] = { + 'bookings' : Booking.objects.filter(show=show), + 'payed' : Booking.objects.filter(show=show, payment__isnull=False), + } + + c = { 'shows' : shows } + return render_to_response('tickets/bookings.html', c, context_instance=RequestContext(request))