Finalized copy event feature.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user