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..1b0fe646 100644 --- a/registrasion/views.py +++ b/registrasion/views.py @@ -52,6 +52,9 @@ def guided_registration(request, page_id=0): through each category one by one ''' + SESSION_KEY = "guided_registration_categories" + ASK_FOR_PROFILE = 777 # Magic number. Meh. + next_step = redirect("guided_registration") sections = [] @@ -71,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") @@ -94,19 +107,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 +142,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 +164,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 +182,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