Files
django-dav-events/dav_events/forms/events.py

963 lines
52 KiB
Python

# -*- coding: utf-8 -*-
import calendar
import datetime
import logging
import re
from babel.dates import format_date
from django import forms
from django.apps import apps
from django.utils.translation import get_language, ugettext, ugettext_lazy as _
from django_countries.fields import Country, LazyTypedChoiceField
from datetimewidget.widgets import DateWidget, TimeWidget, DateTimeWidget
from .. import choices
from .. import config
from .. import models
from ..workflow import workflow
from .generic import ChainedForm, ModelMixin
app_config = apps.get_containing_app_config(__package__)
logger = logging.getLogger(__name__)
class EventListExportForm(forms.Form):
sport = forms.MultipleChoiceField(choices=choices.SPORT_CHOICES,
required=False,
label=_(u'Spielart'),
initial=[c for c, l in choices.SPORT_CHOICES],
widget=forms.CheckboxSelectMultiple(),
)
begin = forms.DateField(required=False,
initial=datetime.date.today(),
label=_(u'Zeitraum - Start'),
help_text=u'%s - %s' % (
_(u'Format: tt.mm.jjjj'),
_(u'Kann frei gelassen werden'),
),
widget=DateWidget(attrs={'id': 'id_begin_widget',
'placeholder': _(u'Kann freigelassen werden')},
usel10n=True,
options={
# 'format': 'dd.mm.yyyy',
# 'weekStart': 1,
'startView': 3,
'clearBtn': True,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
end = forms.DateField(required=False,
label=_(u'Zeitraum - Ende'),
help_text=u'%s - %s' % (
_(u'Format: tt.mm.jjjj'),
_(u'Kann frei gelassen werden'),
),
widget=DateWidget(attrs={'id': 'id_end_widget',
'placeholder': _(u'Kann freigelassen werden')},
usel10n=True,
options={
# 'format': 'dd.mm.yyyy',
# 'weekStart': 1,
'startView': 3,
'clearBtn': True,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
deadline = forms.DateField(required=False,
initial=datetime.date.today(),
label=_(u'Frühester Anmeldeschluss'),
help_text=u'%s - %s - %s' % (
_(u'Veranstaltungen ausschließen,'
u' deren Anmeldeschluss an dem gewählten Datum bereits abgelaufen ist'),
_(u'Kann frei gelassen werden'),
_(u'Format: tt.mm.jjjj'),
),
widget=DateWidget(attrs={'id': 'id_deadline_widget',
'placeholder': _(u'Anmeldeschluss ignorieren'),
},
usel10n=True,
options={
# 'format': 'dd.mm.yyyy',
# 'weekStart': 1,
'startView': 3,
'clearBtn': True,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
class EventUpdateForm(forms.ModelForm):
class Meta:
model = models.Event
fields = '__all__'
exclude = ('accepted', 'accepted_at', 'accepted_by',
'publication_confirmed', 'publication_confirmed_at', 'publication_confirmed_by',)
class EventCreateForm(ModelMixin, ChainedForm):
_model = models.Event
_initial_form_name = 'ModeForm'
def _serialize_value(self, value):
r = super(EventCreateForm, self)._serialize_value(value)
if isinstance(r, Country):
r = r.code
return r
def _get_instance_kwargs(self):
kwargs = self._session_data.copy()
if 'deadline' in kwargs:
buf = kwargs['deadline']
if isinstance(buf, basestring):
deadline_choice = buf.lower()
deadline_field = 'deadline_{}'.format(deadline_choice)
if deadline_field in kwargs:
kwargs['deadline'] = kwargs[deadline_field]
return kwargs
def _get_matrix_config(self, session_data):
mode = session_data.get('mode', None)
sport = session_data.get('sport', None)
ski_lift = session_data.get('ski_lift', False)
terrain = session_data.get('terrain', None)
country = session_data.get('country', None)
overnight = bool(session_data.get('last_day', None))
if sport == 'S' and ski_lift:
matrix_key = 'K'
elif sport == 'W' and not overnight:
matrix_key = '0'
elif sport == 'W' and terrain != 'alpine':
matrix_key = 'A'
elif sport == 'W':
matrix_key = 'B'
elif terrain != 'alpine' and not overnight:
matrix_key = 'C'
elif terrain != 'alpine':
matrix_key = 'D'
elif mode == 'training' and country in ('DE', 'AT'):
matrix_key = 'G'
elif mode == 'training':
matrix_key = 'H'
elif sport == 'K' and country in ('DE', 'AT'):
matrix_key = 'E'
elif sport == 'K':
matrix_key = 'F'
elif country in ('DE', 'AT'):
matrix_key = 'I'
else:
matrix_key = 'J'
return matrix_key, app_config.settings.matrix_config[matrix_key]
class ModeForm(EventCreateForm):
_form_title = _(u'Veranstaltungsmodus')
_next_form_name = 'LocationForm'
mode = forms.ChoiceField(choices=choices.MODE_CHOICES,
label=_(u'Veranstaltungsart'),
widget=forms.RadioSelect())
sport = forms.ChoiceField(choices=choices.SPORT_CHOICES,
label=_(u'Spielart'),
widget=forms.RadioSelect())
ski_lift = forms.BooleanField(required=False,
label=_(u'Skiliftbenutzung'),
help_text=u'%s %s' % (
_(u'Relevant für die Kostenberechnung bei Skitouren/-kursen.'),
_(u'Wird nicht veröffentlicht.'),
),
)
level = forms.ChoiceField(choices=choices.LEVEL_CHOICES,
label=_(u'Schwierigkeitsnivau'),
widget=forms.RadioSelect())
first_day = forms.DateField(required=True,
label=_(u'Erster Tag'),
help_text=_(u'Format: tt.mm.jjjj'),
widget=DateWidget(attrs={'id': 'id_first_day_widget'},
usel10n=True,
options={
# 'format': 'dd.mm.yyyy',
# 'weekStart': 1,
'clearBtn': False,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
last_day = forms.DateField(required=False,
label=_(u'Letzter Tag'),
help_text=u'%s - %s' % (
_(u'Format: tt.mm.jjjj'),
_(u'Bei Tagestouren frei lassen'),
),
widget=DateWidget(attrs={'id': 'id_last_day_widget',
'placeholder': _(u'Bei Tagestouren freilassen'),
},
usel10n=True,
options={
# 'format': 'dd.mm.yyyy',
# 'weekStart': 1,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
alt_first_day = forms.DateField(required=False,
label=u'%s - %s' % (_(u'Ersatztermin'), _(u'Erster Tag')),
help_text=u'%s - %s - %s' % (
_(u'Ausweichtermin bei unpassenden Bedingungen'),
_(u'Format: tt.mm.jjjj'),
_(u'Kann frei gelassen werden'),
),
widget=DateWidget(attrs={'id': 'id_alt_first_day_widget',
'placeholder': _(u'Kann frei gelassen werden'),
},
usel10n=True,
options={
# 'format': 'dd.mm.yyyy',
# 'weekStart': 1,
'clearBtn': False,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
alt_last_day = forms.DateField(required=False,
label=u'%s - %s' % (_(u'Ersatztermin'), _(u'Letzter Tag')),
help_text=u'%s - %s' % (
_(u'Format: tt.mm.jjjj'),
_(u'Bei Tagestouren frei lassen'),
),
widget=DateWidget(attrs={'id': 'id_alt_last_day_widget',
'placeholder': _(u'Bei Tagestouren freilassen'),
},
usel10n=True,
options={
# 'format': 'dd.mm.yyyy',
# 'weekStart': 1,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
def clean(self):
cleaned_data = super(ModeForm, self).clean()
last_day = cleaned_data.get('last_day', None)
if last_day and last_day == cleaned_data.get('first_day', None):
cleaned_data['last_day'] = ''
alt_last_day = cleaned_data.get('alt_last_day', None)
if alt_last_day and alt_last_day == cleaned_data.get('alt_first_day', None):
cleaned_data['alt_last_day'] = ''
return cleaned_data
class LocationForm(EventCreateForm):
_form_title = _(u'Ort')
_next_form_name = 'JourneyForm'
country = LazyTypedChoiceField(choices=choices.COUNTRY_CHOICES,
label=_(u'Land'))
terrain = forms.ChoiceField(choices=choices.TERRAIN_CHOICES,
label=_(u'Gelände'),
help_text=u'%s %s' % (
_(u'Relevant für die Vorauswahl weiterer Felder.'),
_(u'Wird nicht veröffentlicht.'),
),
)
location = forms.CharField(required=False,
max_length=config.LOCATION_MAX_LENGTH,
label=_(u'Ort oder Gebiet'),
help_text=u'%s %s' % (
_(u'Orts- und Fels- bzw. Bergname, evtl. auch Gebirgsgruppe bzw. Region,'
u' so dass man mindestens eine grobe Vorstellung bekommt,'
u' wo das ganze stattfindet.'),
_(u'Kann in Ausnahmefällen (z.B. Streckenwanderung) freigelassen werden.'),
),
widget=forms.TextInput(
attrs={'placeholder': _(u'Kann in Ausnahmefällen frei gelassen werden')}
))
transport = forms.ChoiceField(choices=choices.TRANSPORT_CHOICES,
label=_(u'Verkehrsmittel zur An- und Abreise'),
)
transport_other = forms.CharField(required=False,
max_length=config.TRANSPORT_OTHER_MAX_LENGTH,
label=_(u'Anderes Verkehrsmittel zur An- und Abreise'),
)
def proceed_session_data(self, session_data):
super(LocationForm, self).proceed_session_data(session_data)
sport = session_data.get('sport', None)
last_day = session_data.get('last_day', None)
if sport == 'B':
self.fields['location'].widget.attrs['placeholder'] = u'z.B. Chamonix, Mont-Blanc-Gruppe'
elif sport == 'K':
self.fields['location'].widget.attrs['placeholder'] = u'z.B. Battert, Baden-Baden'
elif sport == 'M':
self.fields['location'].widget.attrs['placeholder'] = u'z.B. Pfälzerwald'
elif sport == 'S' and last_day:
self.fields['location'].widget.attrs['placeholder'] = u'z.B. Obergurgl, Ötztaler Alpen'
elif sport == 'S':
self.fields['location'].widget.attrs['placeholder'] = u'z.B. Todtnau, Schwarzwald'
elif sport == 'W' and last_day:
self.fields['location'].widget.attrs['placeholder'] = u'z.B. Ötztaler Alpen'
elif sport == 'W':
self.fields['location'].widget.attrs['placeholder'] = u'z.B. Maikammer, Pfalz'
self.fields['transport_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
class JourneyForm(EventCreateForm):
_form_title = _(u'An- und Abreise - Teil 2')
_next_form_name = 'RequirementsForm'
meeting_point = forms.ChoiceField(choices=choices.MEETING_POINT_CHOICES,
label=_(u'Treffpunkt'),
)
meeting_point_other = forms.CharField(required=False,
max_length=config.MEETING_POINT_OTHER_MAX_LENGTH,
label=_(u'Anderer Treffpunkt'),
)
meeting_time = forms.TimeField(required=False,
label=_(u'Uhrzeit am Treffpunkt'),
help_text=u'%s - %s' % (
_(u'Format: hh:mm'),
_(u'Kann freigelassen werden'),
),
widget=TimeWidget(attrs={'id': 'id_meeting_time_widget',
'placeholder': _(u'Kann freigelassen werden'),
},
# usel10n=True,
options={
'format': 'hh:ii',
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
departure_time = forms.TimeField(required=False,
label=_(u'Uhrzeit Abfahrt'),
help_text=u'%s - %s' % (
_(u'Format: hh:mm'),
_(u'Kann freigelassen werden'),
),
widget=TimeWidget(attrs={'id': 'id_departure_time_widget',
'placeholder': _(u'Kann freigelassen werden'),
},
# usel10n=True,
options={
'format': 'hh:ii',
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
departure_ride = forms.CharField(required=False,
max_length=config.MEETING_POINT_OTHER_MAX_LENGTH,
label=_(u'Bahn- / Bus-Linie / evtl. Haltestelle'),
help_text=u'%s - %s' % (
_(u'Wo sollen die Teilnehmer einsteigen, wenn kein Treffpunkt ausgemacht ist'
u', oder jemand später zusteigen will'),
_(u'Kann freigelassen werden'),),
)
return_departure_time = forms.TimeField(required=False,
label=_(u'Uhrzeit Rückfahrt (Abfahrt am Tourenort)'),
help_text=u'%s - %s' % (
_(u'Format: hh:mm'),
_(u'Kann freigelassen werden'),
),
widget=TimeWidget(attrs={'id': 'id_return_departure_time_widget',
'placeholder': _(u'Kann freigelassen werden'),
},
# usel10n=True,
options={
'format': 'hh:ii',
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
return_arrival_time = forms.TimeField(required=False,
label=_(u'oder: Uhrzeit Rückkunft (Ankunft in Karlsruhe)'),
help_text=u'%s - %s' % (
_(u'Format: hh:mm'),
_(u'Kann freigelassen werden'),
),
widget=TimeWidget(attrs={'id': 'id_return_arrival_time_widget',
'placeholder': _(u'Kann freigelassen werden'),
},
# usel10n=True,
options={
'format': 'hh:ii',
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
arrival_previous_day = forms.BooleanField(required=False,
label=_(u'Anreise des Kurs-/Tourenleiters am Vortag'),
help_text=u'%s %s' % (
_(u'Relevant für die Kostenberechnung.'),
_(u'Wird nicht veröffentlicht.'),
),
)
@property
def next_form_name(self):
if bool(self._session_data.get('last_day', None)):
return 'AccommodationForm'
return super(JourneyForm, self).next_form_name
def proceed_session_data(self, session_data):
super(JourneyForm, self).proceed_session_data(session_data)
first_day = session_data.get('first_day', None)
last_day = session_data.get('last_day', None)
transport = session_data.get('transport', None)
self.fields['meeting_point_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
self.fields['departure_ride'].widget.attrs['placeholder'] = _(u'z.B. Linie S81 nach Freudenstadt, Gleis 9')
self.fields['meeting_time'].widget.options['startDate'] = first_day.strftime('%Y-%m-%d 00:00:00')
self.fields['meeting_time'].widget.options['endDate'] = first_day.strftime('%Y-%m-%d 23:59:59')
self.fields['departure_time'].widget.options['startDate'] = first_day.strftime('%Y-%m-%d 00:00:00')
self.fields['departure_time'].widget.options['endDate'] = first_day.strftime('%Y-%m-%d 23:59:59')
return_day = last_day or first_day
self.fields['return_departure_time'].widget.options['startDate'] = return_day.strftime('%Y-%m-%d 00:00:00')
self.fields['return_departure_time'].widget.options['endDate'] = return_day.strftime('%Y-%m-%d 23:59:59')
self.fields['return_arrival_time'].widget.options['startDate'] = return_day.strftime('%Y-%m-%d 00:00:00')
self.fields['return_arrival_time'].widget.options['endDate'] = return_day.strftime('%Y-%m-%d 23:59:59')
if transport != 'public':
self.fields['departure_time'].widget = forms.HiddenInput()
self.fields['departure_ride'].widget = forms.HiddenInput()
class AccommodationForm(EventCreateForm):
_form_title = _(u'Unterkunft')
_next_form_name = 'RequirementsForm'
basecamp = forms.CharField(required=False,
max_length=config.BASECAMP_MAX_LENGTH,
label=_(u'Stützpunkt'),
help_text=_(u'z.B. Name der AV-Hütte oder des Campingplatzes'),
)
accommodation = forms.ChoiceField(choices=choices.ACCOMMODATION_CHOICES,
label=_(u'Unterkunft'),
)
accommodation_other = forms.CharField(required=False,
max_length=config.ACCOMMODATION_OTHER_MAX_LENGTH,
label=_(u'Andere Unterkunft'),
)
meals = forms.ChoiceField(choices=choices.MEALS_CHOICES,
label=_(u'Verpflegung'),
)
meals_other = forms.CharField(required=False,
max_length=config.MEALS_OTHER_MAX_LENGTH,
label=_(u'Andere Verpflegung'),
)
def proceed_session_data(self, session_data):
super(AccommodationForm, self).proceed_session_data(session_data)
self.fields['basecamp'].widget.attrs['placeholder'] = _(u'Kann freigelassen werden')
self.fields['accommodation_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
self.fields['meals_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
class RequirementsForm(EventCreateForm):
_form_title = _(u'Voraussetzungen / Vorbedingungen')
_next_form_name = 'TrainerForm'
requirements = forms.CharField(required=False,
label=_(u'Anforderungen / Voraussetzungen'),
help_text=u'%s %s' % (
_(u'Was müssen Teilnehmer bereits können.'),
_(u'Schwierigkeitsgrade in arabischen Ziffern.'
u' Einheiten: km, Hm, Stunden.'),
),
widget=forms.Textarea(attrs={'rows': 2,
'placeholder': _(u'Kann frei gelassen werden')}))
equipment = forms.CharField(required=False,
label=_(u'Ausrüstung'),
help_text=u'%s %s' % (
_(u'Was müssen Teilnehmer mitbringen.'),
_(u'Diese Liste muss nicht vollständig sein,'
u' der potenzielle Teilnehmer soll aber ein Vorstellung davon bekommen,'
u' was er sich gegebenenfalls noch leihen/beschaffen muss.'),
),
widget=forms.Textarea(attrs={'rows': 2,
'placeholder': _(u'Kann frei gelassen werden')}))
pre_meeting_1 = forms.DateTimeField(required=False,
label=u'1. %s' % _(u'Vortreffen'),
help_text=u'%s - %s' % (
_(u'Format: tt.mm.jjjj hh:mm'),
_(u'Kann frei gelassen werden'),
),
widget=DateTimeWidget(attrs={'id': 'id_pre_meeting_1_widget',
'placeholder': _(u'Kann frei gelassen werden')},
# usel10n=True,
options={
'format': 'dd.mm.yyyy hh:ii',
'weekStart': 1,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
pre_meeting_2 = forms.DateTimeField(required=False,
label=u'2. %s' % _(u'Vortreffen'),
help_text=u'%s - %s' % (
_(u'Format: tt.mm.jjjj hh:mm'),
_(u'Kann frei gelassen werden'),
),
widget=DateTimeWidget(attrs={'id': 'id_pre_meeting_2_widget',
'placeholder': _(u'Kann frei gelassen werden')},
# usel10n=True,
options={
'format': 'dd.mm.yyyy hh:ii',
'weekStart': 1,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
class TrainerForm(EventCreateForm):
_form_title = _(u'Tourenleitung')
_next_form_name = 'RegistrationForm'
trainer_firstname = forms.CharField(label=_(u'Vorname'),
max_length=config.TRAINER_NAME_MAX_LENGTH)
trainer_familyname = forms.CharField(label=_(u'Familienname'),
max_length=config.TRAINER_NAME_MAX_LENGTH)
trainer_email = forms.EmailField(required=False,
label=_(u'E-Mail-Adresse'),
)
trainer_phone = forms.CharField(required=False,
max_length=config.PHONE_NUMBER_MAX_LENGTH,
label=_(u'Telefonnummer'),
help_text=_(u'Kann freigelassen werden'),
)
trainer_2_fullname = forms.CharField(required=False,
max_length=config.TRAINER_NAME_MAX_LENGTH,
label=_(u'Name'),
help_text=_(u'Kann freigelassen werden'),
)
trainer_2_email = forms.EmailField(required=False,
label=_(u'E-Mail-Adresse'),
help_text=_(u'Kann freigelassen werden'),
)
trainer_2_phone = forms.CharField(required=False,
max_length=config.PHONE_NUMBER_MAX_LENGTH,
label=_(u'Telefonnummer'),
help_text=_(u'Kann freigelassen werden'),
)
trainer_3_fullname = forms.CharField(required=False,
max_length=config.TRAINER_NAME_MAX_LENGTH,
label=_(u'Name'),
help_text=_(u'Kann freigelassen werden'),
)
trainer_3_email = forms.EmailField(required=False,
label=_(u'E-Mail-Adresse'),
help_text=_(u'Kann freigelassen werden'),
)
trainer_3_phone = forms.CharField(required=False,
max_length=config.PHONE_NUMBER_MAX_LENGTH,
label=_(u'Telefonnummer'),
help_text=_(u'Kann freigelassen werden'),
)
def proceed_session_data(self, session_data):
super(TrainerForm, self).proceed_session_data(session_data)
self.fields['trainer_firstname'].widget.attrs['placeholder'] = _(u'Vorname')
self.fields['trainer_familyname'].widget.attrs['placeholder'] = _(u'Nachname')
self.fields['trainer_email'].widget.attrs['placeholder'] = _(u'E-Mail-Adresse')
self.fields['trainer_phone'].widget.attrs['placeholder'] = _(u'z.B. 0150 150 15 01')
self.fields['trainer_2_fullname'].widget.attrs['placeholder'] = _(u'Kann freigelassen werden')
self.fields['trainer_2_email'].widget.attrs['placeholder'] = u'--'
self.fields['trainer_2_phone'].widget.attrs['placeholder'] = u'--'
self.fields['trainer_3_fullname'].widget.attrs['placeholder'] = _(u'Kann freigelassen werden')
self.fields['trainer_3_email'].widget.attrs['placeholder'] = u'--'
self.fields['trainer_3_phone'].widget.attrs['placeholder'] = u'--'
if hasattr(self._request, 'user') and self._request.user.is_authenticated:
self.fields['trainer_firstname'].initial = self._request.user.first_name
self.fields['trainer_familyname'].initial = self._request.user.last_name
self.fields['trainer_email'].initial = self._request.user.email
elif app_config.settings.forms_development_init:
self.fields['trainer_firstname'].initial = _(u'Jens')
self.fields['trainer_familyname'].initial = _(u'Kleineheismann')
self.fields['trainer_email'].initial = _(u'heinzel@alpenverein-karlsruhe.de')
def clean_trainer_phone(self):
return re.sub(r'[-./]', ' ', self.cleaned_data['trainer_phone'])
def clean(self):
super(TrainerForm, self).clean()
trainer_email = self.cleaned_data.get('trainer_email', None)
trainer_phone = self.cleaned_data.get('trainer_phone', None)
if not trainer_email and not trainer_phone:
error_msg = _(u'Bitte E-Mail-Adresse und/oder Telefonnummer angeben.')
self.add_error('trainer_email', error_msg)
self.add_error('trainer_phone', error_msg)
raise forms.ValidationError(error_msg)
return self.cleaned_data
class RegistrationForm(EventCreateForm):
_form_title = _(u'Teilnehmer / Anmeldung')
_next_form_name = 'ChargesForm'
min_participants = forms.IntegerField(min_value=0,
label=_(u'Min. Teilnehmer'))
max_participants = forms.IntegerField(min_value=0,
label=_(u'Max. Teilnehmer'))
registration_required = forms.BooleanField(required=False,
label=_(u'Anmeldung notwendig'),
)
deadline = forms.ChoiceField(choices=choices.DEADLINE_CHOICES,
label=_(u'Anmeldeschluss'),
widget=forms.RadioSelect())
deadline_month = forms.DateField(widget=forms.HiddenInput())
deadline_quarter = forms.DateField(widget=forms.HiddenInput())
deadline_other = forms.DateField(required=False,
label=_(u'Anderer Anmeldeschluss'),
help_text=u'%s - %s' % (
_(u'Format: tt.mm.jjjj'),
_(u'Kann freigelassen werden'),
),
widget=DateWidget(attrs={'id': 'id_deadline_other_widget',
'placeholder': _(u'Kann freigelassen werden'),
},
usel10n=True,
options={
# 'format': 'dd.mm.yyyy',
# 'weekStart': 1,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
registration_howto = forms.CharField(disabled=True,
required=False,
label=_(u'Anmeldungshinweis'),
help_text=_(u'Dieser Text kann absichtlich nicht geändert werden.'),
widget=forms.Textarea(attrs={'rows': 2}),
)
def get_initial_for_field(self, field, field_name):
value = super(RegistrationForm, self).get_initial_for_field(field, field_name)
if field_name == 'registration_howto' and value is not None:
trainer_firstname = self._session_data.get('trainer_firstname')
trainer_familyname = self._session_data.get('trainer_familyname')
trainer_email = self._session_data.get('trainer_email', None)
trainer_phone = self._session_data.get('trainer_phone', None)
if trainer_email:
trainer_contact = u'%s %s (%s)' % (trainer_firstname, trainer_familyname, trainer_email)
elif trainer_phone:
trainer_contact = u'%s %s (%s)' % (trainer_firstname, trainer_familyname, trainer_phone)
else:
trainer_contact = u'%s %s' % (trainer_firstname, trainer_familyname)
value %= {'trainer_contact': trainer_contact}
elif field_name in ('min_participants', 'max_participants') and value is None:
trainer_2 = bool(self._session_data.get('trainer_2_fullname', False))
trainer_3 = bool(self._session_data.get('trainer_3_fullname', False))
matrix_key, matrix_config = self._get_matrix_config(self._session_data)
n_trainer = 1
if trainer_2:
n_trainer += 1
if trainer_3:
n_trainer += 1
value = n_trainer * matrix_config[field_name]
elif field_name == 'deadline_month':
first_day = self._session_data.get('first_day')
m = first_day.month - 1 - 1
y = first_day.year + m / 12
m = m % 12 + 1
d = min(first_day.day, calendar.monthrange(y, m)[1])
date = datetime.date(y, m, d)
value = date.isoformat()
elif field_name == 'deadline_quarter':
first_day = self._session_data.get('first_day')
m = first_day.month - 1 - 3
y = first_day.year + m / 12
m = m % 12 + 1
d = min(first_day.day, calendar.monthrange(y, m)[1])
date = datetime.date(y, m, d)
value = date.isoformat()
return value
def proceed_session_data(self, session_data):
super(RegistrationForm, self).proceed_session_data(session_data)
new_choices = []
for key, desc in self.fields['deadline'].choices:
field_name = 'deadline_%s' % key
if field_name in self.fields:
date_str = self.get_initial_for_field(self.fields[field_name], field_name)
datetime_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d')
date = datetime_obj.date()
desc += u' ({})'.format(format_date(date, 'EEEE, d. MMMM yyyy', locale=get_language()[0:2]))
new_choices.append((key, desc))
self.fields['deadline'].choices = new_choices
class ChargesForm(EventCreateForm):
_form_title = _(u'Kosten')
_next_form_name = 'DescriptionForm'
charge_key = forms.CharField(disabled=True,
label=_(u'Kostenschlüssel'),
)
trainer_fee = forms.FloatField(disabled=True,
label=_(u'Pauschale Trainer*in'),
)
pre_meeting_fee = forms.FloatField(disabled=True,
label=_(u'Pauschale Vortreffen'),
)
trainer_day_fee = forms.FloatField(disabled=True,
label=_(u'Tagespauschale Trainer*in'),
)
participant_fee = forms.FloatField(disabled=True,
label=_(u'Pauschale Teilnehmer*in'),
)
participant_day_fee = forms.FloatField(disabled=True,
label=_(u'Tagepauschale Teilnehmer*in'),
)
trainer_reward = forms.FloatField(disabled=True,
label=_(u'Aufwandsentschädigung Trainer*in'),
)
charge = forms.FloatField(min_value=0,
label=_(u'Teilnahmegebühr in Euro'))
additional_costs = forms.CharField(required=False,
max_length=config.ADDITIONAL_COSTS_MAX_LENGTH,
label=_(u'Zusätzliche Kosten (Text)'),
help_text=_(u'Kann freigelassen werden'),
)
@property
def next_form_name(self):
if self._session_data.get('mode') == 'training':
return 'TrainingForm'
return super(ChargesForm, self).next_form_name
def proceed_session_data(self, session_data):
super(ChargesForm, self).proceed_session_data(session_data)
first_day = session_data.get('first_day', None)
arrival_previous_day = session_data.get('arrival_previous_day', False)
last_day = session_data.get('last_day', None)
transport = session_data.get('transport', None)
accommodation = session_data.get('accommodation', None)
pre_meeting_1 = session_data.get('pre_meeting_1', None)
pre_meeting_2 = session_data.get('pre_meeting_2', None)
matrix_key, matrix_config = self._get_matrix_config(session_data)
additional_costs_text = u''
if transport != 'coach':
additional_costs_text += ugettext(u'Fahrtkosten')
if last_day:
timedelta = last_day - first_day
ndays = timedelta.days + 1
if accommodation != 'NONE':
if additional_costs_text:
additional_costs_text += u', '
additional_costs_text += ugettext(u'Unterkunft und Verpflegung')
else:
ndays = 1
if pre_meeting_2:
n_pre_meetings = 2
elif pre_meeting_1:
n_pre_meetings = 1
else:
n_pre_meetings = 0
trainer_reward = (
matrix_config['trainer_fee']
+ ndays * matrix_config['trainer_day_fee']
+ n_pre_meetings * matrix_config['pre_meeting_fee']
)
charge = (
matrix_config['participant_fee']
+ ndays * matrix_config['participant_day_fee']
)
if arrival_previous_day:
trainer_reward += matrix_config['trainer_day_fee'] / 2.0
charge += matrix_config['participant_day_fee'] / 2.0
self.fields['charge_key'].initial = matrix_config['description'] or matrix_key
self.fields['trainer_fee'].initial = matrix_config['trainer_fee']
self.fields['pre_meeting_fee'].initial = matrix_config['pre_meeting_fee']
self.fields['trainer_day_fee'].initial = matrix_config['trainer_day_fee']
self.fields['participant_fee'].initial = matrix_config['participant_day_fee']
self.fields['participant_day_fee'].initial = matrix_config['participant_day_fee']
self.fields['trainer_reward'].initial = trainer_reward
self.fields['trainer_reward'].widget.attrs['title'] = (u'%d € Pauschale \n'
u'+ %d Tage * %d € Tagespauschale \n'
u'+ %d halben Anreisetag * %d € Tagespauschale / 2 \n'
u'+ %d Vortreffen * %d € Vortreffenpauschale'
% (
matrix_config['trainer_fee'],
ndays, matrix_config['trainer_day_fee'],
int(arrival_previous_day), matrix_config['trainer_day_fee'],
n_pre_meetings, matrix_config['pre_meeting_fee']
)
)
self.fields['charge'].initial = charge
self.fields['charge'].widget.attrs['title'] = (u'%d € Pauschale \n'
u'+ %d Tage * %d € Tagespauschale \n'
u'+ %d halben Anreisetag * %d € Tagespauschale / 2'
% (
matrix_config['participant_fee'],
ndays, matrix_config['participant_day_fee'],
int(arrival_previous_day), matrix_config['participant_day_fee'],
)
)
self.fields['additional_costs'].widget.attrs['placeholder'] = ugettext(u'Kann freigelassen werden')
self.fields['additional_costs'].initial = additional_costs_text
class TrainingForm(EventCreateForm):
_form_title = _(u'Kursinhalte / Kursziele')
_next_form_name = 'DescriptionForm'
course_topic_1 = forms.CharField(required=True,
label=u'%s - %s 1' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.Textarea(attrs={'rows': 2}))
course_topic_2 = forms.CharField(required=False,
label=u'%s - %s 2' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_3 = forms.CharField(required=False,
label=u'%s - %s 3' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_4 = forms.CharField(required=False,
label=u'%s - %s 4' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_5 = forms.CharField(required=False,
label=u'%s - %s 5' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_topic_6 = forms.CharField(required=False,
label=u'%s - %s 6' % (_(u'Kursinhalt'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_1 = forms.CharField(required=True,
label=u'%s - %s 1' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.Textarea(attrs={'rows': 2}))
course_goal_2 = forms.CharField(required=False,
label=u'%s - %s 2' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_3 = forms.CharField(required=False,
label=u'%s - %s 3' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_4 = forms.CharField(required=False,
label=u'%s - %s 4' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_5 = forms.CharField(required=False,
label=u'%s - %s 5' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
course_goal_6 = forms.CharField(required=False,
label=u'%s - %s 6' % (_(u'Kursziel'), _(u'Absatz')),
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
class DescriptionForm(EventCreateForm):
_form_title = _(u'Titel / Beschreibung')
_next_form_name = 'SummaryForm'
title = forms.CharField(max_length=config.TITLE_MAX_LENGTH,
label=_(u'Name bzw. Titel der Veranstaltung'),
)
description = forms.CharField(label=_(u'Beschreibung'),
widget=forms.Textarea(attrs={'rows': 5}))
def get_initial_for_field(self, field, field_name):
value = super(DescriptionForm, self).get_initial_for_field(field, field_name)
if field_name == 'title' and value is None:
mode = self._session_data.get('mode', None)
sport = self._session_data.get('sport', None)
level = self._session_data.get('level', None)
terrain = self._session_data.get('terrain', None)
last_day = self._session_data.get('last_day', None)
value = u''
if mode == 'training':
if level == 'beginner':
value += u'%s ' % ugettext(u'Grundkurs')
else:
value += u'%s ' % ugettext(u'Aufbaukurs')
if sport == 'B':
value += u'%s' % ugettext(u'Alpin')
elif sport == 'K':
if terrain == 'gym':
value += ugettext(u'Indoorklettern')
elif terrain == 'crag':
value += ugettext(u'Fels')
elif terrain == 'alpine':
value += ugettext(u'Alpinklettern')
value += u': ...'
elif sport == 'W' and not last_day:
value += u'%s ...' % ugettext(u'Tageswanderung')
if app_config.settings.forms_development_init:
if not value:
value = u'%s' % choices.SPORT_CHOICES.get_label(sport)
return value
class SummaryForm(EventCreateForm):
_form_title = _(u'Zusammenfassung')
planned_publication_date = forms.DateField(required=False,
label=_(u'Voraussichtliche Veröffentlichung'),
widget=forms.HiddenInput())
planned_publication_issue = forms.CharField(required=False)
internal_note = forms.CharField(required=False,
label=_(u'Bearbeitungshinweis'),
help_text=_(u'Hier kannst du einen Hinweis'
u' für Tourenreferenten und Redakteure eingeben.'),
widget=forms.Textarea(attrs={'rows': 5}))
def proceed_session_data(self, session_data):
super(SummaryForm, self).proceed_session_data(session_data)
registration_required = self._session_data.get('registration_required', False)
if registration_required:
deadline = self._session_data.get('deadline', None)
if deadline == 'OTHER':
deadline = self._session_data.get('deadline_other', None)
else:
deadline_field_name = 'deadline_%s' % deadline
if deadline_field_name in self._session_data:
deadline = self._session_data.get(deadline_field_name)
else:
logger.error('SummaryForm.proceed_session_data(): invalid value for deadline.')
deadline = None
first_day = self._session_data.get('first_day')
issue_date, issue = workflow.plan_publication(first_day, deadline)
if issue_date:
self.fields['planned_publication_date'].initial = issue_date
self.fields['planned_publication_issue'].initial = issue