import datetime
import simplejson as json
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from fobi.base import (
FormHandlerPlugin, form_handler_plugin_registry, get_processed_form_data,
get_form_handler_plugin_widget
)
from . import UID
from .models import SavedFormDataEntry
__title__ = 'fobi.contrib.plugins.form_handlers.db_store.fobi_form_handlers'
__author__ = 'Artur Barseghyan <artur.barseghyan@gmail.com>'
__copyright__ = '2014-2016 Artur Barseghyan'
__license__ = 'GPL 2.0/LGPL 2.1'
__all__ = ('DBStoreHandlerPlugin',)
[docs]class DBStoreHandlerPlugin(FormHandlerPlugin):
"""DB store form handler plugin.
Can be used only once per form.
"""
uid = UID
name = _("DB store")
allow_multiple = False
[docs] def run(self, form_entry, request, form, form_element_entries=None):
"""Run.
:param fobi.models.FormEntry form_entry: Instance of
``fobi.models.FormEntry``.
:param django.http.HttpRequest request:
:param django.forms.Form form:
:param iterable form_element_entries: Iterable of
``fobi.models.FormElementEntry`` objects.
"""
# 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()
[docs] def custom_actions(self, form_entry, request=None):
"""Custom actions.
Adding a link to view the saved form entries.
:return iterable:
"""
widget = get_form_handler_plugin_widget(
self.uid, request=request, as_instance=True
)
if widget:
view_entries_icon_class = widget.view_entries_icon_class
export_entries_icon_class = widget.export_entries_icon_class
else:
view_entries_icon_class = 'glyphicon glyphicon-list'
export_entries_icon_class = 'glyphicon glyphicon-export'
return (
(
reverse('fobi.contrib.plugins.form_handlers.db_store.'
'view_saved_form_data_entries',
args=[form_entry.pk]),
_("View entries"),
view_entries_icon_class
),
(
reverse('fobi.contrib.plugins.form_handlers.db_store.'
'export_saved_form_data_entries',
args=[form_entry.pk]),
_("Export entries"),
export_entries_icon_class
),
)
form_handler_plugin_registry.register(DBStoreHandlerPlugin)