diff --git a/src/project/admin.py b/src/project/admin.py index f3c0021..6ea1195 100644 --- a/src/project/admin.py +++ b/src/project/admin.py @@ -2,8 +2,10 @@ from django.contrib import admin from cms.extensions import PageExtensionAdmin from parler.admin import TranslatableAdmin - +from aldryn_forms.models import FormSubmission +from aldryn_forms.admin.base import BaseFormSubmissionAdmin from project.models import ImageExtension, SliderItemQualification, Notification +from project.views import CustomFormExportWizardView @admin.register(ImageExtension) @@ -19,3 +21,15 @@ class SliderItemQualificationAdmin(TranslatableAdmin): @admin.register(Notification) class NotificationAdmin(TranslatableAdmin): pass + + +admin.site.unregister(FormSubmission) + + +@admin.register(FormSubmission) +class FormSubmissionAdmin(BaseFormSubmissionAdmin): + + def get_form_export_view(self): + return CustomFormExportWizardView.as_view(admin=self, file_type='xls') + + diff --git a/src/project/views.py b/src/project/views.py index 506ebac..5596fe2 100644 --- a/src/project/views.py +++ b/src/project/views.py @@ -4,7 +4,10 @@ from cms.models import Page from django.core.urlresolvers import reverse_lazy from django.views.generic import RedirectView from django.views.generic.edit import FormView - +from aldryn_forms.admin.views import FormExportWizardView +from aldryn_forms.admin.exporter import Exporter +from tablib import Dataset +from django.http import HttpResponse from project.forms import NewsletterSubscriptionForm @@ -45,3 +48,57 @@ class MediaRedirectView(RedirectView): def get_redirect_url(self, *args, **kwargs): return self.request.GET.get('url', None) + + +class CustomExporter(Exporter): + custom_fields = ['sent_at'] + + def get_dataset(self, fields): + headers = [field.rpartition('-')[0] for field in fields] + + for custom_field in self.custom_fields: + headers.append(custom_field) + + dataset = Dataset(headers=headers) + + for submission in self.queryset.only('data').iterator(): + row_data = [] + form_fields = [field for field in submission.get_form_data() + if field.field_id in fields] + + for header in fields: + for field in form_fields: + if field.field_id == header: + row_data.append(field.value) + break + else: + row_data.append('') + + if row_data: + for custom_field in self.custom_fields: + row_data.append(getattr(submission, custom_field).strftime('%d.%m.%Y %H:%M:%S')) + dataset.append(row_data) + return dataset + + +class CustomFormExportWizardView(FormExportWizardView): + + def done(self, form_list, **kwargs): + """ + this step only runs if all forms are valid. + """ + form_iter = iter(form_list) + step_1_form = next(form_iter) + step_2_form = next(form_iter) + + fields = step_2_form.get_fields() + queryset = step_1_form.get_queryset() + + dataset = CustomExporter(queryset=queryset).get_dataset(fields=fields) + + filename = step_1_form.get_filename(extension=self.file_type) + + content_type = self.get_content_type() + response = HttpResponse(dataset.xls, content_type=content_type) + response['Content-Disposition'] = 'attachment; filename=%s' % filename + return response