From b44f6df32e2ba3f2a6b230cef085920360a9f437 Mon Sep 17 00:00:00 2001 From: heinzel Date: Wed, 16 Dec 2020 17:28:40 +0100 Subject: [PATCH] Registrations: view to uncheck apply_reduced_fee while accepting --- dav_events/forms/__init__.py | 1 + dav_events/forms/registration.py | 8 ++ .../migrations/0040_auto_20201216_1712.py | 35 ++++++++ dav_events/models/participant.py | 5 ++ .../dav_events/event_registrations.html | 7 ++ .../dav_events/registration_response.html | 45 ++++++++++ dav_events/urls.py | 1 + dav_events/views/events.py | 84 ++++++++++++++----- dav_registration/models.py | 7 ++ 9 files changed, 171 insertions(+), 22 deletions(-) create mode 100644 dav_events/forms/registration.py create mode 100644 dav_events/migrations/0040_auto_20201216_1712.py create mode 100644 dav_events/templates/dav_events/registration_response.html diff --git a/dav_events/forms/__init__.py b/dav_events/forms/__init__.py index a13db64..c7f2392 100644 --- a/dav_events/forms/__init__.py +++ b/dav_events/forms/__init__.py @@ -1,3 +1,4 @@ from . import generic from . import events from . import participant +from . import registration diff --git a/dav_events/forms/registration.py b/dav_events/forms/registration.py new file mode 100644 index 0000000..2d28b2b --- /dev/null +++ b/dav_events/forms/registration.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from django import forms +from django.utils.translation import ugettext_lazy as _ + + +class RegistrationResponseForm(forms.Form): + apply_reduced_fee = forms.BooleanField(required=False, + label=_(u'Reduzierte Teilnahmegebühr')) diff --git a/dav_events/migrations/0040_auto_20201216_1712.py b/dav_events/migrations/0040_auto_20201216_1712.py new file mode 100644 index 0000000..d844345 --- /dev/null +++ b/dav_events/migrations/0040_auto_20201216_1712.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-12-16 16:12 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dav_events', '0039_auto_20201215_1155'), + ] + + operations = [ + migrations.AddField( + model_name='participant', + name='privacy_policy', + field=models.TextField(blank=True, verbose_name='Erklärung zur Datenspeicherung'), + ), + migrations.AddField( + model_name='participant', + name='privacy_policy_accepted', + field=models.BooleanField(default=False, verbose_name='Einwilligung zur Datenspeicherung'), + ), + migrations.AddField( + model_name='trashedparticipant', + name='privacy_policy', + field=models.TextField(blank=True, verbose_name='Erklärung zur Datenspeicherung'), + ), + migrations.AddField( + model_name='trashedparticipant', + name='privacy_policy_accepted', + field=models.BooleanField(default=False, verbose_name='Einwilligung zur Datenspeicherung'), + ), + ] diff --git a/dav_events/models/participant.py b/dav_events/models/participant.py index 01af818..da0b692 100644 --- a/dav_events/models/participant.py +++ b/dav_events/models/participant.py @@ -53,6 +53,11 @@ class AbstractParticipant(models.Model): 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() diff --git a/dav_events/templates/dav_events/event_registrations.html b/dav_events/templates/dav_events/event_registrations.html index b8b3278..b565db3 100644 --- a/dav_events/templates/dav_events/event_registrations.html +++ b/dav_events/templates/dav_events/event_registrations.html @@ -272,10 +272,17 @@ Das musst du selbst (per E-Mail oder telefonisch) machen. {% csrf_token %} {% if has_permission_update_participants %} + {% if registration.apply_reduced_fee %} + + {% bootstrap_icon 'plus-sign' %} + + {% else %} + {% endif %}   + + {% bootstrap_icon 'remove' %} Zurück + + + +{% endblock page-container %} diff --git a/dav_events/urls.py b/dav_events/urls.py index b348d56..40cb2d7 100644 --- a/dav_events/urls.py +++ b/dav_events/urls.py @@ -12,6 +12,7 @@ urlpatterns = [ views.events.EventUpdateStatusView.as_view(), name='updatestatus'), url(r'^(?P\d+)/edit', views.events.EventUpdateView.as_view(), name='update'), url(r'^(?P\d+)/', views.events.EventDetailView.as_view(), name='detail'), + url(r'^registration/(?P\d+)/', views.events.RespondRegistrationView.as_view(), name='respond_registration'), url(r'^action/(?P[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12})/', views.actions.OneClickActionRunView.as_view(), name='action_run'), ] diff --git a/dav_events/views/events.py b/dav_events/views/events.py index c234771..febf662 100644 --- a/dav_events/views/events.py +++ b/dav_events/views/events.py @@ -2,6 +2,7 @@ import datetime import logging import os +from django.apps import apps from django.contrib import messages from django.contrib.auth import login from django.contrib.auth.decorators import login_required @@ -271,30 +272,13 @@ class EventRegistrationsView(EventPermissionMixin, generic.DetailView): messages.success(request, _(u'Der Anmeldeschluss wurde gelöscht')) def _accept_registration(self, request, registration): - event = registration.event + data = registration.get_data_dict() + del data['created_at'] + del data['answered_obsolete'] + data['position'] = registration.event.participants.count() + 1 - position = event.participants.count() + 1 - - data = { - 'event': event, - 'position': position, - 'personal_names': registration.personal_names, - 'family_names': registration.family_names, - 'address': registration.address, - 'postal_code': registration.postal_code, - 'city': registration.city, - 'email_address': registration.email_address, - 'year_of_birth': registration.year_of_birth, - 'apply_reduced_fee': registration.apply_reduced_fee, - 'phone_number': registration.phone_number, - 'dav_member': registration.dav_member, - 'dav_number': registration.dav_number, - 'emergency_contact': registration.emergency_contact, - 'experience': registration.experience, - 'note': registration.note, - 'purge_at': registration.purge_at, - } participant = models.Participant.objects.create(**data) + registration.status.set_accepted() messages.success(request, _(u'Teilnehmer hinzugefügt: {}'.format(participant.get_full_name()))) @@ -455,6 +439,62 @@ class EventRegistrationsView(EventPermissionMixin, generic.DetailView): return super(EventRegistrationsView, self).dispatch(request, *args, **kwargs) +class RespondRegistrationView(EventPermissionMixin, generic.DetailView, generic.FormView): + permission = 'update-participants' + context_object_name = 'registration' + template_name = 'dav_events/registration_response.html' + form_class = forms.registration.RegistrationResponseForm + + def _accept_registration(self, request, registration): + data = registration.get_data_dict() + del data['created_at'] + del data['answered_obsolete'] + data['position'] = registration.event.participants.count() + 1 + + participant = models.Participant.objects.create(**data) + + registration.status.set_accepted() + messages.success(request, _(u'Teilnehmer hinzugefügt: {}'.format(participant.get_full_name()))) + + def has_permission(self, permission, obj): + user = self.request.user + return obj.event.workflow.has_permission(user, permission) + + def get_queryset(self): + model = apps.get_model(app_label='dav_registration', model_name='Registration') + return model.objects.all() + + def get_success_url(self): + return reverse('dav_events:registrations', args=[self.object.event.pk]) + + def get_initial(self): + return { + 'apply_reduced_fee': self.object.apply_reduced_fee, + } + + def form_valid(self, form): + registration = self.object + registration.apply_reduced_fee = form.cleaned_data['apply_reduced_fee'] + registration.save() + self._accept_registration(self.request, registration) + return HttpResponseRedirect(self.get_success_url()) + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + self.enforce_permission(self.object) + context = self.get_context_data(object=self.object) + return self.render_to_response(context) + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + self.enforce_permission(self.object) + return super(RespondRegistrationView, self).post(request, *args, **kwargs) + + @method_decorator(login_required) + def dispatch(self, request, *args, **kwargs): + return super(RespondRegistrationView, self).dispatch(request, *args, **kwargs) + + class EventUpdateStatusView(EventPermissionMixin, generic.DetailView): model = models.Event diff --git a/dav_registration/models.py b/dav_registration/models.py index fa82b73..d5cc281 100644 --- a/dav_registration/models.py +++ b/dav_registration/models.py @@ -164,6 +164,13 @@ Anmerkung: 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': _('Wenn du DAV Mitglied bist, brauchen wir deine Mitgliedsnummer.')})