99 lines
3.8 KiB
Python
99 lines
3.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import unicode_literals
|
|
import datetime
|
|
from django.db import models
|
|
from django.utils import timezone
|
|
from django.utils.encoding import python_2_unicode_compatible
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from dav_base.validators import DAVNumberValidator
|
|
|
|
midnight = datetime.time(00, 00, 00)
|
|
|
|
|
|
@python_2_unicode_compatible
|
|
class Participant(models.Model):
|
|
event = models.ForeignKey('Event', related_name='participants')
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
position = models.IntegerField(verbose_name='Listennummer')
|
|
|
|
personal_names = models.CharField(max_length=1024,
|
|
verbose_name=_('Vorname(n)'))
|
|
family_names = models.CharField(max_length=1024,
|
|
verbose_name=_('Familienname'))
|
|
address = models.CharField(max_length=1024,
|
|
verbose_name=_('Anschrift'),
|
|
help_text=_('Straße, Hausnummer'))
|
|
postal_code = models.CharField(max_length=254,
|
|
verbose_name=_('Postleitzahl'))
|
|
city = models.CharField(max_length=1024,
|
|
verbose_name=_('Ort'))
|
|
email_address = models.EmailField(verbose_name=_('E-Mail-Adresse'))
|
|
phone_number = models.CharField(max_length=254,
|
|
verbose_name=_('Telefonnummer'))
|
|
dav_number = models.CharField(max_length=62,
|
|
validators=[DAVNumberValidator],
|
|
verbose_name=_('DAV Mitgliedsnummer'))
|
|
emergency_contact = models.TextField(blank=True,
|
|
verbose_name=_('Notfall-Kontakt'),
|
|
help_text=_('Kann frei gelassen werden.'))
|
|
experience = models.TextField(blank=True,
|
|
verbose_name=_('Erfahrung'),
|
|
help_text=_('Kann frei gelassen werden.'))
|
|
note = models.TextField(blank=True,
|
|
verbose_name=_('Anmerkung'),
|
|
help_text=_('Kann frei gelassen werden.'))
|
|
|
|
paid = models.BooleanField('Teilnehmerbeitrag bezahlt', default=False)
|
|
|
|
purge_at = models.DateTimeField()
|
|
|
|
class Meta:
|
|
unique_together = (('event', 'position'), )
|
|
verbose_name = _('Teilnehmer')
|
|
verbose_name_plural = _('Teilnehmer')
|
|
ordering = ['event', 'position']
|
|
|
|
def __str__(self):
|
|
return '{eventnumber} - {position}. {name}'.format(
|
|
eventnumber=self.event.get_number(),
|
|
position=self.position,
|
|
name=self.get_full_name(),
|
|
)
|
|
|
|
def get_full_name(self):
|
|
return '{} {}'.format(self.personal_names, self.family_names)
|
|
|
|
def save(self, **kwargs):
|
|
if not self.purge_at and self.event:
|
|
self.purge_at = self.__class__.calc_purge_at(self.event)
|
|
|
|
super(Participant, self).save(**kwargs)
|
|
|
|
@staticmethod
|
|
def calc_purge_at(event):
|
|
if event.alt_last_day:
|
|
last_day = event.alt_last_day
|
|
elif event.last_day:
|
|
last_day = event.last_day
|
|
elif event.alt_first_day:
|
|
last_day = event.alt_first_day
|
|
else:
|
|
last_day = event.first_day
|
|
|
|
april = datetime.date(last_day.year, 4, 1)
|
|
july = datetime.date(last_day.year, 7, 1)
|
|
july_nextyear = datetime.date(last_day.year + 1, 7, 1)
|
|
october = datetime.date(last_day.year, 10, 1)
|
|
january_nextyear = datetime.date(last_day.year + 1, 1, 1)
|
|
|
|
if last_day < april:
|
|
purge_date = july
|
|
elif last_day < october:
|
|
purge_date = january_nextyear
|
|
else:
|
|
purge_date = july_nextyear
|
|
|
|
return timezone.make_aware(datetime.datetime.combine(purge_date, midnight))
|