diff --git a/wagtail/wagtailforms/models.py b/wagtail/wagtailforms/models.py index 1849801e9..7a92f4a3d 100644 --- a/wagtail/wagtailforms/models.py +++ b/wagtail/wagtailforms/models.py @@ -1,5 +1,6 @@ from django.conf import settings +from django.contrib.contenttypes import generic from django.contrib.contenttypes.models import ContentType from django.db import models from django.shortcuts import render @@ -38,7 +39,10 @@ class FormSubmission(models.Model): """Data for a Form submission.""" form_data = models.TextField() - form_page = models.ForeignKey('wagtailcore.Page',related_name='+') + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + form_page = generic.GenericForeignKey('content_type', 'object_id') + submit_time = models.DateTimeField(auto_now_add=True) user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True) @@ -126,11 +130,13 @@ class AbstractForm(Page): i for i in self.form.data.items() if i[0] != 'csrfmiddlewaretoken' ) - FormSubmission.objects.create( + + submission = FormSubmission.objects.create( form_data = json.dumps(form_data), form_page = self, user = request.user, ) + # If we have a form_processing_backend call its process method if hasattr(self, 'form_processing_backend'): form_processor = self.form_processing_backend() diff --git a/wagtail/wagtailforms/templates/wagtailforms/form_index.html b/wagtail/wagtailforms/templates/wagtailforms/form_index.html index 51d4ad03e..220478067 100644 --- a/wagtail/wagtailforms/templates/wagtailforms/form_index.html +++ b/wagtail/wagtailforms/templates/wagtailforms/form_index.html @@ -37,16 +37,18 @@ {% blocktrans with form_title=form_page.title|capfirst %}Submissions of {{ form_title }}{% endblocktrans %} -
+
diff --git a/wagtail/wagtailforms/views.py b/wagtail/wagtailforms/views.py index 898c5954f..566043e2e 100644 --- a/wagtail/wagtailforms/views.py +++ b/wagtail/wagtailforms/views.py @@ -1,7 +1,9 @@ import datetime +import json +import unicodecsv from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger -from django.http import Http404 +from django.http import Http404, HttpResponse from django.shortcuts import get_object_or_404, render, redirect from django.utils.text import capfirst from django.contrib.contenttypes.models import ContentType @@ -43,21 +45,44 @@ def list_submissions(request, app_label, model, id): model = get_form_type_from_url_params(app_label, model).model_class() form_page = get_object_or_404(model, id=id) - submissions = FormSubmission.objects.filter(form_page=form_page) + #submissions = FormSubmission.objects.filter(form_page=form_page) + submissions = FormSubmission.objects.filter(content_type = form_page.content_type, object_id=form_page.id) + select_date_form = SelectDateForm(request.GET) if select_date_form.is_valid(): date_from = select_date_form.cleaned_data.get('date_from') date_to = select_date_form.cleaned_data.get('date_to') # careful: date_to should be increased by 1 day since the submit_time # is a time so it will always be greater - date_to += datetime.timedelta(days=1) + if date_to: + date_to += datetime.timedelta(days=1) if date_from and date_to: submissions=submissions.filter(submit_time__range=[date_from, date_to] ) elif date_from and not date_to: submissions=submissions.filter(submit_time__gte=date_from) elif not date_from and date_to: submissions=submissions.filter(submit_time__lte=date_to) - + + if request.GET.get('action')=='CSV': + # return a CSV instead + response = HttpResponse(content_type='text/csv; charset=utf-8') + response['Content-Disposition'] = 'attachment;filename=export.csv' + writer = unicodecsv.writer(response, encoding='utf-8') + + if submissions: + extra_keys = json.loads(submissions[0].form_data).keys() + + header_row = ['Submission date', 'user',] + header_row.extend(extra_keys) + writer.writerow(header_row) + for s in submissions: + data_row = [s.submit_time, s.user] + form_data = json.loads(s.form_data) + for ek in extra_keys: + data_row.append( form_data.get(ek) ) + writer.writerow(data_row) + return response + p = request.GET.get('p', 1) paginator = Paginator(submissions, 20)