Second pass at guided registration, including profile page

This commit is contained in:
Christopher Neugebauer 2016-03-24 13:43:06 +11:00
parent 05923a9a8f
commit dcad2d5f7c
2 changed files with 48 additions and 22 deletions

View file

@ -3,6 +3,7 @@ from __future__ import unicode_literals
import datetime
from django.core.exceptions import ValidationError
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.models import User
from django.db import models
from django.db.models import F, Q
@ -46,6 +47,15 @@ class BadgeAndProfile(models.Model):
def __str__(self):
return "Badge for: %s of %s" % (self.name, self.company)
@staticmethod
def get_instance(attendee):
''' Returns either None, or the instance that belongs
to this attendee. '''
try:
return BadgeAndProfile.objects.get(attendee=attendee)
except ObjectDoesNotExist:
return None
attendee = models.OneToOneField(Attendee, on_delete=models.CASCADE)
# Things that appear on badge

View file

@ -18,25 +18,45 @@ def guided_registration(request, page_id=0):
making sure user sees all valid categories.
WORK IN PROGRESS: the finalised version of this view will allow
grouping of categories into a specific page. Currently, page_id simply
refers to the category_id. Future versions will have pages containing
categories.
grouping of categories into a specific page. Currently, it just goes
through each category one by one
'''
page_id = int(page_id)
if page_id != 0:
ret = product_category_inner(request, page_id)
if ret is not True:
dashboard = redirect("dashboard")
next_step = redirect("guided_registration")
# Step 1: Fill in a badge
attendee = rego.Attendee.get_instance(request.user)
profile = rego.BadgeAndProfile.get_instance(attendee)
if profile is None:
ret = edit_profile(request)
profile_new = rego.BadgeAndProfile.get_instance(attendee)
if profile_new is None:
# No new profile was created
return ret
else:
return next_step
# Go to next page in the guided registration
# Step 2: Go through each of the categories in order
category = attendee.highest_complete_category
# Get the next category
cats = rego.Category.objects
cats = cats.filter(id__gt=page_id).order_by("order")
cats = cats.filter(id__gt=category).order_by("order")
if len(cats) > 0:
return redirect("guided_registration", cats[0].id)
if len(cats) == 0:
# We've filled in every category
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 redirect("dashboard")
return next_step
@login_required
def edit_profile(request):
@ -60,16 +80,7 @@ def edit_profile(request):
@login_required
def product_category(request, category_id):
ret = product_category_inner(request, category_id)
if ret is not True:
return ret
else:
return redirect("dashboard")
def product_category_inner(request, category_id):
''' Registration selections form for a specific category of items.
It returns a rendered template if this page needs to display stuff,
otherwise it returns True.
'''
PRODUCTS_FORM_PREFIX = "products"
@ -81,6 +92,8 @@ def product_category_inner(request, category_id):
CategoryForm = forms.CategoryForm(category)
attendee = rego.Attendee.get_instance(request.user)
products = rego.Product.objects.filter(category=category)
products = products.order_by("order")
@ -101,7 +114,10 @@ def product_category_inner(request, category_id):
elif cat_form.is_valid():
try:
handle_valid_cat_form(cat_form, current_cart)
return True
if category_id > attendee.highest_complete_category:
attendee.highest_complete_category = category_id
attendee.save()
return redirect("dashboard")
except ValidationError as ve:
pass