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")