Registrations: view to uncheck apply_reduced_fee while accepting
Some checks failed
buildbot/tox Build done.
Some checks failed
buildbot/tox Build done.
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
from . import generic
|
||||
from . import events
|
||||
from . import participant
|
||||
from . import registration
|
||||
|
||||
8
dav_events/forms/registration.py
Normal file
8
dav_events/forms/registration.py
Normal 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'))
|
||||
35
dav_events/migrations/0040_auto_20201216_1712.py
Normal file
35
dav_events/migrations/0040_auto_20201216_1712.py
Normal 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'),
|
||||
),
|
||||
]
|
||||
@@ -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()
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
<button type="submit" name="action" value="reject_registration"
|
||||
class="btn btn-link no-padding" title="Anmeldung löschen">
|
||||
|
||||
45
dav_events/templates/dav_events/registration_response.html
Normal file
45
dav_events/templates/dav_events/registration_response.html
Normal 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 %}
|
||||
@@ -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'),
|
||||
]
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.')})
|
||||
|
||||
Reference in New Issue
Block a user