Add time restrictions

This commit is contained in:
Tom Hubrecht 2020-12-19 22:22:23 +01:00
parent bffccdc055
commit 54e9442d7e
2 changed files with 45 additions and 9 deletions

View file

@ -1,7 +1,27 @@
from django import forms from django import forms
from django.forms.models import inlineformset_factory from django.forms.models import inlineformset_factory
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from .models import Option, Question from .models import Election, Option, Question
class ElectionCreateForm(forms.ModelForm):
def clean(self):
cleaned_data = super().clean()
if cleaned_data["start_date"] < timezone.now():
self.add_error(
"start_date", _("Impossible de faire débuter l'élection dans le passé")
)
elif cleaned_data["start_date"] >= cleaned_data["end_date"]:
self.add_error(
"end_date", _("Impossible de terminer l'élection avant de la commencer")
)
return cleaned_data
class Meta:
model = Election
fields = ["name", "description", "start_date", "end_date"]
class VoteForm(forms.ModelForm): class VoteForm(forms.ModelForm):

View file

@ -9,7 +9,7 @@ from django.utils.translation import gettext_lazy as _
from django.views.generic import CreateView, DetailView, RedirectView, UpdateView from django.views.generic import CreateView, DetailView, RedirectView, UpdateView
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from .forms import OptionFormSet from .forms import ElectionCreateForm, OptionFormSet
from .models import Election, Option, Question from .models import Election, Option, Question
# TODO: access control *everywhere* # TODO: access control *everywhere*
@ -17,9 +17,9 @@ from .models import Election, Option, Question
class ElectionCreateView(SuccessMessageMixin, CreateView): class ElectionCreateView(SuccessMessageMixin, CreateView):
model = Election model = Election
fields = ["name", "description", "start_date", "end_date"] form_class = ElectionCreateForm
template_name = "elections/election_create.html" template_name = "elections/election_create.html"
success_message = _("Élection crée avec succès !") success_message = _("Élection créée avec succès !")
def get_success_url(self): def get_success_url(self):
return reverse("election.admin", args=[self.object.pk]) return reverse("election.admin", args=[self.object.pk])
@ -27,7 +27,7 @@ class ElectionCreateView(SuccessMessageMixin, CreateView):
def form_valid(self, form): def form_valid(self, form):
# We need to add the short name and the creator od the election # We need to add the short name and the creator od the election
form.instance.short_name = slugify( form.instance.short_name = slugify(
str(form.instance.start_date.year) + "_" + form.instance.name form.instance.start_date.strftime("%Y-%m-%d") + "_" + form.instance.name
)[:50] )[:50]
# TODO: Change this if we modify the user model # TODO: Change this if we modify the user model
form.instance.created_by = self.request.user form.instance.created_by = self.request.user
@ -57,8 +57,8 @@ class ElectionUpdateView(SuccessMessageMixin, UpdateView):
return reverse("election.admin", args=[self.object.pk]) return reverse("election.admin", args=[self.object.pk])
def get_queryset(self): def get_queryset(self):
# On ne peut plus modifier une élection déjà comptée # On ne peut plus modifier une élection qui a déjà commencé
return super().get_queryset().filter(tallied=False, archived=False) return super().get_queryset().filter(start_date__gt=timezone.now())
class ElectionTallyView(SuccessMessageMixin, SingleObjectMixin, RedirectView): class ElectionTallyView(SuccessMessageMixin, SingleObjectMixin, RedirectView):
@ -66,7 +66,12 @@ class ElectionTallyView(SuccessMessageMixin, SingleObjectMixin, RedirectView):
pattern_name = "election.admin" pattern_name = "election.admin"
def get_queryset(self): def get_queryset(self):
return super().get_queryset().prefetch_related("questions__options") return (
super()
.get_queryset()
.filter(end_date__lt=timezone.now())
.prefetch_related("questions__options")
)
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
election = self.get_object() election = self.get_object()
@ -95,6 +100,9 @@ class ElectionChangePublicationView(
model = Election model = Election
pattern_name = "election.admin" pattern_name = "election.admin"
def get_queryset(self):
return super().get_queryset().filter(end_date__lt=timezone.now())
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
election = self.get_object() election = self.get_object()
election.results_public = not election.results_public election.results_public = not election.results_public
@ -112,6 +120,9 @@ class ElectionArchiveView(SuccessMessageMixin, SingleObjectMixin, RedirectView):
model = Election model = Election
pattern_name = "election.admin" pattern_name = "election.admin"
def get_queryset(self):
return super().get_queryset().filter(end_date__lt=timezone.now())
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
election = self.get_object() election = self.get_object()
election.archived = True election.archived = True
@ -148,7 +159,12 @@ class VoteView(SuccessMessageMixin, DetailView):
return ( return (
super() super()
.get_queryset() .get_queryset()
.filter(election__tallied=False, election__archived=False) .filter(
election__tallied=False,
election__archived=False,
election__start_date__lt=timezone.now(),
election__end_date__gt=timezone.now(),
)
.select_related("election") .select_related("election")
) )