Rajoute le téléchargement des résultats en un fichier texte, pour l'instant les votes par classement ne sont pas supportés

This commit is contained in:
Tom Hubrecht 2021-06-10 21:13:48 +02:00
parent 6aa269c2a5
commit bd365fe387
6 changed files with 41 additions and 0 deletions

View file

@ -3,6 +3,7 @@ from translated_fields import TranslatedFieldWithFallback
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
from django.db import models, transaction from django.db import models, transaction
from django.template.loader import render_to_string
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from shared.utils import choices_length from shared.utils import choices_length
@ -112,6 +113,12 @@ class Question(models.Model):
tally_function = getattr(TallyFunctions, TALLY_FUNCTIONS[self.type]) tally_function = getattr(TallyFunctions, TALLY_FUNCTIONS[self.type])
tally_function(self) 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): def get_formset(self):
from .forms import BallotFormset # Avoid circular imports from .forms import BallotFormset # Avoid circular imports

View file

@ -128,6 +128,14 @@
</a> </a>
{% endif %} {% endif %}
{# Export des résultats #}
<a class="dropdown-item" href="{% url 'election.download-results' election.pk %}">
<span class="icon">
<i class="fas fa-save"></i>
</span>
<span>{% trans "Télécharger les résultats" %}</span>
</a>
{# Archivage #} {# Archivage #}
{% if not election.archived %} {% if not election.archived %}
<a class="dropdown-item" href="{% url 'election.archive' election.pk %}"> <a class="dropdown-item" href="{% url 'election.archive' election.pk %}">

View file

@ -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 %}

View file

@ -0,0 +1,3 @@
{{ question.text }} :
{% for o in question.options.all %}- {{ o.nb_votes }} {{ o.text }}{% if not forloop.last %}
{% endif %}{% endfor %}

View file

@ -21,6 +21,11 @@ urlpatterns = [
views.ExportVotersView.as_view(), views.ExportVotersView.as_view(),
name="election.export-voters", name="election.export-voters",
), ),
path(
"results/<int:pk>",
views.DownloadResultsView.as_view(),
name="election.download-results",
),
path( path(
"delete-vote/<int:pk>/<int:user_pk>/<int:anchor>", "delete-vote/<int:pk>/<int:user_pk>/<int:anchor>",
views.DeleteVoteView.as_view(), views.DeleteVoteView.as_view(),

View file

@ -298,6 +298,21 @@ class ElectionChangePublicationView(ClosedElectionMixin, BackgroundUpdateView):
return super().get(request, *args, **kwargs) 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): class ElectionArchiveView(ClosedElectionMixin, BackgroundUpdateView):
model = Election model = Election
pattern_name = "election.admin" pattern_name = "election.admin"