From e669d5b55b7b0127fa3874365fd9cdddd4976a12 Mon Sep 17 00:00:00 2001 From: heinzel Date: Sun, 25 Feb 2018 17:04:32 +0100 Subject: [PATCH] Moved event specific code from ChainedForm to EventCreateForm via ModelMixin. --- dav_events/forms/events.py | 15 ++++++++++-- dav_events/forms/generic.py | 49 +++++++++++++++++-------------------- dav_events/views/events.py | 2 +- 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/dav_events/forms/events.py b/dav_events/forms/events.py index dccba01..0e991c6 100644 --- a/dav_events/forms/events.py +++ b/dav_events/forms/events.py @@ -12,7 +12,7 @@ from datetimewidget.widgets import DateWidget, TimeWidget, DateTimeWidget from .. import choices from .. import config from .. import models -from .generic import ChainedForm +from .generic import ChainedForm, ModelMixin app_config = apps.get_containing_app_config(__package__) logger = logging.getLogger(__name__) @@ -74,10 +74,21 @@ class EventUpdateForm(forms.ModelForm): 'published', 'published_at', 'published_by',) -class EventCreateForm(ChainedForm): +class EventCreateForm(ModelMixin, ChainedForm): _model = models.Event _initial_form_name = 'ModeForm' + 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) diff --git a/dav_events/forms/generic.py b/dav_events/forms/generic.py index 2760290..9f8303e 100644 --- a/dav_events/forms/generic.py +++ b/dav_events/forms/generic.py @@ -56,15 +56,6 @@ class ChainedForm(forms.Form): self._session_data.update(self.cleaned_data) self._save_session_data() - 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__ @@ -111,27 +102,31 @@ class ChainedForm(forms.Form): value = app_config.settings.form_initials[form_name][field_name].get_value(self._session_data) return value - def save(self): - object_kwargs = dict() - data = self._session_data.copy() - 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) - 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) if session_var_name in self._request.session: del self._request.session[session_var_name] self._session_data = dict() + + +class ModelMixin(object): + _model = None + + def _get_model(self): + if not self._model: + raise ImproperlyConfigured('{cls} is missing a Model.' + ' Define {cls}._model'.format(cls=self.__class__.__name__)) + return self._model + + def _get_instance_kwargs(self): + return self.cleaned_data + + def get_instance(self): + model = self._get_model() + kwargs1 = self._get_instance_kwargs() + kwargs2 = dict() + for attr in kwargs1: + if hasattr(model, attr): + kwargs2[attr] = kwargs1[attr] + return model(**kwargs2) diff --git a/dav_events/views/events.py b/dav_events/views/events.py index 2e32005..7cc1c48 100644 --- a/dav_events/views/events.py +++ b/dav_events/views/events.py @@ -256,7 +256,7 @@ class EventCreateView(generic.FormView): return context def form_valid(self, form): - event = form.save() + event = form.get_instance() next_form_name = form.next_form_name if next_form_name: