From 022f3f5d61d00ded7dd6ad560df1e7124a1446e9 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Fri, 19 Jan 2018 17:16:15 +0100 Subject: [PATCH] BROKEN: started to improve session passing in chained form. --- dav_events/forms.py | 46 +++++++++++++++++++++++++++------------------ dav_events/views.py | 13 ++++++++----- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/dav_events/forms.py b/dav_events/forms.py index 76a3bf4..529cfc2 100644 --- a/dav_events/forms.py +++ b/dav_events/forms.py @@ -80,13 +80,12 @@ class ChainedForm(forms.Form): def __init__(self, *args, **kwargs): 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_session_data(self._session_data) + self._request = kwargs.pop('request', None) + self._load_session_data() - def _proceed_session_data(self, session_data): - pass + super(ChainedForm, self).__init__(*args, **kwargs) + + self._proceed_session_data(self._session_data) def _serialize_value(self, value): return converters.Iso8601Serializer.serialize(value, ignore_unsupported_input=True) @@ -94,6 +93,24 @@ 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 _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 _proceed_session_data(self, session_data): + pass + def _get_model(self): if not hasattr(self, '_model'): raise ImproperlyConfigured('{cls} is missing a Model.' @@ -128,22 +145,15 @@ 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 - - def add_session_data(self, data): - for k in data: - self._session_data[k] = self._deserialize_value(data[k]) + def clean(self): + cleaned_data = super(ChainedForm, self).clean() + self._session_data.update(cleaned_data) + self._save_session_data() + return cleaned_data 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): diff --git a/dav_events/views.py b/dav_events/views.py index fd494c5..1b57ca3 100644 --- a/dav_events/views.py +++ b/dav_events/views.py @@ -164,21 +164,26 @@ class EventCreateView(generic.FormView): return form_class + def get_form_kwargs(self): + kwargs = super(EventCreateView, self).get_form_kwargs() + if 'request' not in kwargs: + kwargs['request'] = self.request + return kwargs + def get_context_data(self, **kwargs): context = super(EventCreateView, self).get_context_data(**kwargs) context['abort_url'] = self.abort_url return context def form_valid(self, form): - form.add_session_data(self.request.session.get('dav_events_event_create_previous_data', dict())) event = form.save() next_form_name = form.next_form_name if next_form_name: - self.request.session['dav_events_event_create_previous_data'] = form.get_session_data() self.request.session['dav_events_event_create_next_form_name'] = next_form_name next_form_class = self.get_form_class(next_form_name) - next_form = next_form_class(session_data=form.get_session_data()) + # XXX get_form() passes data into form + next_form = self.get_form(form_class=next_form_class) return self.render_to_response(self.get_context_data(form=next_form, event=event)) else: event.save() @@ -198,8 +203,6 @@ class EventCreateView(generic.FormView): session = self.request.session if 'dav_events_event_create_next_form_name' in session: del session['dav_events_event_create_next_form_name'] - if 'dav_events_event_create_previous_data' in session: - del session['dav_events_event_create_previous_data'] def get(self, request, *args, **kwargs): self.clean_session_data(request.session)