From 95f6ba86e2f103c55c9ccfe2a5e34f452420f6cb Mon Sep 17 00:00:00 2001
From: florimondmanca <florimond.manca@gmail.com>
Date: Sat, 23 Jun 2018 23:37:24 +0100
Subject: [PATCH] add csv download on edition form admin

---
 dynamicforms/admin.py   |  2 +-
 dynamicforms/exports.py |  6 +++---
 dynamicforms/views.py   |  7 ++++---
 projects/admin.py       | 13 +++++++++++++
 4 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/dynamicforms/admin.py b/dynamicforms/admin.py
index 7fe434e..175bb05 100644
--- a/dynamicforms/admin.py
+++ b/dynamicforms/admin.py
@@ -42,7 +42,7 @@ class FormAdmin(admin.ModelAdmin):
 
     def download_csv(self, request, queryset):
         """Download entries of selected forms under a ZIP file."""
-        return download_multiple_forms_entries(request, queryset)
+        return download_multiple_forms_entries(request, forms=queryset.all())
 
     download_csv.short_description = (
         'Télécharger les résponses des formulaires sélectionnés')
diff --git a/dynamicforms/exports.py b/dynamicforms/exports.py
index 2169840..b1dacf7 100644
--- a/dynamicforms/exports.py
+++ b/dynamicforms/exports.py
@@ -53,8 +53,8 @@ def _write_csv(form: Form, stream):
     return stream
 
 
-def write_zip(forms_queryset, stream=None, folder='forms'):
-    """Write form entries into a zip of CSV files."""
+def write_zip(forms, stream=None, folder='forms'):
+    """Write forms' entries into a zip of CSV files."""
     if stream is None:
         stream = BytesIO()
     # See https://stackoverflow.com/a/32075279
@@ -63,7 +63,7 @@ def write_zip(forms_queryset, stream=None, folder='forms'):
         'consider using BytesIO instead'
     )
     with zipfile.ZipFile(stream, 'w') as zip:
-        for form in forms_queryset:
+        for form in forms:
             csv_file = StringIO()
             _write_csv(form, csv_file)
             csv_filename = os.path.join(folder, f'{form.slug}.csv')
diff --git a/dynamicforms/views.py b/dynamicforms/views.py
index 498963b..a257292 100644
--- a/dynamicforms/views.py
+++ b/dynamicforms/views.py
@@ -28,12 +28,13 @@ class FormEntryViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):
     queryset = FormEntry.objects.all()
 
 
-def download_multiple_forms_entries(request, queryset):
+def download_multiple_forms_entries(request, forms):
     """Download form entries in a ZIP file containing CSV files.
 
-    Note: this is not a proper Django view as it expects a queryset.
+    Note: this is not a proper Django view as it expects an iterable of
+    Form objects (typically a queryset).
     """
-    stream = write_zip(queryset, folder='reponses')
+    stream = write_zip(forms=forms, folder='reponses')
     stream.seek(0)
     contents = stream.read()
     filename = 'responses.zip'
diff --git a/projects/admin.py b/projects/admin.py
index 341c647..2cdb426 100644
--- a/projects/admin.py
+++ b/projects/admin.py
@@ -2,6 +2,8 @@
 
 from django.contrib import admin
 
+from dynamicforms.views import download_multiple_forms_entries
+from dynamicforms.models import Form
 from .models import Edition, Participation, Project, EditionForm
 
 
@@ -78,6 +80,17 @@ class EditionFormAdmin(admin.ModelAdmin):
     list_display = ('form', 'deadline', 'recipient',)
     list_filter = ('edition', 'deadline',)
 
+    actions = ['download_csv']
+
+    def download_csv(self, request, queryset):
+        """Download entries of selected edition forms under a ZIP file."""
+        form_ids = queryset.values_list('form__id', flat=True)
+        forms = Form.objects.filter(id__in=form_ids)
+        return download_multiple_forms_entries(request, forms=forms)
+
+    download_csv.short_description = (
+        'Télécharger les résponses des formulaires sélectionnés')
+
 
 @admin.register(Participation)
 class ParticipationAdmin(admin.ModelAdmin):
-- 
GitLab