diff --git a/elections/models.py b/elections/models.py
index 07d1f17..3d4fda0 100644
--- a/elections/models.py
+++ b/elections/models.py
@@ -3,6 +3,7 @@ from translated_fields import TranslatedFieldWithFallback
from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.db import models, transaction
+from django.template.loader import render_to_string
from django.utils.translation import gettext_lazy as _
from shared.utils import choices_length
@@ -112,6 +113,12 @@ class Question(models.Model):
tally_function = getattr(TallyFunctions, TALLY_FUNCTIONS[self.type])
tally_function(self)
+ @property
+ def results(self):
+ return render_to_string(
+ f"elections/results/{self.vote_type}_export.txt", {"question": self}
+ )
+
def get_formset(self):
from .forms import BallotFormset # Avoid circular imports
diff --git a/elections/templates/elections/election_admin.html b/elections/templates/elections/election_admin.html
index fcdf5d1..0d492c0 100644
--- a/elections/templates/elections/election_admin.html
+++ b/elections/templates/elections/election_admin.html
@@ -128,6 +128,14 @@
{% endif %}
+ {# Export des résultats #}
+
+
+
+
+ {% trans "Télécharger les résultats" %}
+
+
{# Archivage #}
{% if not election.archived %}
diff --git a/elections/templates/elections/results/rank_export.txt b/elections/templates/elections/results/rank_export.txt
new file mode 100644
index 0000000..24c82a9
--- /dev/null
+++ b/elections/templates/elections/results/rank_export.txt
@@ -0,0 +1,3 @@
+{{ question.text }} :
+{% for o in question.options.all %}- ({% if o.abbreviation %}{{ o.abbreviation }}{% else %}{{ forloop.counter }}{% endif %}) {{ o.text }}{% if not forloop.last %}
+{% endif %}{% endfor %}
diff --git a/elections/templates/elections/results/select_export.txt b/elections/templates/elections/results/select_export.txt
new file mode 100644
index 0000000..625dc85
--- /dev/null
+++ b/elections/templates/elections/results/select_export.txt
@@ -0,0 +1,3 @@
+{{ question.text }} :
+{% for o in question.options.all %}- {{ o.nb_votes }} {{ o.text }}{% if not forloop.last %}
+{% endif %}{% endfor %}
diff --git a/elections/urls.py b/elections/urls.py
index 974f6fa..e065b2d 100644
--- a/elections/urls.py
+++ b/elections/urls.py
@@ -21,6 +21,11 @@ urlpatterns = [
views.ExportVotersView.as_view(),
name="election.export-voters",
),
+ path(
+ "results/",
+ views.DownloadResultsView.as_view(),
+ name="election.download-results",
+ ),
path(
"delete-vote///",
views.DeleteVoteView.as_view(),
diff --git a/elections/views.py b/elections/views.py
index 1214807..d63b5b7 100644
--- a/elections/views.py
+++ b/elections/views.py
@@ -298,6 +298,21 @@ class ElectionChangePublicationView(ClosedElectionMixin, BackgroundUpdateView):
return super().get(request, *args, **kwargs)
+class DownloadResultsView(CreatorOnlyMixin, SingleObjectMixin, View):
+ model = Election
+
+ def get_queryset(self):
+ return super().get_queryset().filter(tallied=True)
+
+ def get(self, request, *args, **kwargs):
+ content = "\n".join([q.results for q in self.get_object().questions.all()])
+
+ response = HttpResponse(content, content_type="text/plain")
+ response["Content-Disposition"] = "attachment; filename=results.txt"
+
+ return response
+
+
class ElectionArchiveView(ClosedElectionMixin, BackgroundUpdateView):
model = Election
pattern_name = "election.admin"