diff --git a/elections/migrations/0028_election_visible.py b/elections/migrations/0028_election_visible.py new file mode 100644 index 0000000..28b774b --- /dev/null +++ b/elections/migrations/0028_election_visible.py @@ -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"), + ), + ] diff --git a/elections/migrations/0029_alter_election_visible.py b/elections/migrations/0029_alter_election_visible.py new file mode 100644 index 0000000..853df45 --- /dev/null +++ b/elections/migrations/0029_alter_election_visible.py @@ -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"), + ), + ] diff --git a/elections/mixins.py b/elections/mixins.py index 69d44eb..45f928b 100644 --- a/elections/mixins.py +++ b/elections/mixins.py @@ -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) diff --git a/elections/models.py b/elections/models.py index cc66bc0..cdc02e2 100644 --- a/elections/models.py +++ b/elections/models.py @@ -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) ) diff --git a/elections/templates/elections/election_admin.html b/elections/templates/elections/election_admin.html index 611052d..03b66a7 100644 --- a/elections/templates/elections/election_admin.html +++ b/elections/templates/elections/election_admin.html @@ -66,6 +66,16 @@ + {% if not election.visible %} + {# Rend l'élection visible par tout le monde #} + + + + + {% trans "Rendre l'élection visible" %} + + {% endif %} + {# Téléchargement de la liste des votant·e·s #} diff --git a/elections/urls.py b/elections/urls.py index e065b2d..bfa1c22 100644 --- a/elections/urls.py +++ b/elections/urls.py @@ -31,6 +31,11 @@ urlpatterns = [ views.DeleteVoteView.as_view(), name="election.delete-vote", ), + path( + "visible/", + views.ElectionSetVisibleView.as_view(), + name="election.set-visible", + ), path("update/", views.ElectionUpdateView.as_view(), name="election.update"), path("tally/", views.ElectionTallyView.as_view(), name="election.tally"), path( diff --git a/elections/views.py b/elections/views.py index d63b5b7..0f69d5d 100644 --- a/elections/views.py +++ b/elections/views.py @@ -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):