Merge branch 'pluggable_profile'
This commit is contained in:
		
						commit
						a65b7935a9
					
				
					 4 changed files with 73 additions and 85 deletions
				
			
		|  | @ -132,14 +132,6 @@ def ProductsForm(category, products): | ||||||
|     return ProductsForm |     return ProductsForm | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ProfileForm(forms.ModelForm): |  | ||||||
|     ''' A form for requesting badge and profile information. ''' |  | ||||||
| 
 |  | ||||||
|     class Meta: |  | ||||||
|         model = rego.BadgeAndProfile |  | ||||||
|         exclude = ['attendee'] |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class VoucherForm(forms.Form): | class VoucherForm(forms.Form): | ||||||
|     voucher = forms.CharField( |     voucher = forms.CharField( | ||||||
|         label="Voucher code", |         label="Voucher code", | ||||||
|  |  | ||||||
							
								
								
									
										30
									
								
								registrasion/migrations/0011_auto_20160401_0943.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								registrasion/migrations/0011_auto_20160401_0943.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # Generated by Django 1.9.2 on 2016-04-01 09:43 | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | from django.db import migrations, models | ||||||
|  | import django.db.models.deletion | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         ('registrasion', '0010_auto_20160330_2342'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.CreateModel( | ||||||
|  |             name='AttendeeProfileBase', | ||||||
|  |             fields=[ | ||||||
|  |                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||||||
|  |                 ('attendee', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='registrasion.Attendee')), | ||||||
|  |             ], | ||||||
|  |         ), | ||||||
|  |         migrations.RemoveField( | ||||||
|  |             model_name='badgeandprofile', | ||||||
|  |             name='attendee', | ||||||
|  |         ), | ||||||
|  |         migrations.DeleteModel( | ||||||
|  |             name='BadgeAndProfile', | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
|  | @ -41,82 +41,20 @@ class Attendee(models.Model): | ||||||
|     highest_complete_category = models.IntegerField(default=0) |     highest_complete_category = models.IntegerField(default=0) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @python_2_unicode_compatible | class AttendeeProfileBase(models.Model): | ||||||
| class BadgeAndProfile(models.Model): |     ''' Information for an attendee's badge and related preferences. | ||||||
|     ''' Information for an attendee's badge and related preferences ''' |     Subclass this in your Django site to ask for attendee information in your | ||||||
|  |     registration progess. | ||||||
|  |      ''' | ||||||
| 
 | 
 | ||||||
|     def __str__(self): |     @classmethod | ||||||
|         return "Badge for: %s of %s" % (self.name, self.company) |     def name_field(cls): | ||||||
| 
 |         ''' This is used to pre-fill the attendee's name from the | ||||||
|     @staticmethod |         speaker profile. If it's None, that functionality is disabled. ''' | ||||||
|     def get_instance(attendee): |         return None | ||||||
|         ''' Returns either None, or the instance that belongs |  | ||||||
|         to this attendee. ''' |  | ||||||
|         try: |  | ||||||
|             return BadgeAndProfile.objects.get(attendee=attendee) |  | ||||||
|         except ObjectDoesNotExist: |  | ||||||
|             return None |  | ||||||
| 
 |  | ||||||
|     def save(self): |  | ||||||
|         if not self.name_per_invoice: |  | ||||||
|             self.name_per_invoice = self.name |  | ||||||
|         super(BadgeAndProfile, self).save() |  | ||||||
| 
 | 
 | ||||||
|     attendee = models.OneToOneField(Attendee, on_delete=models.CASCADE) |     attendee = models.OneToOneField(Attendee, on_delete=models.CASCADE) | ||||||
| 
 | 
 | ||||||
|     # Things that appear on badge |  | ||||||
|     name = models.CharField( |  | ||||||
|         verbose_name="Your name (for your conference nametag)", |  | ||||||
|         max_length=64, |  | ||||||
|         help_text="Your name, as you'd like it to appear on your badge. ", |  | ||||||
|     ) |  | ||||||
|     company = models.CharField( |  | ||||||
|         max_length=64, |  | ||||||
|         help_text="The name of your company, as you'd like it on your badge", |  | ||||||
|         blank=True, |  | ||||||
|     ) |  | ||||||
|     free_text_1 = models.CharField( |  | ||||||
|         max_length=64, |  | ||||||
|         verbose_name="Free text line 1", |  | ||||||
|         help_text="A line of free text that will appear on your badge. Use " |  | ||||||
|                   "this for your Twitter handle, IRC nick, your preferred " |  | ||||||
|                   "pronouns or anything else you'd like people to see on " |  | ||||||
|                   "your badge.", |  | ||||||
|         blank=True, |  | ||||||
|     ) |  | ||||||
|     free_text_2 = models.CharField( |  | ||||||
|         max_length=64, |  | ||||||
|         verbose_name="Free text line 2", |  | ||||||
|         blank=True, |  | ||||||
|     ) |  | ||||||
| 
 |  | ||||||
|     # Other important Information |  | ||||||
|     name_per_invoice = models.CharField( |  | ||||||
|         verbose_name="Your legal name (for invoicing purposes)", |  | ||||||
|         max_length=64, |  | ||||||
|         help_text="If your legal name is different to the name on your badge, " |  | ||||||
|                   "fill this in, and we'll put it on your invoice. Otherwise, " |  | ||||||
|                   "leave it blank.", |  | ||||||
|         blank=True, |  | ||||||
|         ) |  | ||||||
|     of_legal_age = models.BooleanField( |  | ||||||
|         default=False, |  | ||||||
|         verbose_name="18+?", |  | ||||||
|         blank=True, |  | ||||||
|     ) |  | ||||||
|     dietary_requirements = models.CharField( |  | ||||||
|         max_length=256, |  | ||||||
|         blank=True, |  | ||||||
|     ) |  | ||||||
|     accessibility_requirements = models.CharField( |  | ||||||
|         max_length=256, |  | ||||||
|         blank=True, |  | ||||||
|     ) |  | ||||||
|     gender = models.CharField( |  | ||||||
|         max_length=64, |  | ||||||
|         blank=True, |  | ||||||
|     ) |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| # Inventory Models | # Inventory Models | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,3 +1,6 @@ | ||||||
|  | import symposion.speakers | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
| from registrasion import forms | from registrasion import forms | ||||||
| from registrasion import models as rego | from registrasion import models as rego | ||||||
| from registrasion.controllers import discount | from registrasion.controllers import discount | ||||||
|  | @ -7,6 +10,7 @@ from registrasion.controllers.product import ProductController | ||||||
| 
 | 
 | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
| 
 | 
 | ||||||
|  | from django.conf import settings | ||||||
| from django.contrib.auth.decorators import login_required | from django.contrib.auth.decorators import login_required | ||||||
| from django.contrib import messages | from django.contrib import messages | ||||||
| from django.core.exceptions import ObjectDoesNotExist | from django.core.exceptions import ObjectDoesNotExist | ||||||
|  | @ -30,6 +34,12 @@ GuidedRegistrationSection.__new__.__defaults__ = ( | ||||||
|     (None,) * len(GuidedRegistrationSection._fields) |     (None,) * len(GuidedRegistrationSection._fields) | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | def get_form(name): | ||||||
|  |     dot = name.rindex(".") | ||||||
|  |     mod_name, form_name = name[:dot], name[dot + 1:] | ||||||
|  |     __import__(mod_name) | ||||||
|  |     return getattr(sys.modules[mod_name], form_name) | ||||||
|  | 
 | ||||||
| @login_required | @login_required | ||||||
| def guided_registration(request, page_id=0): | def guided_registration(request, page_id=0): | ||||||
|     ''' Goes through the registration process in order, |     ''' Goes through the registration process in order, | ||||||
|  | @ -55,9 +65,12 @@ def guided_registration(request, page_id=0): | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|     # Step 1: Fill in a badge and collect a voucher code |     # Step 1: Fill in a badge and collect a voucher code | ||||||
|     profile = rego.BadgeAndProfile.get_instance(attendee) |     try: | ||||||
|  |         profile = attendee.attendeeprofilebase | ||||||
|  |     except ObjectDoesNotExist: | ||||||
|  |         profile = None | ||||||
| 
 | 
 | ||||||
|     if profile is None: |     if not profile: | ||||||
|         # TODO: if voucherform is invalid, make sure that profileform does not save |         # TODO: if voucherform is invalid, make sure that profileform does not save | ||||||
|         voucher_form, voucher_handled = handle_voucher(request, "voucher") |         voucher_form, voucher_handled = handle_voucher(request, "voucher") | ||||||
|         profile_form, profile_handled = handle_profile(request, "profile") |         profile_form, profile_handled = handle_profile(request, "profile") | ||||||
|  | @ -158,14 +171,29 @@ def handle_profile(request, prefix): | ||||||
|     attendee = rego.Attendee.get_instance(request.user) |     attendee = rego.Attendee.get_instance(request.user) | ||||||
| 
 | 
 | ||||||
|     try: |     try: | ||||||
|         profile = rego.BadgeAndProfile.objects.get(attendee=attendee) |         profile = attendee.attendeeprofilebase | ||||||
|     except ObjectDoesNotExist: |     except ObjectDoesNotExist: | ||||||
|         profile = None |         profile = None | ||||||
| 
 | 
 | ||||||
|     # TODO: pull down the speaker's real name from the Speaker profile |     ProfileForm = get_form(settings.ATTENDEE_PROFILE_FORM) | ||||||
| 
 | 
 | ||||||
|     form = forms.ProfileForm( |     # Load a pre-entered name from the speaker's profile, | ||||||
|  |     # if they have one. | ||||||
|  |     try: | ||||||
|  |         speaker_profile = request.user.speaker_profile | ||||||
|  |         speaker_name = speaker_profile.name | ||||||
|  |     except ObjectDoesNotExist: | ||||||
|  |         speaker_name = None | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     name_field = ProfileForm.Meta.model.name_field() | ||||||
|  |     initial = {} | ||||||
|  |     if name_field is not None: | ||||||
|  |         initial[name_field] = speaker_name | ||||||
|  | 
 | ||||||
|  |     form = ProfileForm( | ||||||
|         request.POST or None, |         request.POST or None, | ||||||
|  |         initial=initial, | ||||||
|         instance=profile, |         instance=profile, | ||||||
|         prefix=prefix |         prefix=prefix | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Christopher Neugebauer
						Christopher Neugebauer