From a675b852655477de22b7dde7a8f40ba76ea4e034 Mon Sep 17 00:00:00 2001 From: Artur Barseghyan Date: Sun, 17 Dec 2017 21:35:05 +0100 Subject: [PATCH] add db store callback --- .../form_handlers/db_store/callbacks.py | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/fobi/contrib/plugins/form_handlers/db_store/callbacks.py diff --git a/src/fobi/contrib/plugins/form_handlers/db_store/callbacks.py b/src/fobi/contrib/plugins/form_handlers/db_store/callbacks.py new file mode 100644 index 00000000..9d46c708 --- /dev/null +++ b/src/fobi/contrib/plugins/form_handlers/db_store/callbacks.py @@ -0,0 +1,65 @@ +import datetime + +import simplejson as json + +from fobi.base import ( + FormCallback, + get_processed_form_data, +) +from fobi.constants import CALLBACK_FORM_VALID +from .models import SavedFormDataEntry + +__title__ = 'fobi.contrib.plugins.form_handlers.db_store.callbacks' +__author__ = 'Artur Barseghyan ' +__copyright__ = '2014-2017 Artur Barseghyan' +__license__ = 'GPL 2.0/LGPL 2.1' +__all__ = ( + 'AutoFormDbStore', +) + + +class AutoFormDbStore(FormCallback): + """Auto save form entries. + + Note, that this callback is not active. In order to activate it, you + should import the ``AutoFormDbStore`` and register it using the + callback register as follows. + + >>> from fobi.base import form_callback_registry + >>> from fobi.contrib.plugins.form_handlers.db_store.callbacks import ( + >>> AutoFormDbStore + >>> ) + >>> form_callback_registry.register(AutoFormDbStore) + """ + + stage = CALLBACK_FORM_VALID + + def callback(self, form_entry, request, form): + """Callback. + + :param form_entry: + :param request: + :param form: + :return: + """ + form_element_entries = form_entry.formelemententry_set.all() + + # Clean up the values, leave our content fields and empty values. + field_name_to_label_map, cleaned_data = get_processed_form_data( + form, + form_element_entries + ) + + for key, value in cleaned_data.items(): + if isinstance(value, (datetime.datetime, datetime.date)): + cleaned_data[key] = value.isoformat() \ + if hasattr(value, 'isoformat') \ + else value + + saved_form_data_entry = SavedFormDataEntry( + form_entry=form_entry, + user=request.user if request.user and request.user.pk else None, + form_data_headers=json.dumps(field_name_to_label_map), + saved_data=json.dumps(cleaned_data) + ) + saved_form_data_entry.save()