Registrations: view to uncheck apply_reduced_fee while accepting
Some checks failed
buildbot/tox Build done.

This commit is contained in:
2020-12-16 17:28:40 +01:00
parent d3d63097db
commit b44f6df32e
9 changed files with 171 additions and 22 deletions

View File

@@ -1,3 +1,4 @@
from . import generic
from . import events
from . import participant
from . import registration

View File

@@ -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'))

View File

@@ -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'),
),
]

View File

@@ -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()

View File

@@ -272,10 +272,17 @@ Das musst du selbst (per E-Mail oder telefonisch) machen.
{% csrf_token %}
<input type="hidden" name="registration" value="{{ registration.id }}">
{% if has_permission_update_participants %}
{% if registration.apply_reduced_fee %}
<a href="{% url 'dav_events:respond_registration' registration.pk %}"
class="btn btn-link no-padding" title="zur Teilnehmerliste hinzufügen">
<span class="text-success">{% bootstrap_icon 'plus-sign' %}</span>
</a>
{% else %}
<button type="submit" name="action" value="accept_registration"
class="btn btn-link no-padding" title="zur Teilnehmerliste hinzufügen">
<span class="text-success">{% bootstrap_icon 'plus-sign' %}</span>
</button>
{% endif %}
&nbsp;
<button type="submit" name="action" value="reject_registration"
class="btn btn-link no-padding" title="Anmeldung löschen">

View File

@@ -0,0 +1,45 @@
{% extends 'dav_events/base.html' %}
{% load bootstrap3 %}
{% load i18n %}
{% block head-title %}
{% trans 'Anmeldung' %} {{ registration.get_full_name }} - {{ registration.event.number }} - {{ block.super }}
{% endblock head-title %}
{% block page-container %}
<div class="well">
<p>
Hallo {{ registration.event.trainer_firstname }},
</p>
<p>
du hast sicherlich schon gesehen, dass {{ registration.get_full_name }} angekreuzt hat,
die reduzierte Teilnahmegebühr zahlen zu wollen.
</p>
<p>
Für Jugendliche und Junioren sowie Mitglieder mit geringen finanziellen Mitteln (Nachweis durch Karlsruher Paß)
wird die Teilnahmegebühr auf 50% ermäßigt.
</p>
<p>
Wenn ihr bereits darüber gesprochen habt und ihr übereingekommen seid,
dass {{ registration.personal_names }} doch den vollen Betrag zahlen soll,
dann kannst du unten den Haken entfernen.
</p>
</div>
<div class="well">
<h6>
{{ registration.event.number }} - {{ registration.event.title }}<br />
{% trans 'Anmeldung' %} {{ registration.get_full_name }}
</h6>
<form action="" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<button type="submit" name="action" value="accept_registration"
class="btn btn-success">
{% bootstrap_icon 'plus-sign' %} zur Teilnehmerliste hinzufügen
</button>
<a href="{% url 'dav_events:registrations' registration.event.pk %}" class="btn btn-danger">
{% bootstrap_icon 'remove' %} Zurück
</a>
</form>
</div>
{% endblock page-container %}

View File

@@ -12,6 +12,7 @@ urlpatterns = [
views.events.EventUpdateStatusView.as_view(), name='updatestatus'),
url(r'^(?P<pk>\d+)/edit', views.events.EventUpdateView.as_view(), name='update'),
url(r'^(?P<pk>\d+)/', views.events.EventDetailView.as_view(), name='detail'),
url(r'^registration/(?P<pk>\d+)/', views.events.RespondRegistrationView.as_view(), name='respond_registration'),
url(r'^action/(?P<pk>[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12})/',
views.actions.OneClickActionRunView.as_view(), name='action_run'),
]

View File

@@ -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

View File

@@ -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.')})