From 5cc59d8ba03857f8f0cf9943293533587ea4032a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20Stra=C3=9Fer?= <andreas.strasser@stusta.de>
Date: Sat, 31 Oct 2020 13:19:24 +0100
Subject: [PATCH] export outcome of the election, issue #009

---
 management/templates/management/election.html |  4 ++
 management/urls.py                            |  2 +
 management/views.py                           | 45 +++++++++++++++++++
 3 files changed, 51 insertions(+)

diff --git a/management/templates/management/election.html b/management/templates/management/election.html
index 88e11c4..fed03b0 100644
--- a/management/templates/management/election.html
+++ b/management/templates/management/election.html
@@ -112,6 +112,10 @@
               {{ election_upload_application_form |crispy }}
               <button type="submit" class="btn btn-info">Apply</button>
             </form>
+            <hr>
+            <h5>Export result</h5>
+            <a href="{% url 'management:export_csv' election.pk %}" class="btn btn-primary mr-2">CSV</a>
+            <a href="{% url 'management:export_json' election.pk %}" class="btn btn-primary">JSON</a>
           {% endif %}
         </div>
       </div>
diff --git a/management/urls.py b/management/urls.py
index cc7ba83..0cea2f7 100644
--- a/management/urls.py
+++ b/management/urls.py
@@ -18,6 +18,8 @@ urlpatterns = [
     path('election/<int:pk>', views.election_detail, name='election'),
     path('election/<int:pk>/delete_voter', views.delete_voter, name='delete_voter'),
     path('election/<int:pk>/delete_election', views.delete_election, name='delete_election'),
+    path('election/<int:pk>/export_csv', views.export_csv, name='export_csv'),
+    path('election/<int:pk>/export_json', views.export_json, name='export_json'),
     path('meeting/<int:pk>/delete_session', views.delete_session, name='delete_session'),
     path('meeting/<int:pk>/print_token', views.print_token, name='print_token'),
     path('meeting/<int:pk>/import_csv', views.import_csv, name='import_csv'),
diff --git a/management/views.py b/management/views.py
index 3c3f067..d72ceab 100644
--- a/management/views.py
+++ b/management/views.py
@@ -4,6 +4,8 @@ from pathlib import Path
 from typing import Dict
 
 import qrcode
+import csv
+import json
 from django.conf import settings
 from django.contrib import messages
 from django.contrib.auth import views as auth_views
@@ -301,3 +303,46 @@ def import_csv(request, pk):
     else:
         form = CSVUploaderForm(session)
     return render(request, 'management/import_csv.html', {'form': form, 'session': session})
+
+
+@management_login_required
+def export_csv(request, pk):
+    e = Election.objects.filter(session__in=request.user.sessions.all(), pk=pk)
+    if not e.exists():
+        raise Http404('Election does not exist')
+    e = e.first()
+
+    response = HttpResponse(content_type='text/csv')
+    response['Content-Disposition'] = 'attachment; filename="results.csv"'
+
+    writer = csv.writer(response)
+    writer.writerow(['#', 'applicant', 'yes', 'no', 'abstention'])
+    for i in range(len(e.election_summary)):
+        a = e.election_summary[i]
+        writer.writerow([i+1, a.get_display_name(), a.votes_accept, a.votes_reject, a.votes_abstention])
+
+    return response
+
+
+@management_login_required
+def export_json(request, pk):
+    e = Election.objects.filter(session__in=request.user.sessions.all(), pk=pk)
+    if not e.exists():
+        raise Http404('Election does not exist')
+    e = e.first()
+
+    json_data = []
+    for a in e.election_summary:
+        json_data.append({
+            "applicant": a.get_display_name(),
+            "yes": a.votes_accept,
+            "no": a.votes_reject,
+            "abstention": a.votes_abstention
+        })
+
+    json_str = json.dumps(json_data)
+
+    response = HttpResponse(json_str, content_type='application/json')
+    response['Content-Disposition'] = 'attachment; filename=result.json'
+
+    return response
-- 
GitLab