Merge branch 'guided_registration_2'

This commit is contained in:
Christopher Neugebauer 2016-04-01 16:57:38 +11:00
commit 28fbacbd28
3 changed files with 141 additions and 40 deletions

View file

@ -57,6 +57,11 @@ class BadgeAndProfile(models.Model):
except ObjectDoesNotExist: except ObjectDoesNotExist:
return None return None
def save(self):
if not self.name_per_invoice:
self.name_per_invoice = self.name
super(BadgeAndProfile, self).save()
attendee = models.OneToOneField(Attendee, on_delete=models.CASCADE) attendee = models.OneToOneField(Attendee, on_delete=models.CASCADE)
# Things that appear on badge # Things that appear on badge

View file

@ -49,3 +49,8 @@ def items_purchased(context):
quantity = pp.aggregate(Sum("quantity"))["quantity__sum"] quantity = pp.aggregate(Sum("quantity"))["quantity__sum"]
out.append(ProductAndQuantity(product, quantity)) out.append(ProductAndQuantity(product, quantity))
return out return out
@register.filter
def multiply(value, arg):
''' Multiplies value by arg '''
return value * arg

View file

@ -5,14 +5,31 @@ from registrasion.controllers.cart import CartController
from registrasion.controllers.invoice import InvoiceController from registrasion.controllers.invoice import InvoiceController
from registrasion.controllers.product import ProductController from registrasion.controllers.product import ProductController
from collections import namedtuple
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import transaction from django.db import transaction
from django.http import Http404
from django.shortcuts import redirect from django.shortcuts import redirect
from django.shortcuts import render from django.shortcuts import render
GuidedRegistrationSection = namedtuple(
"GuidedRegistrationSection",
(
"title",
"discounts",
"description",
"form",
)
)
GuidedRegistrationSection.__new__.__defaults__ = (
(None,) * len(GuidedRegistrationSection._fields)
)
@login_required @login_required
def guided_registration(request, page_id=0): def guided_registration(request, page_id=0):
''' Goes through the registration process in order, ''' Goes through the registration process in order,
@ -26,46 +43,118 @@ def guided_registration(request, page_id=0):
dashboard = redirect("dashboard") dashboard = redirect("dashboard")
next_step = redirect("guided_registration") next_step = redirect("guided_registration")
attendee = rego.Attendee.get_instance(request.user) sections = []
if attendee.completed_registration:
return dashboard
# Step 1: Fill in a badge attendee = rego.Attendee.get_instance(request.user)
if attendee.completed_registration:
return render(
request,
"registrasion/guided_registration_complete.html",
{},
)
# Step 1: Fill in a badge and collect a voucher code
profile = rego.BadgeAndProfile.get_instance(attendee) profile = rego.BadgeAndProfile.get_instance(attendee)
if profile is None: if profile is None:
ret = edit_profile(request) # TODO: if voucherform is invalid, make sure that profileform does not save
profile_new = rego.BadgeAndProfile.get_instance(attendee) voucher_form, voucher_handled = handle_voucher(request, "voucher")
if profile_new is None: profile_form, profile_handled = handle_profile(request, "profile")
# No new profile was created
return ret
else:
return next_step
# Step 2: Go through each of the categories in order voucher_section = GuidedRegistrationSection(
category = attendee.highest_complete_category title="Voucher Code",
form=voucher_form,
)
profile_section = GuidedRegistrationSection(
title="Profile and Personal Information",
form=profile_form,
)
title = "Attendee information"
current_step = 1
sections.append(voucher_section)
sections.append(profile_section)
else:
# We're selling products
last_category = attendee.highest_complete_category
# Get the next category # Get the next category
cats = rego.Category.objects cats = rego.Category.objects
cats = cats.filter(id__gt=category).order_by("order") cats = cats.filter(id__gt=last_category).order_by("order")
if len(cats) == 0: if cats.count() == 0:
# We've filled in every category # We've filled in every category
attendee.completed_registration = True attendee.completed_registration = True
attendee.save() attendee.save()
return dashboard
ret = product_category(request, cats[0].id)
attendee_new = rego.Attendee.get_instance(request.user)
if attendee_new.highest_complete_category == category:
# We've not yet completed this category
return ret
else:
return next_step return next_step
if last_category == 0:
# Only display the first Category
title = "Select ticket type"
current_step = 2
cats = [cats[0]]
else:
# Set title appropriately for remaining categories
current_step = 3
title = "Additional items"
for category in cats:
products = ProductController.available_products(
request.user,
category=category,
)
prefix = "category_" + str(category.id)
p = handle_products(request, category, products, prefix)
products_form, discounts, products_handled = p
section = GuidedRegistrationSection(
title=category.name,
description=category.description,
discounts=discounts,
form=products_form,
)
sections.append(section)
if request.method == "POST" and not products_form.errors:
if category.id > attendee.highest_complete_category:
# This is only saved if we pass each form with no errors.
attendee.highest_complete_category = category.id
if sections and request.method == "POST":
for section in sections:
if section.form.errors:
break
else:
attendee.save()
# We've successfully processed everything
return next_step
data = {
"current_step": current_step,
"sections": sections,
"title" : title,
"total_steps": 3,
}
return render(request, "registrasion/guided_registration.html", data)
@login_required @login_required
def edit_profile(request): def edit_profile(request):
form, handled = handle_profile(request, "profile")
data = {
"form": form,
}
return render(request, "registrasion/profile_form.html", data)
def handle_profile(request, prefix):
''' Returns a profile form instance, and a boolean which is true if the
form was handled. '''
attendee = rego.Attendee.get_instance(request.user) attendee = rego.Attendee.get_instance(request.user)
try: try:
@ -73,17 +162,21 @@ def edit_profile(request):
except ObjectDoesNotExist: except ObjectDoesNotExist:
profile = None profile = None
form = forms.ProfileForm(request.POST or None, instance=profile) # TODO: pull down the speaker's real name from the Speaker profile
form = forms.ProfileForm(
request.POST or None,
instance=profile,
prefix=prefix
)
handled = True if request.POST else False
if request.POST and form.is_valid(): if request.POST and form.is_valid():
form.instance.attendee = attendee form.instance.attendee = attendee
form.save() form.save()
data = { return form, handled
"form": form,
}
return render(request, "registrasion/profile_form.html", data)
@login_required @login_required
def product_category(request, category_id): def product_category(request, category_id):
@ -112,11 +205,6 @@ def product_category(request, category_id):
if request.POST and not voucher_handled and not products_form.errors: if request.POST and not voucher_handled and not products_form.errors:
# Only return to the dashboard if we didn't add a voucher code # Only return to the dashboard if we didn't add a voucher code
# and if there's no errors in the products form # and if there's no errors in the products form
attendee = rego.Attendee.get_instance(request.user)
if category_id > attendee.highest_complete_category:
attendee.highest_complete_category = category_id
attendee.save()
return redirect("dashboard") return redirect("dashboard")
data = { data = {
@ -248,6 +336,10 @@ def invoice(request, invoice_id):
invoice_id = int(invoice_id) invoice_id = int(invoice_id)
inv = rego.Invoice.objects.get(pk=invoice_id) inv = rego.Invoice.objects.get(pk=invoice_id)
if request.user != inv.cart.user and not request.user.is_staff:
raise Http404()
current_invoice = InvoiceController(inv) current_invoice = InvoiceController(inv)
data = { data = {
@ -263,11 +355,10 @@ def pay_invoice(request, invoice_id):
WORK IN PROGRESS FUNCTION. Must be replaced with real payment workflow. WORK IN PROGRESS FUNCTION. Must be replaced with real payment workflow.
''' '''
invoice_id = int(invoice_id) invoice_id = int(invoice_id)
inv = rego.Invoice.objects.get(pk=invoice_id) inv = rego.Invoice.objects.get(pk=invoice_id)
current_invoice = InvoiceController(inv) current_invoice = InvoiceController(inv)
if not inv.paid and current_invoice.is_valid(): if not current_invoice.invoice.paid and not current_invoice.invoice.void:
current_invoice.pay("Demo invoice payment", inv.value) current_invoice.pay("Demo invoice payment", inv.value)
return redirect("invoice", current_invoice.invoice.id) return redirect("invoice", current_invoice.invoice.id)