forked from DGNum/gestioCOF
Merge branch 'Kerl/fix_32_do_tirage' into 'master'
Kerl/fix 32 do tirage Ce patch permet au BdA de lancer ses tirages tout seul, plus besoin de toucher au code. Les tirages sont protégés par un switch dans l'interface admin, i.e. un booléen qu'on passe à `True` avant de faire un tirage et qu'on repasse à False après. Ça sert à éviter qu'un étourdi lance un tirage “sans faire exprès”. Si un tirage est lancé plusieurs fois, on garde les différentes graînes dans la champ `tokens` du modèle `Tirage`. Fixes #32 See merge request !53
This commit is contained in:
commit
90e3527d1c
9 changed files with 78 additions and 18 deletions
|
@ -193,8 +193,9 @@ class SpectacleAdmin(admin.ModelAdmin):
|
||||||
|
|
||||||
class TirageAdmin(admin.ModelAdmin):
|
class TirageAdmin(admin.ModelAdmin):
|
||||||
model = Tirage
|
model = Tirage
|
||||||
list_display = ("title", "ouverture", "fermeture", "active")
|
list_display = ("title", "ouverture", "fermeture", "active",
|
||||||
readonly_fields = ("token", )
|
"enable_do_tirage")
|
||||||
|
readonly_fields = ("tokens", )
|
||||||
list_filter = ("active", )
|
list_filter = ("active", )
|
||||||
search_fields = ("title", )
|
search_fields = ("title", )
|
||||||
|
|
||||||
|
|
35
bda/migrations/0006_add_tirage_switch.py
Normal file
35
bda/migrations/0006_add_tirage_switch.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
|
|
||||||
|
def forwards_func(apps, schema_editor):
|
||||||
|
Tirage = apps.get_model("bda", "Tirage")
|
||||||
|
db_alias = schema_editor.connection.alias
|
||||||
|
for tirage in Tirage.objects.using(db_alias).all():
|
||||||
|
if tirage.tokens:
|
||||||
|
tirage.tokens = "Before %s\n\"\"\"%s\"\"\"\n" % (
|
||||||
|
timezone.now().strftime("%y-%m-%d %H:%M:%S"),
|
||||||
|
tirage.tokens)
|
||||||
|
tirage.save()
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('bda', '0005_encoding'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField('tirage', 'token', 'tokens'),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='tirage',
|
||||||
|
name='enable_do_tirage',
|
||||||
|
field=models.BooleanField(
|
||||||
|
default=False,
|
||||||
|
verbose_name=b'Le tirage peut \xc3\xaatre lanc\xc3\xa9'),
|
||||||
|
),
|
||||||
|
migrations.RunPython(forwards_func, migrations.RunPython.noop),
|
||||||
|
]
|
|
@ -26,8 +26,10 @@ class Tirage(models.Model):
|
||||||
title = models.CharField("Titre", max_length=300)
|
title = models.CharField("Titre", max_length=300)
|
||||||
ouverture = models.DateTimeField("Date et heure d'ouverture du tirage")
|
ouverture = models.DateTimeField("Date et heure d'ouverture du tirage")
|
||||||
fermeture = models.DateTimeField("Date et heure de fermerture du tirage")
|
fermeture = models.DateTimeField("Date et heure de fermerture du tirage")
|
||||||
token = models.TextField("Graine du tirage", blank=True)
|
tokens = models.TextField("Graine(s) du tirage", blank=True)
|
||||||
active = models.BooleanField("Tirage actif", default=False)
|
active = models.BooleanField("Tirage actif", default=False)
|
||||||
|
enable_do_tirage = models.BooleanField("Le tirage peut être lancé",
|
||||||
|
default=False)
|
||||||
|
|
||||||
def date_no_seconds(self):
|
def date_no_seconds(self):
|
||||||
return self.fermeture.strftime('%d %b %Y %H:%M')
|
return self.fermeture.strftime('%d %b %Y %H:%M')
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
{% block extracontent %}
|
{% block extracontent %}
|
||||||
|
|
||||||
<h2>Attribution (détails)</h2>
|
<h2>Attributions (détails)</h2>
|
||||||
<h3 class="horizontal-title">Token :</h3>
|
<h3 class="horizontal-title">Token :</h3>
|
||||||
<pre>{{ token }}</pre>
|
<pre>{{ token }}</pre>
|
||||||
<h3 class="horizontal-title">Placés : {{ total_slots }} ; Déçus : {{ total_losers }}</h3>
|
<h3 class="horizontal-title">Placés : {{ total_slots }} ; Déçus : {{ total_losers }}</h3>
|
||||||
|
|
|
@ -7,7 +7,13 @@
|
||||||
|
|
||||||
{% block realcontent %}
|
{% block realcontent %}
|
||||||
|
|
||||||
<h2>Attribution</h2>
|
<h2>Attributions</h2>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<p class="success">Pour raison de sécurité, le lancement du tirage
|
||||||
|
a été désactivé. Vous pouvez le réactiver dans
|
||||||
|
l'<a href="{% url "admin:index" %}">interface admin</a></p>
|
||||||
|
|
||||||
<h3 class="horizontal-title">Token :</h3>
|
<h3 class="horizontal-title">Token :</h3>
|
||||||
<pre>{{ token }}</pre>
|
<pre>{{ token }}</pre>
|
||||||
<h3 class="horizontal-title">Placés : {{ total_slots }} ; Déçus : {{ total_losers }}</h3>
|
<h3 class="horizontal-title">Placés : {{ total_slots }} ; Déçus : {{ total_losers }}</h3>
|
||||||
|
|
|
@ -8,6 +8,6 @@
|
||||||
<div>
|
<div>
|
||||||
{{ form.token }}
|
{{ form.token }}
|
||||||
</div>
|
</div>
|
||||||
<input type="submit" value="Go" />
|
<input type="submit" onsubmit="return confirm('Voulez vous lancer le Tirage maintenant ?\n\nCECI REMETTRA À ZÉRO TOUTES LES DONNÉES si le tirage a déjà été lancé.')" value="Go" />
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
10
bda/templates/tirage-failed.html
Normal file
10
bda/templates/tirage-failed.html
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{% extends "base_title.html" %}
|
||||||
|
|
||||||
|
{% block realcontent %}
|
||||||
|
<h2>Raté, le tirage ne peut pas être lancé !</h2>
|
||||||
|
|
||||||
|
<p>Soit les inscriptions ne sont en pas encore fermées, soit le lancement du
|
||||||
|
tirage est désactivé. Si vous savez ce que vous faites, vous pouvez autoriser
|
||||||
|
le lancement du tirage dans
|
||||||
|
l'<a href="{% url "admin:index" %}">interface admin</a>.</p>
|
||||||
|
{% endblock %}
|
26
bda/views.py
26
bda/views.py
|
@ -197,8 +197,6 @@ def do_tirage(request, tirage_id):
|
||||||
form = TokenForm(request.POST)
|
form = TokenForm(request.POST)
|
||||||
if not form.is_valid():
|
if not form.is_valid():
|
||||||
return tirage(request, tirage_id)
|
return tirage(request, tirage_id)
|
||||||
tirage_elt.token = form.cleaned_data['token']
|
|
||||||
tirage_elt.save()
|
|
||||||
start = time.time()
|
start = time.time()
|
||||||
data = {}
|
data = {}
|
||||||
shows = tirage_elt.spectacle_set.select_related().all()
|
shows = tirage_elt.spectacle_set.select_related().all()
|
||||||
|
@ -249,16 +247,16 @@ def do_tirage(request, tirage_id):
|
||||||
members2 = members2.items()
|
members2 = members2.items()
|
||||||
data["members2"] = sorted(members2, key=lambda m: m[0].user.last_name)
|
data["members2"] = sorted(members2, key=lambda m: m[0].user.last_name)
|
||||||
# À partir d'ici, le tirage devient effectif
|
# À partir d'ici, le tirage devient effectif
|
||||||
# FIXME: Établir les conditions de validations (formulaire ?)
|
Attribution.objects.filter(spectacle__tirage=tirage_elt).delete()
|
||||||
# cf. issue #32
|
tirage_elt.tokens += "%s\n\"\"\"%s\"\"\"\n" % (
|
||||||
if True:
|
timezone.now().strftime("%y-%m-%d %H:%M:%S"),
|
||||||
Attribution.objects.filter(
|
form.cleaned_data['token'])
|
||||||
spectacle__tirage=tirage_elt
|
tirage_elt.enable_do_tirage = False
|
||||||
).delete()
|
tirage_elt.save()
|
||||||
for (show, members, _) in results:
|
Attribution.objects.bulk_create([
|
||||||
for (member, _, _, _) in members:
|
Attribution(spectacle=show, participant=member)
|
||||||
attrib = Attribution(spectacle=show, participant=member)
|
for show, members, _ in results
|
||||||
attrib.save()
|
for member, _, _, _ in members])
|
||||||
return render(request, "bda-attrib-extra.html", data)
|
return render(request, "bda-attrib-extra.html", data)
|
||||||
else:
|
else:
|
||||||
return render(request, "bda-attrib.html", data)
|
return render(request, "bda-attrib.html", data)
|
||||||
|
@ -266,6 +264,10 @@ def do_tirage(request, tirage_id):
|
||||||
|
|
||||||
@buro_required
|
@buro_required
|
||||||
def tirage(request, tirage_id):
|
def tirage(request, tirage_id):
|
||||||
|
tirage_elt = get_object_or_404(Tirage, id=tirage_id)
|
||||||
|
if not (tirage_elt.enable_do_tirage
|
||||||
|
and tirage_elt.fermeture < timezone.now()):
|
||||||
|
return render(request, "tirage-failed.html", {'tirage': tirage_elt})
|
||||||
if request.POST:
|
if request.POST:
|
||||||
form = TokenForm(request.POST)
|
form = TokenForm(request.POST)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
|
|
|
@ -526,6 +526,10 @@ h4.block-title {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.success a {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
.error {
|
.error {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #F6BEBE;
|
color: #F6BEBE;
|
||||||
|
|
Loading…
Reference in a new issue