Finalized copy event feature.

This commit is contained in:
2018-03-14 15:00:23 +01:00
parent 9da5997447
commit 80f5012ff0
6 changed files with 96 additions and 61 deletions

View File

@@ -6,7 +6,7 @@ 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 LazyTypedChoiceField
from django_countries.fields import Country, LazyTypedChoiceField
from datetimewidget.widgets import DateWidget, TimeWidget, DateTimeWidget
from .. import choices
@@ -80,6 +80,12 @@ 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:
@@ -264,8 +270,8 @@ class LocationForm(EventCreateForm):
label=_(u'Anderes Verkehrsmittel zur An- und Abreise'),
)
def _proceed_session_data(self, session_data):
super(LocationForm, self)._proceed_session_data(session_data)
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)
@@ -386,8 +392,8 @@ class JourneyForm(EventCreateForm):
return 'AccommodationForm'
return super(JourneyForm, self).next_form_name
def _proceed_session_data(self, session_data):
super(JourneyForm, self)._proceed_session_data(session_data)
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)
@@ -438,8 +444,8 @@ class AccommodationForm(EventCreateForm):
label=_(u'Andere Verpflegung'),
)
def _proceed_session_data(self, session_data):
super(AccommodationForm, self)._proceed_session_data(session_data)
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')
@@ -548,8 +554,8 @@ class TrainerForm(EventCreateForm):
help_text=_(u'Kann freigelassen werden'),
)
def _proceed_session_data(self, session_data):
super(TrainerForm, self)._proceed_session_data(session_data)
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')
@@ -635,8 +641,8 @@ class RegistrationForm(EventCreateForm):
return value
def _proceed_session_data(self, session_data):
super(RegistrationForm, self)._proceed_session_data(session_data)
def proceed_session_data(self, session_data):
super(RegistrationForm, self).proceed_session_data(session_data)
first_day = session_data.get('first_day', None)
@@ -705,8 +711,8 @@ class ChargesForm(EventCreateForm):
return 'TrainingForm'
return super(ChargesForm, self).next_form_name
def _proceed_session_data(self, session_data):
super(ChargesForm, self)._proceed_session_data(session_data)
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)
@@ -890,7 +896,7 @@ class SummaryForm(EventCreateForm):
u' für Tourenreferenten und Redakteure eingeben.'),
widget=forms.Textarea(attrs={'rows': 5}))
def _proceed_session_data(self, session_data):
def proceed_session_data(self, session_data):
registration_required = self._session_data.get('registration_required', False)
if registration_required:
deadline = self._session_data.get('deadline', None)
@@ -901,7 +907,7 @@ class SummaryForm(EventCreateForm):
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.')
logger.error('SummaryForm.proceed_session_data(): invalid value for deadline.')
deadline = None
if deadline:
@@ -916,7 +922,7 @@ class SummaryForm(EventCreateForm):
for year in (today.year, today.year + 1):
for issue in app_config.settings.publish_issues:
if not ('issue' in issue and 'release' in issue and 'deadline' in issue):
logger.error('SummaryForm._proceed_session_data(): invalid configured issue.')
logger.error('SummaryForm.proceed_session_data(): invalid configured issue.')
continue
issue_release = datetime.date(year, issue['release'][1], issue['release'][0])

View File

@@ -17,7 +17,13 @@ class ChainedForm(forms.Form):
def __init__(self, *args, **kwargs):
self._session_data = dict()
self._request = kwargs.pop('request', None)
self._load_session_data()
self.load_session_data()
if 'instance' in kwargs:
if hasattr(self, 'load_from_instance'):
self._session_data.update(self.load_from_instance(kwargs.pop('instance')))
else:
raise TypeError('Keyword argument \'instance\' requires method \'load_from_instance\'')
if 'initial' not in kwargs:
kwargs['initial'] = self._session_data
@@ -26,7 +32,7 @@ class ChainedForm(forms.Form):
super(ChainedForm, self).__init__(*args, **kwargs)
self._proceed_session_data(self._session_data)
self.proceed_session_data(self._session_data)
def _serialize_value(self, value):
return converters.Iso8601Serializer.serialize(value, ignore_unsupported_input=True)
@@ -34,27 +40,9 @@ class ChainedForm(forms.Form):
def _deserialize_value(self, value):
return converters.Iso8601Serializer.deserialize(value, ignore_unsupported_input=True)
def _load_session_data(self):
if self._request is not None and hasattr(self._request, 'session'):
session_var_name = '{}_chained_form_session_data'.format(self._request.resolver_match.url_name)
session_data = self._request.session.get(session_var_name, dict())
for k in session_data:
self._session_data[k] = self._deserialize_value(session_data[k])
def _proceed_session_data(self, session_data):
pass
def _save_session_data(self):
if self._request is not None and hasattr(self._request, 'session'):
session_var_name = '{}_chained_form_session_data'.format(self._request.resolver_match.url_name)
session_data = dict()
for k in self._session_data:
session_data[k] = self._serialize_value(self._session_data[k])
self._request.session[session_var_name] = session_data
def _post_clean(self):
self._session_data.update(self.cleaned_data)
self._save_session_data()
self.save_session_data()
@property
def form_name(self):
@@ -72,6 +60,10 @@ class ChainedForm(forms.Form):
def next_form_name(self):
return self.__class__.get_next_form_name()
@property
def session_data(self):
return self._session_data
@classmethod
def get_form_name(cls):
return cls.__name__
@@ -102,6 +94,41 @@ class ChainedForm(forms.Form):
value = app_config.settings.form_initials[form_name][field_name].get_value(self._session_data)
return value
def load_session_data(self, data=None, request=None):
if data is None:
if request is None:
if self._request is None:
logger.warning('ChainedForm.load_session_data(): Cannot access request.')
return
request = self._request
if not hasattr(request, 'session'):
logger.warning('ChainedForm.load_session_data(): Cannot access session.')
return
session_var_name = '{}_chained_form_session_data'.format(request.resolver_match.url_name)
data = request.session.get(session_var_name, dict())
for k in data:
self._session_data[k] = self._deserialize_value(data[k])
def save_session_data(self, request=None):
if request is None:
if self._request is None:
logger.warning('ChainedForm.save_session_data(): Cannot access request.')
return
request = self._request
if not hasattr(request, 'session'):
logger.warning('ChainedForm.save_session_data(): Cannot access session.')
return
session_var_name = '{}_chained_form_session_data'.format(request.resolver_match.url_name)
session_data = dict()
for k in self._session_data:
session_data[k] = self._serialize_value(self._session_data[k])
request.session[session_var_name] = session_data
return session_data
def proceed_session_data(self, session_data):
pass
def flush_session_data(self):
if self._request is not None and hasattr(self._request, 'session'):
session_var_name = '{}_chained_form_session_data'.format(self._request.resolver_match.url_name)
@@ -135,10 +162,9 @@ class ModelMixin(object):
model = self._get_model()
if not isinstance(instance, model):
raise TypeError('Expected %s' % model.__class__.__name__)
self.is_bound = True
self.data = {}
self.cleaned_data = {}
data = {}
for field in instance._meta.get_fields():
self.data[field.name] = getattr(instance, field.name)
self.cleaned_data[field.name] = getattr(instance, field.name)
self._post_clean()
data[field.name] = getattr(instance, field.name)
self.is_bound = True
self.data = data
return data