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,
)
completed_registration = models.BooleanField(default=False)
highest_complete_category = models.IntegerField(default=0)
guided_categories_complete = models.ManyToManyField("category")
class AttendeeProfileBase(models.Model):

View file

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

View file

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