135 lines
4.9 KiB
Python
135 lines
4.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import unicode_literals
|
|
import datetime
|
|
from django.core.exceptions import ValidationError
|
|
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_member = models.BooleanField(default=True,
|
|
verbose_name=_('DAV Mitglied'),
|
|
help_text=_('In Ausnahmefällen nehmen wir auch Nichtmitglieder mit.'))
|
|
dav_number = models.CharField(max_length=62,
|
|
blank=True, 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 get_info(self):
|
|
text = """{fullname}
|
|
{address}, {postal_code} {city}
|
|
|
|
DAV Mitglied: {dav_info}
|
|
|
|
Notfallkontakt:
|
|
{emergency_contact}
|
|
|
|
Anmerkung:
|
|
{note}
|
|
"""
|
|
if not self.dav_member:
|
|
dav_info = _('Nein')
|
|
else:
|
|
dav_info = self.dav_number
|
|
|
|
return text.format(
|
|
fullname=self.get_full_name(),
|
|
address=self.address,
|
|
postal_code=self.postal_code,
|
|
city=self.city,
|
|
dav_info=dav_info,
|
|
emergency_contact=self.emergency_contact,
|
|
note=self.note,
|
|
)
|
|
|
|
def clean(self):
|
|
if self.dav_member and not self.dav_number:
|
|
raise ValidationError({'dav_number': _('Bei DAV Mitgliedern brauchen wir die Mitgliedsnummer.')})
|
|
|
|
def save(self, **kwargs):
|
|
if not self.purge_at and self.event:
|
|
self.purge_at = self.__class__.calc_purge_at(self.event)
|
|
|
|
self.full_clean()
|
|
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))
|