On rajoute un champ visible
pour pouvoir travailler sur l'élection sans que tout le monde puisse le voir
This commit is contained in:
parent
5c35b671ef
commit
52b5830c87
7 changed files with 77 additions and 9 deletions
18
elections/migrations/0028_election_visible.py
Normal file
18
elections/migrations/0028_election_visible.py
Normal file
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 3.2.4 on 2021-06-17 08:49
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("elections", "0027_auto_20210614_1123"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="election",
|
||||
name="visible",
|
||||
field=models.BooleanField(default=True, verbose_name="visible au public"),
|
||||
),
|
||||
]
|
18
elections/migrations/0029_alter_election_visible.py
Normal file
18
elections/migrations/0029_alter_election_visible.py
Normal file
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 3.2.4 on 2021-06-17 09:51
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("elections", "0028_election_visible"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name="election",
|
||||
name="visible",
|
||||
field=models.BooleanField(default=False, verbose_name="visible au public"),
|
||||
),
|
||||
]
|
|
@ -55,12 +55,13 @@ class OpenElectionOnlyMixin(RestrictAccessMixin):
|
|||
filters = super().get_filters()
|
||||
filters[f_prefix + "start_date__lt"] = timezone.now()
|
||||
filters[f_prefix + "end_date__gt"] = timezone.now()
|
||||
filters[f_prefix + "visible"] = True
|
||||
filters[f_prefix + "tallied"] = False
|
||||
filters[f_prefix + "archived"] = False
|
||||
return filters
|
||||
|
||||
|
||||
class CreatorOnlyMixin(AdminOnlyMixin, RestrictAccessMixin):
|
||||
class CreatorOnlyMixin(AdminOnlyMixin, RestrictAccessMixin, SingleObjectMixin):
|
||||
"""Restreint l'accès au créateurice de l'élection"""
|
||||
|
||||
def get_next_url(self):
|
||||
|
@ -73,7 +74,7 @@ class CreatorOnlyMixin(AdminOnlyMixin, RestrictAccessMixin):
|
|||
return filters
|
||||
|
||||
|
||||
class CreatorOnlyEditMixin(CreatorOnlyMixin, SingleObjectMixin):
|
||||
class CreatorOnlyEditMixin(CreatorOnlyMixin):
|
||||
"""Permet au créateurice de modifier l'élection implicitement"""
|
||||
|
||||
def get_filters(self):
|
||||
|
@ -83,7 +84,7 @@ class CreatorOnlyEditMixin(CreatorOnlyMixin, SingleObjectMixin):
|
|||
return filters
|
||||
|
||||
|
||||
class ClosedElectionMixin(CreatorOnlyMixin, SingleObjectMixin):
|
||||
class ClosedElectionMixin(CreatorOnlyMixin):
|
||||
"""Permet d'agir sur une élection terminée"""
|
||||
|
||||
def get_filters(self):
|
||||
|
@ -96,12 +97,15 @@ class ClosedElectionMixin(CreatorOnlyMixin, SingleObjectMixin):
|
|||
|
||||
|
||||
class NotArchivedMixin:
|
||||
"""Permet de ne garder que les élections non archivées ou dont on est l'admin"""
|
||||
"""
|
||||
Permet de ne garder que les élections non archivées, et visibles
|
||||
ou dont on est l'admin
|
||||
"""
|
||||
|
||||
def get_queryset(self):
|
||||
user = self.request.user
|
||||
qs = super().get_queryset()
|
||||
if user.is_authenticated:
|
||||
return qs.filter(Q(archived=False) | Q(created_by=user))
|
||||
return qs.filter(Q(archived=False, visible=True) | Q(created_by=user))
|
||||
|
||||
return qs.filter(archived=False)
|
||||
|
|
|
@ -39,6 +39,8 @@ class Election(models.Model):
|
|||
start_date = models.DateTimeField(_("date et heure de début"))
|
||||
end_date = models.DateTimeField(_("date et heure de fin"))
|
||||
|
||||
visible = models.BooleanField(_("visible au public"), default=False)
|
||||
|
||||
vote_restrictions = TranslatedFieldWithFallback(
|
||||
models.TextField(_("conditions de vote"), blank=True)
|
||||
)
|
||||
|
|
|
@ -66,6 +66,16 @@
|
|||
|
||||
<hr class="dropdown-divider">
|
||||
|
||||
{% if not election.visible %}
|
||||
{# Rend l'élection visible par tout le monde #}
|
||||
<a class="dropdown-item" href="{% url 'election.set-visible' election.pk %}">
|
||||
<span class="icon">
|
||||
<i class="fas fa-eye"></i>
|
||||
</span>
|
||||
<span>{% trans "Rendre l'élection visible" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
{# Téléchargement de la liste des votant·e·s #}
|
||||
<a class="dropdown-item" href="{% url 'election.export-voters' election.pk %}">
|
||||
<span class="icon">
|
||||
|
|
|
@ -31,6 +31,11 @@ urlpatterns = [
|
|||
views.DeleteVoteView.as_view(),
|
||||
name="election.delete-vote",
|
||||
),
|
||||
path(
|
||||
"visible/<int:pk>",
|
||||
views.ElectionSetVisibleView.as_view(),
|
||||
name="election.set-visible",
|
||||
),
|
||||
path("update/<int:pk>", views.ElectionUpdateView.as_view(), name="election.update"),
|
||||
path("tally/<int:pk>", views.ElectionTallyView.as_view(), name="election.tally"),
|
||||
path(
|
||||
|
|
|
@ -20,7 +20,6 @@ from django.views.generic import (
|
|||
UpdateView,
|
||||
View,
|
||||
)
|
||||
from django.views.generic.detail import SingleObjectMixin
|
||||
|
||||
from shared.views import BackgroundUpdateView
|
||||
|
||||
|
@ -94,7 +93,19 @@ class ElectionAdminView(CreatorOnlyMixin, DetailView):
|
|||
return super().get_queryset().prefetch_related("questions__options")
|
||||
|
||||
|
||||
class ExportVotersView(CreatorOnlyMixin, SingleObjectMixin, View):
|
||||
class ElectionSetVisibleView(CreatorOnlyEditMixin, BackgroundUpdateView):
|
||||
model = Election
|
||||
pattern_name = "election.admin"
|
||||
success_message = _("Élection visible !")
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
self.election = self.get_object()
|
||||
self.election.visible = True
|
||||
self.election.save()
|
||||
return super().get(request, *args, **kwargs)
|
||||
|
||||
|
||||
class ExportVotersView(CreatorOnlyMixin, View):
|
||||
model = Election
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
|
@ -105,7 +116,7 @@ class ExportVotersView(CreatorOnlyMixin, SingleObjectMixin, View):
|
|||
writer.writerow(["Nom", "login"])
|
||||
|
||||
for v in self.get_object().voters.all():
|
||||
writer.writerow([v.full_name, v.username])
|
||||
writer.writerow([v.full_name, v.base_username])
|
||||
|
||||
return response
|
||||
|
||||
|
@ -298,7 +309,7 @@ class ElectionChangePublicationView(ClosedElectionMixin, BackgroundUpdateView):
|
|||
return super().get(request, *args, **kwargs)
|
||||
|
||||
|
||||
class DownloadResultsView(CreatorOnlyMixin, SingleObjectMixin, View):
|
||||
class DownloadResultsView(CreatorOnlyMixin, View):
|
||||
model = Election
|
||||
|
||||
def get_queryset(self):
|
||||
|
|
Loading…
Reference in a new issue