Re-writes the guided registration to individually track completed categories, and keep the form page the same until every category is finished. Resolves #14

This commit is contained in:
Christopher Neugebauer 2016-04-08 17:32:06 +10:00
parent a12460e351
commit 01b9adbaf4
4 changed files with 63 additions and 17 deletions

View file

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-08 07:31
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('registrasion', '0016_auto_20160408_0234'),
]
operations = [
migrations.RemoveField(
model_name='attendee',
name='highest_complete_category',
),
migrations.AddField(
model_name='attendee',
name='guided_categories_complete',
field=models.ManyToManyField(to='registrasion.Category'),
),
]

View file

@ -49,7 +49,7 @@ class Attendee(models.Model):
db_index=True, db_index=True,
) )
completed_registration = models.BooleanField(default=False) completed_registration = models.BooleanField(default=False)
highest_complete_category = models.IntegerField(default=0) guided_categories_complete = models.ManyToManyField("category")
class AttendeeProfileBase(models.Model): class AttendeeProfileBase(models.Model):

View file

@ -30,7 +30,13 @@ def items_pending(context):
all_items = rego.ProductItem.objects.filter( all_items = rego.ProductItem.objects.filter(
cart__user=context.request.user, cart__user=context.request.user,
cart__active=True, cart__active=True,
).select_related("product", "product__category") ).select_related(
"product",
"product__category",
).order_by(
"product__category__order",
"product__order",
)
return all_items return all_items

View file

@ -52,6 +52,7 @@ def guided_registration(request, page_id=0):
through each category one by one through each category one by one
''' '''
SESSION_KEY = "guided_registration_categories"
next_step = redirect("guided_registration") next_step = redirect("guided_registration")
sections = [] sections = []
@ -94,19 +95,23 @@ def guided_registration(request, page_id=0):
else: else:
# We're selling products # We're selling products
last_category = attendee.highest_complete_category starting = attendee.guided_categories_complete.count() == 0
# Get the next category # Get the next category
cats = rego.Category.objects cats = rego.Category.objects
cats = cats.filter(id__gt=last_category).order_by("order") if SESSION_KEY in request.session:
_cats = request.session[SESSION_KEY]
cats = cats.filter(id__in=_cats)
else:
cats = cats.exclude(
id__in=attendee.guided_categories_complete.all(),
)
if cats.count() == 0: cats = cats.order_by("order")
# We've filled in every category
attendee.completed_registration = True
attendee.save()
return next_step
if last_category == 0: request.session[SESSION_KEY] = []
if starting:
# Only display the first Category # Only display the first Category
title = "Select ticket type" title = "Select ticket type"
current_step = 2 current_step = 2
@ -125,6 +130,12 @@ def guided_registration(request, page_id=0):
products=all_products, products=all_products,
)) ))
if len(available_products) == 0:
# We've filled in every category
attendee.completed_registration = True
attendee.save()
return next_step
for category in cats: for category in cats:
products = [ products = [
i for i in available_products i for i in available_products
@ -141,14 +152,17 @@ def guided_registration(request, page_id=0):
discounts=discounts, discounts=discounts,
form=products_form, form=products_form,
) )
if products: if products:
# This product category does not exist for this user # This product category has items to show.
sections.append(section) sections.append(section)
# Add this to the list of things to show if the form errors.
request.session[SESSION_KEY].append(category.id)
if request.method == "POST" and not products_form.errors: 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,
# This is only saved if we pass each form with no errors. # and if the form actually has products.
attendee.highest_complete_category = category.id attendee.guided_categories_complete.add(category)
if sections and request.method == "POST": if sections and request.method == "POST":
for section in sections: for section in sections:
@ -156,6 +170,8 @@ def guided_registration(request, page_id=0):
break break
else: else:
attendee.save() attendee.save()
if SESSION_KEY in request.session:
del request.session[SESSION_KEY]
# We've successfully processed everything # We've successfully processed everything
return next_step return next_step