From dcad2d5f7cb2e58c65c3b747f7ebb631acd32a15 Mon Sep 17 00:00:00 2001 From: Christopher Neugebauer Date: Thu, 24 Mar 2016 13:43:06 +1100 Subject: [PATCH] Second pass at guided registration, including profile page --- registrasion/models.py | 10 +++++++ registrasion/views.py | 60 ++++++++++++++++++++++++++---------------- 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/registrasion/models.py b/registrasion/models.py index 2cb9ad63..55d7ee4a 100644 --- a/registrasion/models.py +++ b/registrasion/models.py @@ -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 diff --git a/registrasion/views.py b/registrasion/views.py index 5099e701..da32364e 100644 --- a/registrasion/views.py +++ b/registrasion/views.py @@ -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