Reporting and export

This chapter covers how to display and export submitted form data.

Displaying submissions in the admin

Use simple_report to render a formatted summary of submitted data directly in the Django admin change view:

from content_editor.contents import contents_for_item
from django.contrib.admin import display
from feincms3_forms.reporting import simple_report

@admin.register(Submission)
class SubmissionAdmin(admin.ModelAdmin):
    @display(description="Submitted data")
    def pretty_data(self, obj):
        return simple_report(
            contents=contents_for_item(
                obj.configured_form, plugins=renderer.plugins()
            ),
            data=obj.data,
        )

Exporting submissions to Excel

from content_editor.contents import contents_for_items
from feincms3_forms.reporting import get_loaders
from xlsxdocument import XLSXDocument

def export_submissions(modeladmin, request, queryset):
    submissions = list(queryset.select_related("configured_form"))
    configured_forms = {sub.configured_form for sub in submissions}

    cf_contents = contents_for_items(configured_forms, plugins=renderer.plugins())
    loaders = {cf: get_loaders(contents) for cf, contents in cf_contents.items()}

    cf_values = {}
    for submission in submissions:
        line = [
            {"label": "ID", "name": "", "value": submission.id},
            {"label": "Email", "name": "", "value": submission.email},
            {"label": "Created", "name": "", "value": submission.created_at},
        ] + [loader(submission.data) for loader in loaders[submission.configured_form]]

        if submission.configured_form not in cf_values:
            cf_values[submission.configured_form] = [
                [cell["label"] for cell in line],
            ]
        cf_values[submission.configured_form].append([cell["value"] for cell in line])

    xlsx = XLSXDocument()
    for configured_form, values in cf_values.items():
        xlsx.add_sheet(str(configured_form)[:30])
        xlsx.table(None, values)

    return xlsx.to_response("submissions.xlsx")

@admin.register(Submission)
class SubmissionAdmin(admin.ModelAdmin):
    actions = [export_submissions]