Amends Registrasion user profile
This commit is contained in:
parent
41ba224759
commit
ca6edb8706
4 changed files with 191 additions and 49 deletions
|
@ -7,7 +7,3 @@ from django.utils.translation import ugettext_lazy as _
|
||||||
class UserProfileAdmin(admin.ModelAdmin):
|
class UserProfileAdmin(admin.ModelAdmin):
|
||||||
model = models.AttendeeProfile
|
model = models.AttendeeProfile
|
||||||
list_display = ("name", "company", "name_per_invoice")
|
list_display = ("name", "company", "name_per_invoice")
|
||||||
|
|
||||||
@admin.register(models.DynamicValues)
|
|
||||||
class DynamicValuesAdmin(admin.ModelAdmin):
|
|
||||||
pass
|
|
||||||
|
|
103
pinaxcon/registrasion/migrations/0003_auto_20171002_1719.py
Normal file
103
pinaxcon/registrasion/migrations/0003_auto_20171002_1719.py
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.11.5 on 2017-10-03 00:19
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django_countries.fields
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('pinaxcon_registrasion', '0002_auto_20161005_1823'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='db_defined_values',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='dietary_requirements',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='free_text_1',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='free_text_2',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='of_legal_age',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='address_line_1',
|
||||||
|
field=models.CharField(blank=True, help_text=b'This address, if provided, will appear on your receipt.', max_length=1024, verbose_name=b'Address line 1'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='address_line_2',
|
||||||
|
field=models.CharField(blank=True, max_length=1024, verbose_name=b'Address line 2'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='address_postcode',
|
||||||
|
field=models.CharField(blank=True, max_length=1024, verbose_name=b'Postal/Zip code'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='address_suburb',
|
||||||
|
field=models.CharField(blank=True, max_length=1024, verbose_name=b'City/Town/Suburb'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='country',
|
||||||
|
field=django_countries.fields.CountryField(default=b'US', max_length=2),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='dietary_restrictions',
|
||||||
|
field=models.CharField(blank=True, max_length=256, verbose_name=b'Food allergies, intolerances, or dietary restrictions'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='newsletter',
|
||||||
|
field=models.BooleanField(default=False, help_text=b'Select to be subscribed to the low-volume North Bay Python announcements newsletter', verbose_name=b'Subscribe to North Bay Python newsletter'),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='state',
|
||||||
|
field=models.CharField(blank=True, max_length=256, verbose_name=b'State/Territory/Province'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='accessibility_requirements',
|
||||||
|
field=models.CharField(blank=True, max_length=256, verbose_name=b'Accessibility-related requirements'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='company',
|
||||||
|
field=models.CharField(blank=True, help_text=b"The name of your company, as you'd like it on your badge and receipt", max_length=64),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='gender',
|
||||||
|
field=models.CharField(blank=True, help_text=b'Gender data will only be used for demographic purposes.', max_length=64),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='attendeeprofile',
|
||||||
|
name='name_per_invoice',
|
||||||
|
field=models.CharField(blank=True, help_text=b"If your legal name is different to the name on your badge, fill this in, and we'll put it on your receipt. Otherwise, leave it blank.", max_length=256, verbose_name=b'Your legal name (for your receipt)'),
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='DemoPayment',
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='DynamicValues',
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,18 +1,9 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.encoding import python_2_unicode_compatible
|
from django.utils.encoding import python_2_unicode_compatible
|
||||||
|
from django_countries.fields import CountryField
|
||||||
from registrasion import models as rego
|
from registrasion import models as rego
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
|
||||||
class DynamicValues(models.Model):
|
|
||||||
|
|
||||||
name = models.CharField(max_length=64)
|
|
||||||
value = models.IntegerField()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return "%s - %d" % (self.name, self.value)
|
|
||||||
|
|
||||||
|
|
||||||
class AttendeeProfile(rego.AttendeeProfileBase):
|
class AttendeeProfile(rego.AttendeeProfileBase):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -22,11 +13,49 @@ class AttendeeProfile(rego.AttendeeProfileBase):
|
||||||
return "name"
|
return "name"
|
||||||
|
|
||||||
def invoice_recipient(self):
|
def invoice_recipient(self):
|
||||||
|
|
||||||
|
lines = [
|
||||||
|
self.name_per_invoice,
|
||||||
|
]
|
||||||
|
|
||||||
if self.company:
|
if self.company:
|
||||||
base = "\n%(company)s\nAttention: %(name_per_invoice)s"
|
lines.append("C/- " + self.company)
|
||||||
else:
|
|
||||||
base = "%(name_per_invoice)s"
|
if self.address_line_1:
|
||||||
return base % self.__dict__
|
lines.append(self.address_line_1)
|
||||||
|
|
||||||
|
if self.address_line_2:
|
||||||
|
lines.append(self.address_line_2)
|
||||||
|
|
||||||
|
if self.address_suburb or self.address_postcode:
|
||||||
|
lines.append("%s %s" % (
|
||||||
|
self.address_suburb or "",
|
||||||
|
self.address_postcode or "",
|
||||||
|
))
|
||||||
|
|
||||||
|
if self.state:
|
||||||
|
lines.append(self.state)
|
||||||
|
|
||||||
|
if self.country:
|
||||||
|
lines.append(self.country.name)
|
||||||
|
|
||||||
|
return "\n".join(unicode(line) for line in lines)
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
errors = []
|
||||||
|
if self.country == "US" and not self.state:
|
||||||
|
errors.append(
|
||||||
|
("state", "US-based attendees must list their state"),
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.address_line_2 and not self.address_line_1:
|
||||||
|
errors.append((
|
||||||
|
"address_line_1",
|
||||||
|
"Please fill in line 1 before filling line 2",
|
||||||
|
))
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
raise ValidationError(dict(errors))
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
if not self.name_per_invoice:
|
if not self.name_per_invoice:
|
||||||
|
@ -42,56 +71,68 @@ class AttendeeProfile(rego.AttendeeProfileBase):
|
||||||
|
|
||||||
company = models.CharField(
|
company = models.CharField(
|
||||||
max_length=64,
|
max_length=64,
|
||||||
help_text="The name of your company, as you'd like it on your badge",
|
help_text="The name of your company, as you'd like it on your badge and receipt",
|
||||||
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,
|
blank=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Other important Information
|
|
||||||
name_per_invoice = models.CharField(
|
name_per_invoice = models.CharField(
|
||||||
verbose_name="Your legal name (for invoicing purposes)",
|
verbose_name="Your legal name (for your receipt)",
|
||||||
max_length=64,
|
max_length=256,
|
||||||
help_text="If your legal name is different to the name on your badge, "
|
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, "
|
"fill this in, and we'll put it on your receipt. Otherwise, "
|
||||||
"leave it blank.",
|
"leave it blank.",
|
||||||
blank=True,
|
blank=True,
|
||||||
)
|
)
|
||||||
of_legal_age = models.BooleanField(
|
|
||||||
default=False,
|
address_line_1 = models.CharField(
|
||||||
verbose_name="18+?",
|
verbose_name="Address line 1",
|
||||||
|
help_text="This address, if provided, will appear on your receipt.",
|
||||||
|
max_length=1024,
|
||||||
blank=True,
|
blank=True,
|
||||||
)
|
)
|
||||||
dietary_requirements = models.CharField(
|
address_line_2 = models.CharField(
|
||||||
|
verbose_name="Address line 2",
|
||||||
|
max_length=1024,
|
||||||
|
blank=True,
|
||||||
|
)
|
||||||
|
address_suburb = models.CharField(
|
||||||
|
verbose_name="City/Town/Suburb",
|
||||||
|
max_length=1024,
|
||||||
|
blank=True,
|
||||||
|
)
|
||||||
|
address_postcode = models.CharField(
|
||||||
|
verbose_name="Postal/Zip code",
|
||||||
|
max_length=1024,
|
||||||
|
blank=True,
|
||||||
|
)
|
||||||
|
country = CountryField(
|
||||||
|
default="US",
|
||||||
|
)
|
||||||
|
state = models.CharField(
|
||||||
|
max_length=256,
|
||||||
|
verbose_name="State/Territory/Province",
|
||||||
|
blank=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
dietary_restrictions = models.CharField(
|
||||||
|
verbose_name="Food allergies, intolerances, or dietary restrictions",
|
||||||
max_length=256,
|
max_length=256,
|
||||||
blank=True,
|
blank=True,
|
||||||
)
|
)
|
||||||
accessibility_requirements = models.CharField(
|
accessibility_requirements = models.CharField(
|
||||||
|
verbose_name="Accessibility-related requirements",
|
||||||
max_length=256,
|
max_length=256,
|
||||||
blank=True,
|
blank=True,
|
||||||
)
|
)
|
||||||
gender = models.CharField(
|
gender = models.CharField(
|
||||||
|
help_text="Gender data will only be used for demographic purposes.",
|
||||||
max_length=64,
|
max_length=64,
|
||||||
blank=True,
|
blank=True,
|
||||||
)
|
)
|
||||||
db_defined_values = models.ManyToManyField(
|
|
||||||
DynamicValues
|
newsletter = models.BooleanField(
|
||||||
|
verbose_name="Subscribe to North Bay Python newsletter",
|
||||||
|
help_text="Select to be subscribed to the low-volume North Bay Python "
|
||||||
|
"announcements newsletter",
|
||||||
|
blank=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class DemoPayment(rego.PaymentBase):
|
|
||||||
''' A subclass of PaymentBase for use in our demo payments function. '''
|
|
||||||
|
|
||||||
pass # No custom features here, but yours could be here.
|
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% include "registrasion/dashboard_widget.html" %}
|
||||||
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
|
|
Loading…
Reference in a new issue