# -*- coding: utf-8 -*- from __future__ import unicode_literals import datetime import logging import uuid from django.db import models from django.urls import reverse from django.utils import timezone from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from dav_events.models.event import Event from . import signals from .validators import DAVNumberValidator logger = logging.getLogger(__name__) midnight = datetime.time(00, 00, 00) one_day = datetime.timedelta(1) @python_2_unicode_compatible class Registration(models.Model): event = models.ForeignKey(Event, related_name='registrations') created_at = models.DateTimeField(auto_now_add=True) 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'), help_text=_('Idealerweise eine Mobilfunk-Nummer')) dav_number = models.CharField(max_length=62, validators=[DAVNumberValidator], verbose_name=_('DAV Mitgliednummer'), help_text='%s
%s %s' % ( _('Deine Mitgliedsnummer findest du unter dem Strichcode' ' auf deinem DAV Ausweis.'), _('Beispiel: 131/00/012345'), _('(der Teil bis zum ersten * genügt)'), )) emergency_contact = models.TextField(blank=True, verbose_name=_('Notfall-Kontakt'), help_text=_('Name und Telefonnummer bzw. Anschrift,' ' die in Notfällen informiert werden soll.')) experience = models.TextField(blank=True, verbose_name=_('Erfahrung'), help_text=_('Welche Touren oder Kurse hast du bereits gemacht?')) note = models.TextField(blank=True, verbose_name=_('Anmerkung'), help_text='%s
%s' % ( _('Wissenswertes für den Tourenleiter, z.B. Allergien,' ' gesundheitliche Einschränkungen, ...'), _('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')) purge_at = models.DateTimeField() class Meta: verbose_name = _('Anmeldung') verbose_name_plural = _('Anmeldungen') ordering = ['created_at'] def __str__(self): return '{number} - {name} ({created} - {purge})'.format(number=self.event.get_number(), name=self.get_full_name(), created=self.created_at.strftime('%d.%m.%Y %H:%M'), purge=self.purge_at.strftime('%d.%m.%Y %H:%M')) def get_absolute_url(self): return reverse('dav_registration:registered') def get_full_name(self): return '{} {}'.format(self.personal_names, self.family_names) def save(self, **kwargs): creating = False if not self.id: creating = True if self.event: self.purge_at = self.__class__.calc_purge_at(self.event) super(Registration, self).save(**kwargs) if creating: logger.info('Registration stored: %s', self) signals.registration_created.send(sender=self.__class__, registration=self) @classmethod def calc_purge_at(cls, 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 return timezone.make_aware(datetime.datetime.combine(last_day + one_day * 7, midnight))