Cleaned passing of session data between ChainedForms in EventCreateView.
This commit is contained in:
@@ -5,11 +5,14 @@ import logging
|
||||
from babel.dates import format_date
|
||||
|
||||
from django import forms
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.utils.translation import get_language, ugettext, ugettext_lazy as _
|
||||
from datetimewidget.widgets import DateWidget, TimeWidget, DateTimeWidget
|
||||
|
||||
from . import choices
|
||||
from . import config
|
||||
from . import converters
|
||||
from . import models
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
DEVELOPMENT_INIT_FORMS = True
|
||||
@@ -19,13 +22,30 @@ class ChainedForm(forms.Form):
|
||||
_next_form_name = None
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
previous_data = kwargs.pop('previous_data', dict())
|
||||
self._session_data = dict()
|
||||
if 'session_data' in kwargs:
|
||||
self.add_session_data(kwargs.pop('session_data'))
|
||||
super(ChainedForm, self).__init__(*args, **kwargs)
|
||||
self._proceed_previous_data(previous_data)
|
||||
self._proceed_session_data(self._session_data)
|
||||
|
||||
def _proceed_previous_data(self, previous_data):
|
||||
def _proceed_session_data(self, session_data):
|
||||
pass
|
||||
|
||||
def _serialize_value(self, value):
|
||||
return converters.Iso8601Serializer.serialize(value, ignore_unsupported_input=True)
|
||||
|
||||
def _deserialize_value(self, value):
|
||||
return converters.Iso8601Serializer.deserialize(value, ignore_unsupported_input=True)
|
||||
|
||||
def _get_model(self):
|
||||
if not hasattr(self, '_model'):
|
||||
raise ImproperlyConfigured('{cls} is missing a Model.'
|
||||
' Define {cls}._model'.format(cls=self.__class__.__name__))
|
||||
return self._model
|
||||
|
||||
def _get_object(self, model_kwargs):
|
||||
return self._get_model()(**model_kwargs)
|
||||
|
||||
@property
|
||||
def form_name(self):
|
||||
return self.__class__.__name__
|
||||
@@ -51,8 +71,43 @@ class ChainedForm(forms.Form):
|
||||
def get_next_form_name(cls):
|
||||
return cls._next_form_name
|
||||
|
||||
def get_session_data(self):
|
||||
data = dict()
|
||||
for k in self._session_data:
|
||||
data[k] = self._serialize_value(self._session_data[k])
|
||||
for k in self.cleaned_data:
|
||||
data[k] = self._serialize_value(self.cleaned_data[k])
|
||||
return data
|
||||
|
||||
class ModeForm(ChainedForm):
|
||||
def add_session_data(self, data):
|
||||
for k in data:
|
||||
self._session_data[k] = self._deserialize_value(data[k])
|
||||
|
||||
def save(self):
|
||||
object_kwargs = dict()
|
||||
data = self._session_data
|
||||
data.update(self.cleaned_data)
|
||||
if 'deadline' in data:
|
||||
buf = data['deadline']
|
||||
if isinstance(buf, basestring):
|
||||
deadline_choice = buf.lower()
|
||||
deadline_field = 'deadline_{}'.format(deadline_choice)
|
||||
if deadline_field in data:
|
||||
data['deadline'] = data[deadline_field]
|
||||
|
||||
model = self._get_model()
|
||||
for field in data:
|
||||
if hasattr(model, field):
|
||||
object_kwargs[field] = data[field]
|
||||
|
||||
return self._get_object(object_kwargs)
|
||||
|
||||
|
||||
class EventCreateForm(ChainedForm):
|
||||
_model = models.Event
|
||||
|
||||
|
||||
class ModeForm(EventCreateForm):
|
||||
_form_title = _(u'Veranstaltungsmodus')
|
||||
_next_form_name = 'LocationForm'
|
||||
|
||||
@@ -151,7 +206,7 @@ class ModeForm(ChainedForm):
|
||||
return super(ModeForm, self).next_form_name
|
||||
|
||||
|
||||
class TrainingForm(ChainedForm):
|
||||
class TrainingForm(EventCreateForm):
|
||||
_form_title = _(u'Kursinhalte / Kursziele')
|
||||
_next_form_name = 'LocationForm'
|
||||
|
||||
@@ -163,16 +218,16 @@ class TrainingForm(ChainedForm):
|
||||
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')}))
|
||||
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')}))
|
||||
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')}))
|
||||
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')}))
|
||||
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')),
|
||||
@@ -194,7 +249,7 @@ class TrainingForm(ChainedForm):
|
||||
widget=forms.TextInput(attrs={'placeholder': _(u'Kann frei gelassen werden')}))
|
||||
|
||||
|
||||
class LocationForm(ChainedForm):
|
||||
class LocationForm(EventCreateForm):
|
||||
_form_title = _(u'Ort')
|
||||
_next_form_name = 'ApproachForm'
|
||||
|
||||
@@ -216,10 +271,10 @@ class LocationForm(ChainedForm):
|
||||
u' wo das ganze stattfindet.'),
|
||||
widget=forms.TextInput(attrs={'placeholder': u'Karlsruhe'}))
|
||||
|
||||
def _proceed_previous_data(self, previous_data):
|
||||
super(LocationForm, self)._proceed_previous_data(previous_data)
|
||||
def _proceed_session_data(self, session_data):
|
||||
super(LocationForm, self)._proceed_session_data(session_data)
|
||||
|
||||
sport = previous_data.get('sport', None)
|
||||
sport = session_data.get('sport', None)
|
||||
if sport == 'B':
|
||||
self.fields['terrain'].initial = 'alpine'
|
||||
self.fields['location'].widget.attrs['placeholder'] = u'Ramsau, Berchtesgadener Alpen'
|
||||
@@ -237,7 +292,7 @@ class LocationForm(ChainedForm):
|
||||
self.fields['location'].initial = self.fields['location'].widget.attrs['placeholder']
|
||||
|
||||
|
||||
class ApproachForm(ChainedForm):
|
||||
class ApproachForm(EventCreateForm):
|
||||
_form_title = _(u'An- und Abreise / Unterkunft')
|
||||
_next_form_name = 'RequirementsForm'
|
||||
|
||||
@@ -316,13 +371,13 @@ class ApproachForm(ChainedForm):
|
||||
label=_(u'Andere Verpflegung'),
|
||||
)
|
||||
|
||||
def _proceed_previous_data(self, previous_data):
|
||||
super(ApproachForm, self)._proceed_previous_data(previous_data)
|
||||
def _proceed_session_data(self, session_data):
|
||||
super(ApproachForm, self)._proceed_session_data(session_data)
|
||||
|
||||
last_day = previous_data.get('last_day', None)
|
||||
sport = previous_data.get('sport', None)
|
||||
country = previous_data.get('country', None)
|
||||
terrain = previous_data.get('terrain', None)
|
||||
last_day = session_data.get('last_day', None)
|
||||
sport = session_data.get('sport', None)
|
||||
country = session_data.get('country', None)
|
||||
terrain = session_data.get('terrain', None)
|
||||
|
||||
self.fields['transport_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
|
||||
self.fields['meeting_point_other'].widget.attrs['placeholder'] = _(u'Nebenstehendes Feld beachten')
|
||||
@@ -345,7 +400,7 @@ class ApproachForm(ChainedForm):
|
||||
self.fields['accommodation_other'].widget = forms.HiddenInput()
|
||||
|
||||
|
||||
class RequirementsForm(ChainedForm):
|
||||
class RequirementsForm(EventCreateForm):
|
||||
_form_title = _(u'Voraussetungen / Vorbedingungen')
|
||||
_next_form_name = 'DescriptionForm'
|
||||
|
||||
@@ -400,12 +455,12 @@ class RequirementsForm(ChainedForm):
|
||||
},
|
||||
bootstrap_version=3))
|
||||
|
||||
def _proceed_previous_data(self, previous_data):
|
||||
super(RequirementsForm, self)._proceed_previous_data(previous_data)
|
||||
def _proceed_session_data(self, session_data):
|
||||
super(RequirementsForm, self)._proceed_session_data(session_data)
|
||||
|
||||
sport = previous_data.get('sport', None)
|
||||
level = previous_data.get('level', None)
|
||||
terrain = previous_data.get('terrain', None)
|
||||
sport = session_data.get('sport', None)
|
||||
level = session_data.get('level', None)
|
||||
terrain = session_data.get('terrain', None)
|
||||
|
||||
if sport == 'B':
|
||||
self.fields['equipment'].initial = u'%s (%s)' % (
|
||||
@@ -465,7 +520,7 @@ class RequirementsForm(ChainedForm):
|
||||
self.fields['requirements'].initial = _(u'Gehzeit X-Y Stunden, ca. X km, ca. X Hm')
|
||||
|
||||
|
||||
class DescriptionForm(ChainedForm):
|
||||
class DescriptionForm(EventCreateForm):
|
||||
_form_title = _(u'Titel / Beschreibung')
|
||||
_next_form_name = 'RegistrationForm'
|
||||
|
||||
@@ -475,14 +530,14 @@ class DescriptionForm(ChainedForm):
|
||||
description = forms.CharField(label=_(u'Beschreibung'),
|
||||
widget=forms.Textarea(attrs={'placeholder': u''}))
|
||||
|
||||
def _proceed_previous_data(self, previous_data):
|
||||
super(DescriptionForm, self)._proceed_previous_data(previous_data)
|
||||
def _proceed_session_data(self, session_data):
|
||||
super(DescriptionForm, self)._proceed_session_data(session_data)
|
||||
|
||||
mode = previous_data.get('mode', None)
|
||||
sport = previous_data.get('sport', None)
|
||||
level = previous_data.get('level', None)
|
||||
terrain = previous_data.get('terrain', None)
|
||||
last_day = previous_data.get('last_day', None)
|
||||
mode = session_data.get('mode', None)
|
||||
sport = session_data.get('sport', None)
|
||||
level = session_data.get('level', None)
|
||||
terrain = session_data.get('terrain', None)
|
||||
last_day = session_data.get('last_day', None)
|
||||
|
||||
title_prefix = u''
|
||||
if mode == 'training':
|
||||
@@ -510,7 +565,7 @@ class DescriptionForm(ChainedForm):
|
||||
self.fields['title'].initial = title_prefix
|
||||
|
||||
|
||||
class RegistrationForm(ChainedForm):
|
||||
class RegistrationForm(EventCreateForm):
|
||||
_form_title = _(u'Teilnehmer / Anmeldung')
|
||||
_next_form_name = 'TrainerForm'
|
||||
|
||||
@@ -544,10 +599,10 @@ class RegistrationForm(ChainedForm):
|
||||
},
|
||||
bootstrap_version=3))
|
||||
|
||||
def _proceed_previous_data(self, previous_data):
|
||||
super(RegistrationForm, self)._proceed_previous_data(previous_data)
|
||||
def _proceed_session_data(self, session_data):
|
||||
super(RegistrationForm, self)._proceed_session_data(session_data)
|
||||
|
||||
first_day = previous_data.get('first_day', None)
|
||||
first_day = session_data.get('first_day', None)
|
||||
if first_day:
|
||||
new_choices = []
|
||||
for key, desc in self.fields['deadline'].choices:
|
||||
@@ -571,7 +626,7 @@ class RegistrationForm(ChainedForm):
|
||||
self.fields['deadline'].choices = new_choices
|
||||
|
||||
|
||||
class TrainerForm(ChainedForm):
|
||||
class TrainerForm(EventCreateForm):
|
||||
_form_title = _(u'Tourenleitung')
|
||||
_next_form_name = 'ChargesForm'
|
||||
|
||||
@@ -616,8 +671,8 @@ class TrainerForm(ChainedForm):
|
||||
help_text=_(u'Kann freigelassen werden'),
|
||||
)
|
||||
|
||||
def _proceed_previous_data(self, previous_data):
|
||||
super(TrainerForm, self)._proceed_previous_data(previous_data)
|
||||
def _proceed_session_data(self, session_data):
|
||||
super(TrainerForm, self)._proceed_session_data(session_data)
|
||||
|
||||
self.fields['trainer_firstname'].widget.attrs['placeholder'] = _(u'Erik')
|
||||
self.fields['trainer_familyname'].widget.attrs['placeholder'] = _(u'Müller')
|
||||
@@ -636,7 +691,7 @@ class TrainerForm(ChainedForm):
|
||||
self.fields['trainer_email'].initial = self.fields['trainer_email'].widget.attrs['placeholder']
|
||||
|
||||
|
||||
class ChargesForm(ChainedForm):
|
||||
class ChargesForm(EventCreateForm):
|
||||
_form_title = _(u'Kosten')
|
||||
_next_form_name = 'OverviewForm'
|
||||
|
||||
@@ -669,19 +724,19 @@ class ChargesForm(ChainedForm):
|
||||
label=_(u'Zusätzliche Kosten (Text)'),
|
||||
)
|
||||
|
||||
def _proceed_previous_data(self, previous_data):
|
||||
super(ChargesForm, self)._proceed_previous_data(previous_data)
|
||||
def _proceed_session_data(self, session_data):
|
||||
super(ChargesForm, self)._proceed_session_data(session_data)
|
||||
|
||||
mode = previous_data.get('mode', None)
|
||||
sport = previous_data.get('sport', None)
|
||||
ski_lift = previous_data.get('ski_lift', False)
|
||||
terrain = previous_data.get('terrain', None)
|
||||
country = previous_data.get('country', None)
|
||||
first_day = previous_data.get('first_day', None)
|
||||
arrival_previous_day = previous_data.get('arrival_previous_day', False)
|
||||
last_day = previous_data.get('last_day', None)
|
||||
pre_meeting_1 = previous_data.get('pre_meeting_1', None)
|
||||
pre_meeting_2 = previous_data.get('pre_meeting_2', None)
|
||||
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)
|
||||
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)
|
||||
pre_meeting_1 = session_data.get('pre_meeting_1', None)
|
||||
pre_meeting_2 = session_data.get('pre_meeting_2', None)
|
||||
|
||||
if ski_lift:
|
||||
charge_key = 'K'
|
||||
@@ -801,5 +856,5 @@ class ChargesForm(ChainedForm):
|
||||
self.fields['additional_costs'].initial = additional_costs_text
|
||||
|
||||
|
||||
class OverviewForm(ChainedForm):
|
||||
class OverviewForm(EventCreateForm):
|
||||
_form_title = _(u'Übersicht')
|
||||
Reference in New Issue
Block a user