Files
django-dav-events/dav_events/models/participant.py
Jens Kleineheismann d7e2acff34 Replaced ugettext and ugettext_lazy with gettext and gettext_lazy
ugettext and ugettext_lazy were deprecated in Django 3 and will be
removed in Django 4.
2025-04-10 11:33:06 +02:00

176 lines
6.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.translation import gettext_lazy as _
from dav_base.validators import DAVNumberValidator
midnight = datetime.time(00, 00, 00)
class AbstractParticipant(models.Model):
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'))
year_of_birth = models.IntegerField(verbose_name=_('Geburtsjahr'),
help_text=_('Vierstellige Jahreszahl'))
apply_reduced_fee = models.BooleanField(default=False,
verbose_name=_('Antrag auf reduzierte Teilnahmegebühr'),
help_text=_('Für Jugendliche und Junioren'
' (bis zum vollendeten 25. Lebensjahr),'
' sowie Mitglieder mit geringen finanziellen Mitteln'
' (Nachweis durch "Karlsruher Pass"),'
' wird die Teilnahmegebühr auf 50% ermäßigt.'))
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.'))
privacy_policy = models.TextField(blank=True,
verbose_name=_('Erklärung zur Datenspeicherung'))
privacy_policy_accepted = models.BooleanField(default=False,
verbose_name=_('Einwilligung zur Datenspeicherung'))
paid = models.BooleanField('Teilnehmerbeitrag bezahlt', default=False)
purge_at = models.DateTimeField()
def approx_age(self):
now = datetime.datetime.now()
year_now = now.year
return year_now - self.year_of_birth
class Meta:
abstract = True
def __str__(self):
return 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}
Jahrgang: {year_of_birth} (ungefähres Alter: {approx_age})
Antrag auf reduzierte Teilnehmergebühr: {apply_reduced_fee_yesno}
Notfallkontakt:
{emergency_contact}
Anmerkung:
{note}
"""
if not self.dav_member:
dav_info = _('Nein')
else:
dav_info = self.dav_number
if self.apply_reduced_fee:
apply_reduced_fee_yesno = _('Ja')
else:
apply_reduced_fee_yesno = _('Nein')
return text.format(
fullname=self.get_full_name(),
address=self.address,
postal_code=self.postal_code,
city=self.city,
dav_info=dav_info,
year_of_birth=self.year_of_birth,
approx_age=self.approx_age(),
apply_reduced_fee_yesno=apply_reduced_fee_yesno,
emergency_contact=self.emergency_contact,
note=self.note,
)
def get_data_dict(self):
data = {}
for field in self._meta.fields:
if not field.primary_key:
data[field.name] = getattr(self, field.name)
return data
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(AbstractParticipant, 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))
class Participant(AbstractParticipant):
event = models.ForeignKey('Event', related_name='participants', on_delete=models.PROTECT)
created_at = models.DateTimeField(auto_now_add=True)
position = models.IntegerField(verbose_name='Listennummer')
class Meta:
verbose_name = _('Teilnehmer')
verbose_name_plural = _('Teilnehmer')
unique_together = (('event', 'position'), )
ordering = ['event', 'position']
def __str__(self):
return '{eventnumber} - {position}. {name}'.format(
eventnumber=self.event.get_number(),
position=self.position,
name=self.get_full_name(),
)