From 01b9adbaf46e27eb24dea8d0c6629bde0dcaa02f Mon Sep 17 00:00:00 2001 From: Christopher Neugebauer Date: Fri, 8 Apr 2016 17:32:06 +1000 Subject: [PATCH 1/2] Re-writes the guided registration to individually track completed categories, and keep the form page the same until every category is finished. Resolves #14 --- .../migrations/0017_auto_20160408_0731.py | 24 ++++++++++ registrasion/models.py | 2 +- .../templatetags/registrasion_tags.py | 8 +++- registrasion/views.py | 46 +++++++++++++------ 4 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 registrasion/migrations/0017_auto_20160408_0731.py diff --git a/registrasion/migrations/0017_auto_20160408_0731.py b/registrasion/migrations/0017_auto_20160408_0731.py new file mode 100644 index 00000000..5bb8957c --- /dev/null +++ b/registrasion/migrations/0017_auto_20160408_0731.py @@ -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'), + ), + ] diff --git a/registrasion/models.py b/registrasion/models.py index 2719dd0e..a1c06ca8 100644 --- a/registrasion/models.py +++ b/registrasion/models.py @@ -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): diff --git a/registrasion/templatetags/registrasion_tags.py b/registrasion/templatetags/registrasion_tags.py index 17edc8e4..7d618171 100644 --- a/registrasion/templatetags/registrasion_tags.py +++ b/registrasion/templatetags/registrasion_tags.py @@ -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 diff --git a/registrasion/views.py b/registrasion/views.py index 251f0fba..155d1aed 100644 --- a/registrasion/views.py +++ b/registrasion/views.py @@ -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 - 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 products: + # 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: + # 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 From 97438624e1ca2bf76c5883d06fb4b7121a03bac4 Mon Sep 17 00:00:00 2001 From: Christopher Neugebauer Date: Fri, 8 Apr 2016 19:41:55 +1000 Subject: [PATCH 2/2] Makes the guided registration stay on the front page if an incorrect voucher is added but a valid profile is filled out. Resolves #9 --- registrasion/views.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/registrasion/views.py b/registrasion/views.py index 155d1aed..1b0fe646 100644 --- a/registrasion/views.py +++ b/registrasion/views.py @@ -53,6 +53,8 @@ def guided_registration(request, page_id=0): ''' SESSION_KEY = "guided_registration_categories" + ASK_FOR_PROFILE = 777 # Magic number. Meh. + next_step = redirect("guided_registration") sections = [] @@ -72,9 +74,19 @@ def guided_registration(request, page_id=0): except ObjectDoesNotExist: profile = None - if not profile: - # TODO: if voucherform is invalid, make sure - # that profileform does not save + # Figure out if we need to show the profile form and the voucher form + show_profile_and_voucher = False + if SESSION_KEY not in request.session: + if not profile: + show_profile_and_voucher = True + else: + if request.session[SESSION_KEY] == ASK_FOR_PROFILE: + show_profile_and_voucher = True + + if show_profile_and_voucher: + # Keep asking for the profile until everything passes. + request.session[SESSION_KEY] = ASK_FOR_PROFILE + voucher_form, voucher_handled = handle_voucher(request, "voucher") profile_form, profile_handled = handle_profile(request, "profile")