95 lines
2.9 KiB
Python
95 lines
2.9 KiB
Python
from registrasion import util
|
|
|
|
from django.contrib.auth.models import User
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
from django.db import models
|
|
from django.utils.encoding import python_2_unicode_compatible
|
|
from model_utils.managers import InheritanceManager
|
|
|
|
|
|
# User models
|
|
|
|
@python_2_unicode_compatible
|
|
class Attendee(models.Model):
|
|
''' Miscellaneous user-related data. '''
|
|
|
|
class Meta:
|
|
app_label = "registrasion"
|
|
|
|
def __str__(self):
|
|
return "%s" % self.user
|
|
|
|
@staticmethod
|
|
def get_instance(user):
|
|
''' Returns the instance of attendee for the given user, or creates
|
|
a new one. '''
|
|
try:
|
|
return Attendee.objects.get(user=user)
|
|
except ObjectDoesNotExist:
|
|
return Attendee.objects.create(user=user)
|
|
|
|
def save(self, *a, **k):
|
|
while not self.access_code:
|
|
access_code = util.generate_access_code()
|
|
if Attendee.objects.filter(access_code=access_code).count() == 0:
|
|
self.access_code = access_code
|
|
return super(Attendee, self).save(*a, **k)
|
|
|
|
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
|
# Badge/profile is linked
|
|
access_code = models.CharField(
|
|
max_length=6,
|
|
unique=True,
|
|
db_index=True,
|
|
)
|
|
completed_registration = models.BooleanField(default=False)
|
|
guided_categories_complete = models.ManyToManyField("category")
|
|
|
|
|
|
class AttendeeProfileBase(models.Model):
|
|
''' Information for an attendee's badge and related preferences.
|
|
Subclass this in your Django site to ask for attendee information in your
|
|
registration progess.
|
|
'''
|
|
|
|
class Meta:
|
|
app_label = "registrasion"
|
|
|
|
objects = InheritanceManager()
|
|
|
|
@classmethod
|
|
def name_field(cls):
|
|
'''
|
|
Returns:
|
|
The name of a field that stores the attendee's name. This is used
|
|
to pre-fill the attendee's name from their Speaker profile, if they
|
|
have one.
|
|
'''
|
|
return None
|
|
|
|
def attendee_name(self):
|
|
if type(self) == AttendeeProfileBase:
|
|
real = AttendeeProfileBase.objects.get_subclass(id=self.id)
|
|
else:
|
|
real = self
|
|
return getattr(real, real.name_field())
|
|
|
|
def invoice_recipient(self):
|
|
'''
|
|
|
|
Returns:
|
|
A representation of this attendee profile for the purpose
|
|
of rendering to an invoice. This should include any information
|
|
that you'd usually include on an invoice. Override in subclasses.
|
|
'''
|
|
|
|
# Manual dispatch to subclass. Fleh.
|
|
slf = AttendeeProfileBase.objects.get_subclass(id=self.id)
|
|
# Actually compare the functions.
|
|
if type(slf).invoice_recipient != type(self).invoice_recipient:
|
|
return type(slf).invoice_recipient(slf)
|
|
|
|
# Return a default
|
|
return slf.attendee.user.username
|
|
|
|
attendee = models.OneToOneField(Attendee, on_delete=models.CASCADE)
|