diff --git a/management/templates/management/election.html b/management/templates/management/election.html index 88e11c48063b222f5df320df65a860b4028ac145..fed03b0f37d8089a33fadc67b1c86f7b1e827526 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 cc7ba836e83f8b8bf76da21adf06909b3bc8b0ff..0cea2f70541f54519cbbff8e624e16d75d7c0bd0 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 3c3f06762e119abfdb25270c2bf50f8a5acee534..d72ceabe8be8e23150e0c53b38b9e62b775a08a1 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