Prepare for operations on the election
This commit is contained in:
parent
bc7967f01a
commit
78a96f8067
3 changed files with 105 additions and 4 deletions
|
@ -6,9 +6,12 @@
|
|||
|
||||
<div class="level">
|
||||
<div class="level-left">
|
||||
{# Titre de l'élection #}
|
||||
<div class="level-item">
|
||||
<h1 class="title">{{ election.name }}</h1>
|
||||
</div>
|
||||
|
||||
{# Dates d'ouverture de l'élection #}
|
||||
<div class="level-item">
|
||||
<span class="tag is-medium is-primary">{{ election.start_date|date:"d/m/Y H:i" }}</span>
|
||||
<span class="icon">
|
||||
|
@ -17,8 +20,12 @@
|
|||
<span class="tag is-medium is-primary">{{ election.end_date|date:"d/m/Y H:i" }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="level-right">
|
||||
<div class="level-item">
|
||||
{% if election.start_date > current_time %}
|
||||
|
||||
{# Lien pour la modification #}
|
||||
<a class="button is-light is-outlined is-primary" href="{% url 'election.update' election.pk %}">
|
||||
<span class="icon">
|
||||
<i class="fas fa-edit"></i>
|
||||
|
@ -26,21 +33,57 @@
|
|||
|
||||
{% trans "Modifier" %}
|
||||
</a>
|
||||
{% elif election.end_date < current_time %}
|
||||
{% if not election.tallied %}
|
||||
|
||||
{# Lien pour le dépouillement #}
|
||||
<a class="button is-light is-outlined is-primary" href="{% url 'election.tally' election.pk %}">
|
||||
<span class="icon">
|
||||
<i class="fas fa-poll-h"></i>
|
||||
</span>
|
||||
|
||||
{% trans "Dépouiller" %}
|
||||
</a>
|
||||
{% else %}
|
||||
|
||||
{# Lien pour la publication des résultats #}
|
||||
<a class="button is-light is-outlined is-primary" href="{% url 'election.publish' election.pk %}">
|
||||
<span class="icon">
|
||||
<i class="fas fa-edit"></i>
|
||||
</span>
|
||||
|
||||
{% trans "Publier" %}
|
||||
</a>
|
||||
|
||||
{# Lien pour l'archivage #}
|
||||
<a class="button is-light is-outlined is-primary" href="{% url 'election.archive' election.pk %}">
|
||||
<span class="icon">
|
||||
<i class="fas fa-edit"></i>
|
||||
</span>
|
||||
|
||||
{% trans "Archiver" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
|
||||
{# Description de l'élection #}
|
||||
<div class="message is-primary">
|
||||
<div class="message-body">{{ election.description|linebreaksbr }}</div>
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
|
||||
{# Liste des questions #}
|
||||
{% for q in election.questions.all %}
|
||||
<div class="panel">
|
||||
<div class="panel-heading is-size-6">
|
||||
{{ q.text }}
|
||||
{{ q.text }}
|
||||
{% if election.start_date > current_time %}
|
||||
|
||||
<a class="tag is-small is-outlined is-light is-danger">
|
||||
<span class="icon">
|
||||
<i class="fas fa-times"></i>
|
||||
|
@ -53,9 +96,13 @@
|
|||
</span>
|
||||
{% trans "Modifier" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{# Liste des options possibles #}
|
||||
{% for o in q.options.all %}
|
||||
<div class="panel-block">
|
||||
{% if election.start_date > current_time %}
|
||||
<div class="tags has-addons">
|
||||
<a class="tag is-danger" title="{% trans "Supprimer" %}">
|
||||
<span class="icon">
|
||||
|
@ -67,11 +114,17 @@
|
|||
<i class="fas fa-edit"></i>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
{{ o.text }}
|
||||
</div>
|
||||
{% elif election.tallied %}
|
||||
<span class="tag is-primary">
|
||||
</span>
|
||||
{% endif %}
|
||||
{{ o.text }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
{# Rajout d'une option #}
|
||||
{% if election.start_date > current_time %}
|
||||
<form action="" method="POST">
|
||||
<div class="panel-block field has-addons">
|
||||
{% csrf_token %}
|
||||
|
@ -87,9 +140,12 @@
|
|||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
{# Rajout d'une question #}
|
||||
{% if election.start_date > current_time %}
|
||||
<div class="columns is-centered">
|
||||
<div class="column is-two-thirds">
|
||||
<form action="" method="POST">
|
||||
|
@ -109,6 +165,7 @@
|
|||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
|
|
@ -6,6 +6,13 @@ urlpatterns = [
|
|||
path("create/", views.ElectionCreateView.as_view(), name="election.create"),
|
||||
path("admin/<int:pk>", views.ElectionAdminView.as_view(), name="election.admin"),
|
||||
path("update/<int:pk>", views.ElectionUpdateView.as_view(), name="election.update"),
|
||||
path("tally/<int:pk>", views.ElectionTallyView.as_view(), name="election.tally"),
|
||||
path(
|
||||
"publish/<int:pk>", views.ElectionPublishView.as_view(), name="election.publish"
|
||||
),
|
||||
path(
|
||||
"archive/<int:pk>", views.ElectionArchiveView.as_view(), name="election.archive"
|
||||
),
|
||||
path("view/<int:pk>", views.ElectionView.as_view(), name="election.view"),
|
||||
path("vote/<int:pk>", views.VoteView.as_view(), name="election.vote"),
|
||||
]
|
||||
|
|
|
@ -3,8 +3,10 @@ from django.contrib.messages.views import SuccessMessageMixin
|
|||
from django.db.models import Count, Prefetch
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.views.generic import CreateView, DetailView, UpdateView
|
||||
from django.views.generic import CreateView, DetailView, RedirectView, UpdateView
|
||||
from django.views.generic.detail import SingleObjectMixin
|
||||
|
||||
from .forms import OptionFormSet
|
||||
from .models import Election, Option, Question
|
||||
|
@ -24,6 +26,10 @@ class ElectionAdminView(DetailView):
|
|||
model = Election
|
||||
template_name = "elections/election_admin.html"
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs.update({"current_time": timezone.now()})
|
||||
return super().get_context_data(**kwargs)
|
||||
|
||||
def get_queryset(self):
|
||||
return super().get_queryset().prefetch_related("questions__options")
|
||||
|
||||
|
@ -32,12 +38,43 @@ class ElectionUpdateView(SuccessMessageMixin, UpdateView):
|
|||
model = Election
|
||||
fields = ["name", "description", "start_date", "end_date"]
|
||||
success_message = _("Élection modifiée avec succès !")
|
||||
template_name = "elections/election_update.html"
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse("election.admin", args=[self.object.pk])
|
||||
|
||||
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 ElectionTallyView(SuccessMessageMixin, SingleObjectMixin, RedirectView):
|
||||
model = Election
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
election = self.get_object()
|
||||
election.update(tallied=True)
|
||||
return super().get(request, *args, **kwargs)
|
||||
|
||||
|
||||
class ElectionPublishView(SuccessMessageMixin, SingleObjectMixin, RedirectView):
|
||||
model = Election
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
election = self.get_object()
|
||||
election.update(tallied=True)
|
||||
return super().get(request, *args, **kwargs)
|
||||
|
||||
|
||||
class ElectionArchiveView(SuccessMessageMixin, SingleObjectMixin, RedirectView):
|
||||
model = Election
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
election = self.get_object()
|
||||
election.update(tallied=True)
|
||||
return super().get(request, *args, **kwargs)
|
||||
|
||||
|
||||
class ElectionView(DetailView):
|
||||
model = Election
|
||||
template_name = "elections/election.html"
|
||||
|
|
Loading…
Reference in a new issue