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:
Martin Pepin 2016-07-29 21:34:05 +02:00
commit 90e3527d1c
9 changed files with 78 additions and 18 deletions

View file

@ -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", )

View 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),
]

View file

@ -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')

View file

@ -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>

View file

@ -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>

View file

@ -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 %}

View file

@ -0,0 +1,10 @@
{% extends "base_title.html" %}
{% block realcontent %}
<h2>Raté, le tirage ne peut pas être lancé&#8239;!</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 %}

View file

@ -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():

View file

@ -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;