Skip to content
Snippets Groups Projects
Commit 95f6ba86 authored by florimondmanca's avatar florimondmanca
Browse files

add csv download on edition form admin

parent af1f7a46
Branches
No related tags found
No related merge requests found
...@@ -42,7 +42,7 @@ class FormAdmin(admin.ModelAdmin): ...@@ -42,7 +42,7 @@ class FormAdmin(admin.ModelAdmin):
def download_csv(self, request, queryset): def download_csv(self, request, queryset):
"""Download entries of selected forms under a ZIP file.""" """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 = ( download_csv.short_description = (
'Télécharger les résponses des formulaires sélectionnés') 'Télécharger les résponses des formulaires sélectionnés')
......
...@@ -53,8 +53,8 @@ def _write_csv(form: Form, stream): ...@@ -53,8 +53,8 @@ def _write_csv(form: Form, stream):
return stream return stream
def write_zip(forms_queryset, stream=None, folder='forms'): def write_zip(forms, stream=None, folder='forms'):
"""Write form entries into a zip of CSV files.""" """Write forms' entries into a zip of CSV files."""
if stream is None: if stream is None:
stream = BytesIO() stream = BytesIO()
# See https://stackoverflow.com/a/32075279 # See https://stackoverflow.com/a/32075279
...@@ -63,7 +63,7 @@ def write_zip(forms_queryset, stream=None, folder='forms'): ...@@ -63,7 +63,7 @@ def write_zip(forms_queryset, stream=None, folder='forms'):
'consider using BytesIO instead' 'consider using BytesIO instead'
) )
with zipfile.ZipFile(stream, 'w') as zip: with zipfile.ZipFile(stream, 'w') as zip:
for form in forms_queryset: for form in forms:
csv_file = StringIO() csv_file = StringIO()
_write_csv(form, csv_file) _write_csv(form, csv_file)
csv_filename = os.path.join(folder, f'{form.slug}.csv') csv_filename = os.path.join(folder, f'{form.slug}.csv')
......
...@@ -28,12 +28,13 @@ class FormEntryViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet): ...@@ -28,12 +28,13 @@ class FormEntryViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):
queryset = FormEntry.objects.all() 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. """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) stream.seek(0)
contents = stream.read() contents = stream.read()
filename = 'responses.zip' filename = 'responses.zip'
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
from django.contrib import admin 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 from .models import Edition, Participation, Project, EditionForm
...@@ -78,6 +80,17 @@ class EditionFormAdmin(admin.ModelAdmin): ...@@ -78,6 +80,17 @@ class EditionFormAdmin(admin.ModelAdmin):
list_display = ('form', 'deadline', 'recipient',) list_display = ('form', 'deadline', 'recipient',)
list_filter = ('edition', 'deadline',) 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) @admin.register(Participation)
class ParticipationAdmin(admin.ModelAdmin): class ParticipationAdmin(admin.ModelAdmin):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment