-
- {%- if role.max_choice == 1 and election.can_vote(user) %}
+ |
+ {%- if role.max_choice == 1 and show_vote_buttons %}
-
-
- {%- set _ = count.append(count.pop() + 1) %}
{%- endif %}
{%- if election.is_vote_finished %}
{%- set results = election_results[role.title]['blank vote'] %}
@@ -126,13 +131,14 @@
{%- endif %}
|
{%- for election_list in election_lists %}
-
+ |
- {%- for candidature in election_list.candidatures.filter(role=role) %}
+ {%- for candidature in election_list.candidatures.select_related("user", "user__profile_pict").filter(role=role) %}
-
- {%- if election.can_vote(user) %}
-
-
+ {%- if show_vote_buttons %}
+ {% set input_id = "candidature_" + candidature.id|string %}
+
+
{%- endif %}
{%- if user.is_subscriber_viewable %}
@@ -146,7 +152,7 @@
{{ candidature.user.first_name }} {{candidature.user.nick_name or ''}} {{ candidature.user.last_name }}
{%- if not election.is_vote_finished %}
- {{ candidature.program|markdown or '' }}
+ {{ candidature.program|markdown }}
{%- endif %}
@@ -159,9 +165,8 @@
{%- endif -%}
{%- endif -%}
- {%- if election.can_vote(user) %}
+ {%- if show_vote_buttons %}
- {%- set _ = count.append(count.pop() + 1) %}
{%- endif %}
{%- if election.is_vote_finished %}
{%- set results = election_results[role.title][candidature.user.username] %}
@@ -197,7 +202,7 @@
{% trans %}Delete{% endtrans %}
{%- endif %}
- {%- if not election.has_voted(user) and election.can_vote(user) %}
+ {%- if show_vote_buttons %}
diff --git a/election/views.py b/election/views.py
index 84587a9e..c95a5684 100644
--- a/election/views.py
+++ b/election/views.py
@@ -4,7 +4,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMix
from django.core.exceptions import PermissionDenied
from django.db import transaction
from django.db.models import QuerySet
-from django.shortcuts import get_object_or_404, redirect
+from django.shortcuts import get_object_or_404
from django.urls import reverse, reverse_lazy
from django.views.generic import DetailView, ListView
from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView
@@ -30,25 +30,21 @@ class ElectionsListView(CanViewMixin, ListView):
"""A list of all non archived elections visible."""
model = Election
+ queryset = model.objects.filter(archived=False)
ordering = ["-id"]
paginate_by = 10
template_name = "election/election_list.jinja"
- def get_queryset(self):
- return super().get_queryset().filter(archived=False).all()
-
class ElectionListArchivedView(CanViewMixin, ListView):
"""A list of all archived elections visible."""
model = Election
+ queryset = model.objects.filter(archived=True)
ordering = ["-id"]
paginate_by = 10
template_name = "election/election_list.jinja"
- def get_queryset(self):
- return super().get_queryset().filter(archived=True).all()
-
class ElectionDetailView(CanViewMixin, DetailView):
"""Details an election responsability by responsability."""
@@ -57,32 +53,42 @@ class ElectionDetailView(CanViewMixin, DetailView):
template_name = "election/election_detail.jinja"
pk_url_kwarg = "election_id"
+ @staticmethod
+ def _reorder_votes(action: str, role: int):
+ role = Role.objects.filter(id=role).first()
+ if not role:
+ return
+ if action == "up":
+ role.up()
+ elif action == "down":
+ role.down()
+ elif action == "bottom":
+ role.bottom()
+ elif action == "top":
+ role.top()
+
def get(self, request, *arg, **kwargs):
- response = super().get(request, *arg, **kwargs)
election: Election = self.get_object()
- if request.user.can_edit(election) and election.is_vote_editable:
+ if election.is_vote_editable and request.user.can_edit(election):
action = request.GET.get("action", None)
role = request.GET.get("role", None)
- if action and role and Role.objects.filter(id=role).exists():
- if action == "up":
- Role.objects.get(id=role).up()
- elif action == "down":
- Role.objects.get(id=role).down()
- elif action == "bottom":
- Role.objects.get(id=role).bottom()
- elif action == "top":
- Role.objects.get(id=role).top()
- return redirect(
- reverse("election:detail", kwargs={"election_id": election.id})
- )
- return response
+ if action and role and role.isdigit():
+ self._reorder_votes(action, int(role))
+ return super().get(request, *arg, **kwargs)
def get_context_data(self, **kwargs):
"""Add additionnal data to the template."""
- kwargs = super().get_context_data(**kwargs)
- kwargs["election_form"] = VoteForm(self.object, self.request.user)
- kwargs["election_results"] = self.object.results
- return kwargs
+ user: User = self.request.user
+ return super().get_context_data(**kwargs) | {
+ "election_form": VoteForm(self.object, user),
+ "show_vote_buttons": self.object.can_vote(user),
+ "user_has_voted": self.object.has_voted(user),
+ "election_results": (
+ self.object.results if self.object.is_vote_finished else None
+ ),
+ "election_lists": list(self.object.election_lists.all()),
+ "election_roles": list(self.object.roles.order_by("order")),
+ }
# Form view
@@ -363,18 +369,12 @@ class RoleUpdateView(CanEditMixin, UpdateView):
# Delete Views
-class ElectionDeleteView(DeleteView):
+class ElectionDeleteView(PermissionRequiredMixin, DeleteView):
model = Election
template_name = "core/delete_confirm.jinja"
pk_url_kwarg = "election_id"
-
- def dispatch(self, request, *args, **kwargs):
- if request.user.is_root:
- return super().dispatch(request, *args, **kwargs)
- raise PermissionDenied
-
- def get_success_url(self, **kwargs):
- return reverse_lazy("election:list")
+ permission_required = "election.delete_election"
+ success_url = reverse_lazy("election:list")
class CandidatureDeleteView(CanEditMixin, DeleteView):
@@ -390,7 +390,7 @@ class CandidatureDeleteView(CanEditMixin, DeleteView):
return super().dispatch(request, *arg, **kwargs)
def get_success_url(self, **kwargs):
- return reverse_lazy("election:detail", kwargs={"election_id": self.election.id})
+ return reverse("election:detail", kwargs={"election_id": self.election.id})
class RoleDeleteView(CanEditMixin, DeleteView):
@@ -406,7 +406,7 @@ class RoleDeleteView(CanEditMixin, DeleteView):
return super().dispatch(request, *arg, **kwargs)
def get_success_url(self, **kwargs):
- return reverse_lazy("election:detail", kwargs={"election_id": self.election.id})
+ return reverse("election:detail", kwargs={"election_id": self.election.id})
class ElectionListDeleteView(CanEditMixin, DeleteView):
@@ -422,4 +422,4 @@ class ElectionListDeleteView(CanEditMixin, DeleteView):
return super().dispatch(request, *args, **kwargs)
def get_success_url(self, **kwargs):
- return reverse_lazy("election:detail", kwargs={"election_id": self.election.id})
+ return reverse("election:detail", kwargs={"election_id": self.election.id})
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index 19b164df..6d22e9c9 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-02-25 16:38+0100\n"
+"POT-Creation-Date: 2025-03-16 19:08+0100\n"
"PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Maréchal \n"
@@ -841,7 +841,7 @@ msgstr "vous devez spécifier au moins un utilisateur ou une adresse email"
msgid "Begin date"
msgstr "Date de début"
-#: club/forms.py com/forms.py counter/forms.py election/views.py
+#: club/forms.py com/forms.py counter/forms.py election/forms.py
#: subscription/forms.py
msgid "End date"
msgstr "Date de fin"
@@ -1263,7 +1263,7 @@ msgstr "Propriétés"
msgid "Format: 16:9 | Resolution: 1920x1080"
msgstr "Format : 16:9 | Résolution : 1920x1080"
-#: com/forms.py election/views.py subscription/forms.py
+#: com/forms.py election/forms.py subscription/forms.py
msgid "Start date"
msgstr "Date de début"
@@ -2837,6 +2837,7 @@ msgid "Users"
msgstr "Utilisateurs"
#: core/templates/core/search.jinja core/views/user.py
+#: counter/templates/counter/product_list.jinja
msgid "Clubs"
msgstr "Clubs"
@@ -3182,7 +3183,7 @@ msgid "Bans"
msgstr "Bans"
#: core/templates/core/user_tools.jinja counter/forms.py
-#: counter/views/mixins.py
+#: counter/templates/counter/product_list.jinja counter/views/mixins.py
msgid "Counters"
msgstr "Comptoirs"
@@ -4359,6 +4360,30 @@ msgstr "Le paiement a échoué"
msgid "Return to eboutic"
msgstr "Retourner à l'eboutic"
+#: election/forms.py
+msgid "You have selected too much candidates."
+msgstr "Vous avez sélectionné trop de candidats."
+
+#: election/forms.py
+msgid "User to candidate"
+msgstr "Utilisateur se présentant"
+
+#: election/forms.py election/templates/election/election_detail.jinja
+msgid "Blank vote"
+msgstr "Vote blanc"
+
+#: election/forms.py
+msgid "This role already exists for this election"
+msgstr "Ce rôle existe déjà pour cette élection"
+
+#: election/forms.py
+msgid "Start candidature"
+msgstr "Début des candidatures"
+
+#: election/forms.py
+msgid "End candidature"
+msgstr "Fin des candidatures"
+
#: election/models.py
msgid "start candidature"
msgstr "début des candidatures"
@@ -4383,6 +4408,10 @@ msgstr "groupe de vote"
msgid "candidature groups"
msgstr "groupe de candidature"
+#: election/models.py
+msgid "voters"
+msgstr "électeurs"
+
#: election/models.py
msgid "election"
msgstr "élection"
@@ -4438,17 +4467,10 @@ msgstr "Vous avez déjà soumis votre vote."
msgid "You have voted in this election."
msgstr "Vous avez déjà voté pour cette élection."
-#: election/templates/election/election_detail.jinja election/views.py
-msgid "Blank vote"
-msgstr "Vote blanc"
-
#: election/templates/election/election_detail.jinja
-msgid "You may choose up to"
-msgstr "Vous pouvez choisir jusqu'à"
-
-#: election/templates/election/election_detail.jinja
-msgid "people."
-msgstr "personne(s)"
+#, python-format
+msgid "You may choose up to %(nb_choices)s people."
+msgstr "Vous pouvez choisir jusqu'à %(nb_choices)s personnes."
#: election/templates/election/election_detail.jinja
msgid "Choose blank vote"
@@ -4490,26 +4512,6 @@ msgstr "au"
msgid "Polls open from"
msgstr "Votes ouverts du"
-#: election/views.py
-msgid "You have selected too much candidates."
-msgstr "Vous avez sélectionné trop de candidats."
-
-#: election/views.py
-msgid "User to candidate"
-msgstr "Utilisateur se présentant"
-
-#: election/views.py
-msgid "This role already exists for this election"
-msgstr "Ce rôle existe déjà pour cette élection"
-
-#: election/views.py
-msgid "Start candidature"
-msgstr "Début des candidatures"
-
-#: election/views.py
-msgid "End candidature"
-msgstr "Fin des candidatures"
-
#: forum/models.py
msgid "is a category"
msgstr "est une catégorie"
@@ -5219,15 +5221,15 @@ msgstr "SAS"
msgid "Albums"
msgstr "Albums"
-#: sas/templates/sas/album.jinja
-msgid "Download album"
-msgstr "Télécharger l'album"
-
#: sas/templates/sas/album.jinja sas/templates/sas/macros.jinja
#: sas/templates/sas/user_pictures.jinja
msgid "To be moderated"
msgstr "A modérer"
+#: sas/templates/sas/album.jinja
+msgid "Download album"
+msgstr "Télécharger l'album"
+
#: sas/templates/sas/album.jinja
msgid "Upload"
msgstr "Envoyer"
|