On rajoute la possibilité d'avoir plusieurs types de question
This commit is contained in:
parent
39adc92c68
commit
84199c38fe
7 changed files with 62 additions and 5 deletions
|
@ -50,7 +50,7 @@ class VoterMailForm(forms.Form):
|
||||||
class QuestionForm(forms.ModelForm):
|
class QuestionForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Question
|
model = Question
|
||||||
fields = ["text"]
|
fields = ["text", "type"]
|
||||||
widgets = {"text": forms.TextInput}
|
widgets = {"text": forms.TextInput}
|
||||||
|
|
||||||
|
|
||||||
|
|
23
elections/migrations/0011_question_type.py
Normal file
23
elections/migrations/0011_question_type.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# Generated by Django 2.2.19 on 2021-03-19 10:33
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("elections", "0010_blank_voters"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="question",
|
||||||
|
name="type",
|
||||||
|
field=models.CharField(
|
||||||
|
choices=[("assentiment", "Assentiment")],
|
||||||
|
default="assentiment",
|
||||||
|
max_length=11,
|
||||||
|
verbose_name="type de question",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
|
@ -3,7 +3,8 @@ from django.contrib.auth.models import AbstractUser
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from .staticdefs import CONNECTION_METHODS
|
from .staticdefs import CONNECTION_METHODS, QUESTION_TYPES
|
||||||
|
from .utils import choices_length
|
||||||
|
|
||||||
# #############################################################################
|
# #############################################################################
|
||||||
# Models regarding an election
|
# Models regarding an election
|
||||||
|
@ -54,6 +55,12 @@ class Question(models.Model):
|
||||||
Election, related_name="questions", on_delete=models.CASCADE
|
Election, related_name="questions", on_delete=models.CASCADE
|
||||||
)
|
)
|
||||||
text = models.TextField(_("question"), blank=False)
|
text = models.TextField(_("question"), blank=False)
|
||||||
|
type = models.CharField(
|
||||||
|
_("type de question"),
|
||||||
|
choices=QUESTION_TYPES,
|
||||||
|
default="assentiment",
|
||||||
|
max_length=choices_length(QUESTION_TYPES),
|
||||||
|
)
|
||||||
# We cache the maximum number of votes for an option
|
# We cache the maximum number of votes for an option
|
||||||
max_votes = models.PositiveSmallIntegerField(
|
max_votes = models.PositiveSmallIntegerField(
|
||||||
_("nombre maximal de votes reçus"), default=0
|
_("nombre maximal de votes reçus"), default=0
|
||||||
|
@ -74,6 +81,7 @@ class Option(models.Model):
|
||||||
Question, related_name="options", on_delete=models.CASCADE
|
Question, related_name="options", on_delete=models.CASCADE
|
||||||
)
|
)
|
||||||
text = models.TextField(_("texte"), blank=False)
|
text = models.TextField(_("texte"), blank=False)
|
||||||
|
|
||||||
voters = models.ManyToManyField(
|
voters = models.ManyToManyField(
|
||||||
settings.AUTH_USER_MODEL,
|
settings.AUTH_USER_MODEL,
|
||||||
related_name="votes",
|
related_name="votes",
|
||||||
|
|
|
@ -17,3 +17,7 @@ CONNECTION_METHODS = {
|
||||||
"pwd": _("mot de passe"),
|
"pwd": _("mot de passe"),
|
||||||
"cas": _("CAS"),
|
"cas": _("CAS"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QUESTION_TYPES = [
|
||||||
|
("assentiment", _("Assentiment")),
|
||||||
|
]
|
||||||
|
|
|
@ -112,6 +112,7 @@
|
||||||
<span>{% trans "Modifier" %}</span>
|
<span>{% trans "Modifier" %}</span>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<span class="tag is-outlined is-primary is-light is-pulled-right">{{ q.get_type_display }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{# Liste des options possibles #}
|
{# Liste des options possibles #}
|
||||||
|
@ -177,6 +178,17 @@
|
||||||
<i class="fas fa-question"></i>
|
<i class="fas fa-question"></i>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="control">
|
||||||
|
<span class="select is-primary">
|
||||||
|
<select name="type" id="id_type">
|
||||||
|
{% for val, choice in question_types %}
|
||||||
|
<option value="{{ val }}">{{ choice }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<button class="button is-primary is-outlined">{% trans "Valider" %}</button>
|
<button class="button is-primary is-outlined">{% trans "Valider" %}</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -8,7 +8,13 @@ from django.core.mail import EmailMessage, get_connection
|
||||||
from django.core.validators import validate_email
|
from django.core.validators import validate_email
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from .models import User
|
|
||||||
|
def choices_length(choices):
|
||||||
|
"""Renvoie la longueur maximale des choix de choices"""
|
||||||
|
m = 0
|
||||||
|
for c in choices:
|
||||||
|
m = max(m, len(c[0]))
|
||||||
|
return m
|
||||||
|
|
||||||
|
|
||||||
def create_users(election, csv_file):
|
def create_users(election, csv_file):
|
||||||
|
@ -91,6 +97,8 @@ def send_mail(election, mail_form):
|
||||||
"""Envoie le mail d'annonce de l'élection avec identifiants et mot de passe
|
"""Envoie le mail d'annonce de l'élection avec identifiants et mot de passe
|
||||||
aux votant·e·s, le mdp est généré en même temps que le mail est envoyé.
|
aux votant·e·s, le mdp est généré en même temps que le mail est envoyé.
|
||||||
"""
|
"""
|
||||||
|
from .models import User
|
||||||
|
|
||||||
voters = list(election.registered_voters.all())
|
voters = list(election.registered_voters.all())
|
||||||
url = f"https://kadenios.eleves.ens.fr/elections/view/{election.id}"
|
url = f"https://kadenios.eleves.ens.fr/elections/view/{election.id}"
|
||||||
messages = []
|
messages = []
|
||||||
|
|
|
@ -26,7 +26,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 .staticdefs import MAIL_VOTERS
|
from .staticdefs import MAIL_VOTERS, QUESTION_TYPES
|
||||||
from .utils import create_users, send_mail
|
from .utils import create_users, send_mail
|
||||||
|
|
||||||
# TODO: access control *everywhere*
|
# TODO: access control *everywhere*
|
||||||
|
@ -81,7 +81,9 @@ class ElectionAdminView(CreatorOnlyMixin, DetailView):
|
||||||
return reverse("election.view", args=[self.object.pk])
|
return reverse("election.view", args=[self.object.pk])
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
kwargs.update({"current_time": timezone.now()})
|
kwargs.update(
|
||||||
|
{"current_time": timezone.now(), "question_types": QUESTION_TYPES}
|
||||||
|
)
|
||||||
return super().get_context_data(**kwargs)
|
return super().get_context_data(**kwargs)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
|
|
Loading…
Reference in a new issue