From 466d95a10b96ed42c8a59e523124fc8e036717fd Mon Sep 17 00:00:00 2001 From: Ludovic Stephan <ludovic.stephan@ens.fr> Date: Fri, 20 Nov 2020 17:46:53 +0100 Subject: [PATCH] First views --- elections/urls.py | 8 ++++++++ elections/views.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 elections/urls.py create mode 100644 elections/views.py diff --git a/elections/urls.py b/elections/urls.py new file mode 100644 index 0000000..a6a8a7d --- /dev/null +++ b/elections/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path("create/", views.ElectionCreateView.as_view(), name="election.create"), + path("update/<int:pk>", views.ElectionUpdateView.as_view(), name="election.update"), + path("view/<int:pk>", views.ElectionView.as_view(), name="election.view"), +] diff --git a/elections/views.py b/elections/views.py new file mode 100644 index 0000000..71d5295 --- /dev/null +++ b/elections/views.py @@ -0,0 +1,42 @@ +from django.views.generic import CreateView, UpdateView, DetailView +from django.contrib.messages.views import SuccessMessageMixin +from django.utils.translation import gettext_lazy as _ +from django.db.models import Count, Prefetch + +from .models import Election, Question, Option + +# TODO: access control *everywhere* + + +class ElectionCreateView(SuccessMessageMixin, CreateView): + model = Election + fields = ["name", "description", "start_time", "end_time"] + success_message = _("Élection crée avec succès !") + + +class ElectionUpdateView(SuccessMessageMixin, UpdateView): + model = Election + fields = ["name", "description", "start_time", "end_time"] + success_message = _("Élection modifiée avec succès !") + + def get_queryset(self): + # On ne peut plus modifier une élection déjà comptée + return super().get_queryset().filter(tallied=False, archived=False) + + +class ElectionView(DetailView): + model = Election + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + if self.election.tallied: + options_qs = Option.objects.annotate(nb_votes=Count("voters")) + questions = self.election.question.prefetch_related( + Prefetch("options", queryset=options_qs) + ) + context["questions"] = questions + + return context + + def get_queryset(self): + return super().get_queryset().filter(archived=False).select_related("questions")