On peut importe une liste de votant·e·s avec un fichier csv, pour l'instant aucune vérification n'est faite
This commit is contained in:
parent
5c7e2238d8
commit
e53cd7587f
4 changed files with 41 additions and 4 deletions
|
@ -27,6 +27,10 @@ class ElectionForm(forms.ModelForm):
|
||||||
class UploadVotersForm(forms.Form):
|
class UploadVotersForm(forms.Form):
|
||||||
csv_file = forms.FileField(label=_("Sélectionnez un fichier .csv"))
|
csv_file = forms.FileField(label=_("Sélectionnez un fichier .csv"))
|
||||||
|
|
||||||
|
def clean_csv_file(self):
|
||||||
|
csv_file = self.cleaned_data["csv_file"]
|
||||||
|
return csv_file
|
||||||
|
|
||||||
|
|
||||||
class QuestionForm(forms.ModelForm):
|
class QuestionForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -24,13 +24,13 @@
|
||||||
|
|
||||||
<div class="message is-warning">
|
<div class="message is-warning">
|
||||||
<div class="message-body">
|
<div class="message-body">
|
||||||
{% trans "Importez un fichier au format CSV, avec sur la première colonne les prénoms, sur la deuxième le nom et la troisième l'adresse email. Soit :<br><br><pre>Prénom_1,Nom_1,mail_1@machin.test<br>Prénom_2,Nom_2,mail_2@bidule.test<br>...</pre>" %}
|
{% trans "Importez un fichier au format CSV, avec sur la première colonne le login, sur la deuxième, le nom et prénom et enfin l'adresse email sur la troisième. Soit :<br><br><pre>Login_1,Prénom/Nom_1,mail_1@machin.test<br>Login_2,Prénom/Nom_2,mail_2@bidule.test<br>...</pre>" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="columns is-centered">
|
<div class="columns is-centered">
|
||||||
<div class="column is-two-thirds">
|
<div class="column is-two-thirds">
|
||||||
<form action="" method="post" id="import-voters">
|
<form action="" method="post" enctype="multipart/form-data" id="import-voters">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|
||||||
{% include "forms/form.html" with errors=False %}
|
{% include "forms/form.html" with errors=False %}
|
||||||
|
|
15
elections/utils.py
Normal file
15
elections/utils.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
import csv
|
||||||
|
import io
|
||||||
|
|
||||||
|
|
||||||
|
def create_users(election, csv_file):
|
||||||
|
"""Crée les votant·e·s pour l'élection donnée, en remplissant les champs
|
||||||
|
`username`, `election` et `full_name`.
|
||||||
|
"""
|
||||||
|
dialect = csv.Sniffer().sniff(csv_file.read(1024).decode("utf-8"))
|
||||||
|
csv_file.seek(0)
|
||||||
|
reader = csv.reader(io.StringIO(csv_file.read().decode("utf-8")), dialect)
|
||||||
|
for (username, full_name, email) in reader:
|
||||||
|
election.registered_voters.create(
|
||||||
|
username=f"{election.id}__{username}", email=email
|
||||||
|
)
|
|
@ -25,6 +25,7 @@ from .forms import (
|
||||||
)
|
)
|
||||||
from .mixins import CreatorOnlyEditMixin, CreatorOnlyMixin, OpenElectionOnlyMixin
|
from .mixins import CreatorOnlyEditMixin, CreatorOnlyMixin, OpenElectionOnlyMixin
|
||||||
from .models import Election, Option, Question
|
from .models import Election, Option, Question
|
||||||
|
from .utils import create_users
|
||||||
|
|
||||||
# TODO: access control *everywhere*
|
# TODO: access control *everywhere*
|
||||||
|
|
||||||
|
@ -85,17 +86,34 @@ class ElectionAdminView(CreatorOnlyMixin, DetailView):
|
||||||
return super().get_queryset().prefetch_related("questions__options")
|
return super().get_queryset().prefetch_related("questions__options")
|
||||||
|
|
||||||
|
|
||||||
class ElectionUploadVotersView(CreatorOnlyEditMixin, FormView):
|
class ElectionUploadVotersView(CreatorOnlyEditMixin, SuccessMessageMixin, FormView):
|
||||||
model = Election
|
model = Election
|
||||||
form_class = UploadVotersForm
|
form_class = UploadVotersForm
|
||||||
|
success_message = _("Liste de votant·e·s importée avec succès !")
|
||||||
template_name = "elections/upload_voters.html"
|
template_name = "elections/upload_voters.html"
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
return reverse("election.upload-voters", args=[self.object.pk])
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super().get_context_data(**kwargs)
|
||||||
|
context["voters"] = self.object.registered_voters
|
||||||
|
return context
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
self.object = self.get_object()
|
self.object = self.get_object()
|
||||||
return super().get(request, *args, **kwargs)
|
return super().get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
self.object = self.get_object()
|
||||||
|
return super().post(request, *args, **kwargs)
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
pass
|
# On crée les comptes nécessaires à l'élection, en supprimant ceux
|
||||||
|
# existant déjà pour ne pas avoir de doublons
|
||||||
|
self.object.registered_voters.all().delete()
|
||||||
|
create_users(self.object, form.cleaned_data["csv_file"])
|
||||||
|
return super().form_valid(form)
|
||||||
|
|
||||||
|
|
||||||
class ElectionListView(CreatorOnlyMixin, ListView):
|
class ElectionListView(CreatorOnlyMixin, ListView):
|
||||||
|
|
Loading…
Add table
Reference in a new issue