+
{% bootstrap_field form.dav_number %}
+
+ {% bootstrap_field form.dav_member %}
+
{% bootstrap_field form.emergency_contact %}
diff --git a/dav_event_office/templates/dav_event_office/participant_list.html b/dav_event_office/templates/dav_event_office/participant_list.html
index 02fc370..f747551 100644
--- a/dav_event_office/templates/dav_event_office/participant_list.html
+++ b/dav_event_office/templates/dav_event_office/participant_list.html
@@ -55,7 +55,11 @@
{{ participant.personal_names }}
- {{ participant.dav_number }}
+ {% if participant.dav_member %}
+ {{ participant.dav_number|default:'Fehler! heinzel Bescheid geben!' }}
+ {% else %}
+ {% trans 'Nicht Mitglied' %}
+ {% endif %}
|
diff --git a/dav_events/migrations/0034_auto_20201015_1738.py b/dav_events/migrations/0034_auto_20201015_1738.py
new file mode 100644
index 0000000..b530157
--- /dev/null
+++ b/dav_events/migrations/0034_auto_20201015_1738.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.29 on 2020-10-15 15:38
+from __future__ import unicode_literals
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('dav_events', '0033_auto_20200925_1543'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='participant',
+ name='dav_member',
+ field=models.BooleanField(default=True, help_text='In Ausnahmefällen nehmen wir auch Nichtmitglieder mit.', verbose_name='DAV Mitglied'),
+ ),
+ migrations.AlterField(
+ model_name='participant',
+ name='dav_number',
+ field=models.CharField(blank=True, max_length=62, validators=[django.core.validators.RegexValidator('^([0-9]{1,10}/[0-9]{2,10}/)?[0-9]{1,10}(\\*[0-9]{1,10})?(\\*[0-9]{4}\\*[0-9]{4})?([* ][0-9]{8})?$', 'Ungültiges Format.')], verbose_name='DAV Mitgliedsnummer'),
+ ),
+ ]
diff --git a/dav_events/models/participant.py b/dav_events/models/participant.py
index 4171c2d..f42ddd4 100644
--- a/dav_events/models/participant.py
+++ b/dav_events/models/participant.py
@@ -1,6 +1,7 @@
# -*- 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
@@ -32,8 +33,11 @@ class Participant(models.Model):
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,
- validators=[DAVNumberValidator],
+ blank=True, validators=[DAVNumberValidator],
verbose_name=_('DAV Mitgliedsnummer'))
emergency_contact = models.TextField(blank=True,
verbose_name=_('Notfall-Kontakt'),
@@ -69,25 +73,38 @@ class Participant(models.Model):
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
diff --git a/dav_events/templates/dav_events/includes/participant_form.html b/dav_events/templates/dav_events/includes/participant_form.html
index 4eb0e04..9279bd4 100644
--- a/dav_events/templates/dav_events/includes/participant_form.html
+++ b/dav_events/templates/dav_events/includes/participant_form.html
@@ -29,9 +29,12 @@
-
+
{% bootstrap_field form.dav_number %}
+
+ {% bootstrap_field form.dav_member %}
+
{% bootstrap_field form.emergency_contact %}
diff --git a/dav_events/views/events.py b/dav_events/views/events.py
index 2e225ac..9eeb586 100644
--- a/dav_events/views/events.py
+++ b/dav_events/views/events.py
@@ -230,9 +230,9 @@ class EventRegistrationsView(EventPermissionMixin, generic.DetailView):
registrations_support = hasattr(event, 'registrations')
context['registrations_support'] = registrations_support
if registrations_support:
- registrations_unanswered = event.registrations.filter(answered=False)
registrations_all = event.registrations.all()
- context['registrations_unanswered'] = registrations_unanswered
+ registrations_pending = registrations_all.filter(answered=False)
+ context['registrations_pending'] = registrations_pending
context['registrations_all'] = registrations_all
context['registrations'] = registrations_all
diff --git a/dav_registration/forms.py b/dav_registration/forms.py
index 504874b..e80d9e3 100644
--- a/dav_registration/forms.py
+++ b/dav_registration/forms.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
import logging
from django import forms
-from django.utils.translation import ugettext
+from django.utils.translation import ugettext, ugettext_lazy as _
from .models import Registration
@@ -9,10 +9,17 @@ logger = logging.getLogger(__name__)
class RegistrationForm(forms.ModelForm):
+ not_dav_member = forms.BooleanField(required=False,
+ label=_('Ich bin noch kein DAV Mitglied.'),
+ help_text=_('Wenn du noch kein DAV Mitglied bist,'
+ ' oder deine Aufnahme noch in Arbeit ist,'
+ ' kreuze dieses Feld hier an.'))
+
class Meta:
model = Registration
exclude = ['event', 'created_at', 'privacy_policy', 'purge_at', 'answered']
widgets = {
+ 'dav_member': forms.HiddenInput(),
'emergency_contact': forms.Textarea(attrs={'rows': 4}),
'experience': forms.Textarea(attrs={'rows': 5}),
'note': forms.Textarea(attrs={'rows': 5}),
@@ -41,3 +48,13 @@ class RegistrationForm(forms.ModelForm):
code='privacy_policy_not_accepted',
)
return val
+
+ def clean(self):
+ super(RegistrationForm, self).clean()
+ dav_member = self.cleaned_data.get('dav_member')
+ dav_number = self.cleaned_data.get('dav_number')
+ if dav_member and not dav_number:
+ error_msg = ugettext(u'Wenn du DAV Mitglied bist, brauchen wir deine Mitgliedsnummer.')
+ self.add_error('not_dav_member', error_msg)
+ raise forms.ValidationError(error_msg, code='dav_number_missing')
+ return self.cleaned_data
diff --git a/dav_registration/migrations/0005_auto_20201015_1738.py b/dav_registration/migrations/0005_auto_20201015_1738.py
new file mode 100644
index 0000000..3d69b2b
--- /dev/null
+++ b/dav_registration/migrations/0005_auto_20201015_1738.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.29 on 2020-10-15 15:38
+from __future__ import unicode_literals
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('dav_registration', '0004_auto_20190605_1400'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='registration',
+ name='dav_member',
+ field=models.BooleanField(default=True, verbose_name='DAV Mitglied'),
+ ),
+ migrations.AlterField(
+ model_name='registration',
+ name='dav_number',
+ field=models.CharField(blank=True, help_text='Deine Mitgliedsnummer findest du unter dem Strichcode auf deinem DAV Ausweis. Beispiel: 131/00/012345 (der Teil bis zum ersten * genügt)', max_length=62, validators=[django.core.validators.RegexValidator('^([0-9]{1,10}/[0-9]{2,10}/)?[0-9]{1,10}(\\*[0-9]{1,10})?(\\*[0-9]{4}\\*[0-9]{4})?([* ][0-9]{8})?$', 'Ungültiges Format.')], verbose_name='DAV Mitgliedsnummer'),
+ ),
+ ]
diff --git a/dav_registration/models.py b/dav_registration/models.py
index ae22221..3ff8494 100644
--- a/dav_registration/models.py
+++ b/dav_registration/models.py
@@ -2,6 +2,7 @@
from __future__ import unicode_literals
import datetime
import logging
+from django.core.exceptions import ValidationError
from django.db import models
from django.urls import reverse
from django.utils import timezone
@@ -39,8 +40,10 @@ class Registration(models.Model):
phone_number = models.CharField(max_length=254,
verbose_name=_('Telefonnummer'),
help_text=_('Idealerweise eine Mobilfunk-Nummer'))
+ dav_member = models.BooleanField(default=True,
+ verbose_name=_('DAV Mitglied'))
dav_number = models.CharField(max_length=62,
- validators=[DAVNumberValidator],
+ blank=True, validators=[DAVNumberValidator],
verbose_name=_('DAV Mitgliedsnummer'),
help_text='%s %s %s' % (
_('Deine Mitgliedsnummer findest du unter dem Strichcode'
@@ -109,7 +112,7 @@ class Registration(models.Model):
text = """{fullname}
{address}, {postal_code} {city}
-DAV Mitgliedsnummer: {dav_number}
+DAV Mitglied: {dav_info}
Erfahrung:
{experience}
@@ -117,16 +120,25 @@ Erfahrung:
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_number=self.dav_number,
+ dav_info=dav_info,
experience=self.experience,
note=self.note,
)
+ def clean(self):
+ if self.dav_member and not self.dav_number:
+ raise ValidationError({'dav_number': _('Wenn du DAV Mitglied bist, brauchen wir deine Mitgliedsnummer.')})
+
def save(self, **kwargs):
creating = False
if not self.id:
@@ -135,6 +147,7 @@ Anmerkung:
if not self.purge_at and self.event:
self.purge_at = self.__class__.calc_purge_at(self.event)
+ self.full_clean()
super(Registration, self).save(**kwargs)
if creating:
diff --git a/dav_registration/templates/dav_registration/emails/inform_self.txt b/dav_registration/templates/dav_registration/emails/inform_self.txt
index 5db5623..dfdbfeb 100644
--- a/dav_registration/templates/dav_registration/emails/inform_self.txt
+++ b/dav_registration/templates/dav_registration/emails/inform_self.txt
@@ -22,7 +22,7 @@ Personendaten
{{ registration.postal_code }} {{ registration.city }}
Telefon: {{ registration.phone_number }}
E-Mail: {{ registration.email_address }}
-DAV Mitgliedsnummer: {{ registration.dav_number }}
+{% if registration.dav_member %}DAV Mitgliedsnummer: {{ registration.dav_number }}{% else %}DAV Mitglied: Nein{% endif %}
Notfall-Kontakt
---------------
diff --git a/dav_registration/templates/dav_registration/emails/inform_trainer.txt b/dav_registration/templates/dav_registration/emails/inform_trainer.txt
index d3e00ba..5da7483 100644
--- a/dav_registration/templates/dav_registration/emails/inform_trainer.txt
+++ b/dav_registration/templates/dav_registration/emails/inform_trainer.txt
@@ -11,7 +11,7 @@ Teilnehmer*in:
{{ registration.address }}, {{ registration.postal_code }} {{ registration.city }}
{{ registration.phone_number }}
{{ registration.email_address }}
-{{ registration.dav_number }}
+{% if registration.dav_member %}{{ registration.dav_number }}{% else %}Nicht DAV Mitglied{% endif %}
Notfall-Kontakt:
{% if registration.emergency_contact %}{{ registration.emergency_contact }}{% else %}-{% endif %}
diff --git a/dav_registration/templates/dav_registration/registration_form.html b/dav_registration/templates/dav_registration/registration_form.html
index addb143..473e213 100644
--- a/dav_registration/templates/dav_registration/registration_form.html
+++ b/dav_registration/templates/dav_registration/registration_form.html
@@ -4,6 +4,40 @@
{% block head-title %}{% block form-title %}{% trans 'Anmeldung' %} - {{ event.number }}{% endblock form-title %} - {{ block.super }}{% endblock head-title %}
+{% block head-additional %}
+
+{% endblock head-additional %}
+
{% block page-container-fluid %}
{% trans 'Anmeldung' %}
-
+
{% bootstrap_field form.dav_number %}
+
+ {% bootstrap_field form.not_dav_member %}
+
{% bootstrap_field form.emergency_contact %}
diff --git a/dav_registration/tests/test_emails.py b/dav_registration/tests/test_emails.py
index 75012f3..a8502cc 100644
--- a/dav_registration/tests/test_emails.py
+++ b/dav_registration/tests/test_emails.py
@@ -32,11 +32,11 @@ Vorgang: {registration_hexstr} (wird nur gebraucht, wenn irgendwas schief geht)
Personendaten
-------------
{participant_full_name}
-
-
-Telefon:
+Here
+1 Karlsruhe
+Telefon: 12
E-Mail: {participant_email}
-DAV Mitgliedsnummer:
+DAV Mitgliedsnummer: 0
Notfall-Kontakt
---------------
@@ -66,10 +66,10 @@ Vorgang: {registration_hexstr}
Teilnehmer*in:
{participant_full_name}
-,
-
+Here, 1 Karlsruhe
+12
{participant_email}
-
+0
Notfall-Kontakt:
-
@@ -107,7 +107,12 @@ class EmailsTestCase(EmailTestMixin, EventMixin, RegistrationMixin, TestCase):
'event': event,
'personal_names': 'Participant',
'family_names': 'One',
+ 'address': 'Here',
+ 'postal_code': '1',
+ 'city': 'Karlsruhe',
+ 'phone_number': '12',
'email_address': 'participant@localhost',
+ 'dav_number': '0',
}
registration = self.create_registration(registration_data)
@@ -150,6 +155,7 @@ class EmailsTestCase(EmailTestMixin, EventMixin, RegistrationMixin, TestCase):
'postal_code': '76131',
'city': 'Karlsruhe',
'phone_number': '+49 721 1234567890 AB (Büro)',
+ 'dav_member': False,
'dav_number': '131/00/007*12345',
'emergency_contact': 'Call 911!',
'experience': 'Yes, we can!',
@@ -167,7 +173,7 @@ class EmailsTestCase(EmailTestMixin, EventMixin, RegistrationMixin, TestCase):
search += '{} {}\n'.format(registration_data['postal_code'], registration_data['city'])
search += 'Telefon: {}\n'.format(registration_data['phone_number'])
search += 'E-Mail: {}\n'.format(registration_data['email_address'])
- search += 'DAV Mitgliedsnummer: {}\n'.format(registration_data['dav_number'])
+ search += 'DAV Mitglied: Nein\n'
self.assertIn(search, mail.body)
search = '\n'
@@ -204,7 +210,12 @@ class EmailsTestCase(EmailTestMixin, EventMixin, RegistrationMixin, TestCase):
'event': event,
'personal_names': 'Participant',
'family_names': 'One',
+ 'address': 'Here',
+ 'postal_code': '1',
+ 'city': 'Karlsruhe',
+ 'phone_number': '12',
'email_address': 'participant@localhost',
+ 'dav_number': '0',
}
registration = self.create_registration(registration_data)
@@ -247,6 +258,7 @@ class EmailsTestCase(EmailTestMixin, EventMixin, RegistrationMixin, TestCase):
'postal_code': '76131',
'city': 'Karlsruhe',
'phone_number': '+49 721 1234567890 AB (Büro)',
+ 'dav_member': False,
'dav_number': '131/00/007*12345',
'emergency_contact': 'Call 911!',
'experience': 'Yes, we can!',
@@ -265,7 +277,7 @@ class EmailsTestCase(EmailTestMixin, EventMixin, RegistrationMixin, TestCase):
search += '\n'
search += registration_data['email_address']
search += '\n'
- search += registration_data['dav_number']
+ search += 'Nicht DAV Mitglied'
search += '\n'
self.assertIn(search, mail.body)
diff --git a/dav_registration/tests/test_models.py b/dav_registration/tests/test_models.py
new file mode 100644
index 0000000..932835f
--- /dev/null
+++ b/dav_registration/tests/test_models.py
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+from django.apps import apps
+from django.core.exceptions import ValidationError
+from django.test import TestCase
+
+from dav_events.tests.generic import EventMixin
+
+from .generic import RegistrationMixin
+
+
+class RegistrationTestCase(EventMixin, RegistrationMixin, TestCase):
+ def setUp(self):
+ super(RegistrationTestCase, self).setUp()
+
+ app_config = apps.get_app_config('dav_events')
+ app_config.settings.enable_email_on_status_update = False
+
+ self.event = self.create_event_by_model()
+ self.submit_event(self.event)
+ self.accept_event(self.event)
+ self.confirm_publication_event(self.event)
+
+ def test_create_members(self):
+ event = self.event
+ registration_data = {
+ 'event': event,
+ 'personal_names': 'Participant',
+ 'family_names': 'One',
+ 'address': 'Here',
+ 'postal_code': '1',
+ 'city': 'Karlsruhe',
+ 'phone_number': '12',
+ 'email_address': 'participant@localhost',
+ }
+ dav_numbers = ['0', '12345', '131/00/12345']
+ for n in dav_numbers:
+ d = registration_data
+ d['dav_number'] = n
+ self.create_registration(d)
+
+ def test_create_members_without_number(self):
+ event = self.event
+ registration_data = {
+ 'event': event,
+ 'personal_names': 'Participant',
+ 'family_names': 'One',
+ 'address': 'Here',
+ 'postal_code': '1',
+ 'city': 'Karlsruhe',
+ 'phone_number': '12',
+ 'email_address': 'participant@localhost',
+ }
+ with self.assertRaisesMessage(ValidationError,
+ 'Wenn du DAV Mitglied bist, brauchen wir deine Mitgliedsnummer.'):
+ self.create_registration(registration_data)
+
+ registration_data['dav_number'] = ''
+ with self.assertRaisesMessage(ValidationError,
+ 'Wenn du DAV Mitglied bist, brauchen wir deine Mitgliedsnummer.'):
+ self.create_registration(registration_data)
+
+ def test_create_members_with_invalid_numbers(self):
+ event = self.event
+ registration_data = {
+ 'event': event,
+ 'personal_names': 'Participant',
+ 'family_names': 'One',
+ 'address': 'Here',
+ 'postal_code': '1',
+ 'city': 'Karlsruhe',
+ 'phone_number': '12',
+ 'email_address': 'participant@localhost',
+ }
+ dav_numbers = ['Nein', '-', '13100123456789']
+ for n in dav_numbers:
+ d = registration_data
+ d['dav_number'] = n
+
+ with self.assertRaises(ValidationError) as context:
+ self.create_registration(d)
+
+ self.assertEqual(context.exception.messages, ['Ungültiges Format.'])
+
+ def test_create_non_member(self):
+ event = self.event
+ registration_data = {
+ 'event': event,
+ 'personal_names': 'Participant',
+ 'family_names': 'One',
+ 'address': 'Here',
+ 'postal_code': '1',
+ 'city': 'Karlsruhe',
+ 'phone_number': '12',
+ 'email_address': 'participant@localhost',
+ 'dav_member': False,
+ }
+ self.create_registration(registration_data)
+
diff --git a/dav_registration/tests/test_utils.py b/dav_registration/tests/test_utils.py
index 81ff5d4..46ec24a 100644
--- a/dav_registration/tests/test_utils.py
+++ b/dav_registration/tests/test_utils.py
@@ -29,6 +29,16 @@ class UtilsTestCase(RegistrationMixin, EventMixin, TestCase):
'trainer_familyname': 'One',
'trainer_email': 'trainer@localhost',
}
+ registration_data = {
+ 'personal_names': 'Participant',
+ 'family_names': 'P.',
+ 'address': 'Am Fächerbad 2',
+ 'postal_code': '76131',
+ 'city': 'Karlsruhe',
+ 'phone_number': '555 5555',
+ 'email_address': 'participant@localhost',
+ 'dav_number': '1',
+ }
first_day = today - (one_day * 367)
while first_day < today:
@@ -41,7 +51,9 @@ class UtilsTestCase(RegistrationMixin, EventMixin, TestCase):
self.accept_event(event)
for i in range(0, registrations_per_event):
- self.create_registration({'event': event})
+ d = registration_data
+ d['event'] = event
+ self.create_registration(d)
purge_registrations()
|