Merge branch 'master' of https://git.eleves.ens.fr/cof-geek/gestioCOF into Aufinal/bda_shotgun

This commit is contained in:
Ludovic Stephan 2016-10-07 14:06:47 +02:00
commit 9e9cf3145b
9 changed files with 67 additions and 55 deletions

View file

@ -68,7 +68,7 @@ class AnnulForm(forms.Form):
self.fields['attributions'].queryset = participant.attribution_set\ self.fields['attributions'].queryset = participant.attribution_set\
.filter(spectacle__date__gte=timezone.now(), .filter(spectacle__date__gte=timezone.now(),
revente__isnull=False, revente__isnull=False,
revente__date__gte=timezone.now()-timedelta(hours=1))\ revente__date__gt=timezone.now()-timedelta(hours=1))\
.filter(Q(revente__soldTo__isnull=True) | .filter(Q(revente__soldTo__isnull=True) |
Q(revente__soldTo=participant)) Q(revente__soldTo=participant))

View file

@ -8,6 +8,7 @@ import calendar
import random import random
from datetime import timedelta from datetime import timedelta
from django.contrib.sites.models import Site
from django.db import models from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.template import loader, Context from django.template import loader, Context
@ -105,22 +106,26 @@ class Spectacle(models.Model):
for attr in Attribution.objects.filter(spectacle=self).all(): for attr in Attribution.objects.filter(spectacle=self).all():
member = attr.participant.user member = attr.participant.user
if member.id in members: if member.id in members:
members[member.id].nb_attr = 2 members[member.id][1] = 2
else: else:
member.nb_attr = 1 members[member.id] = [member.first_name, 1, member.email]
members[member.id] = member # Pour le BdA
members[0] = ['BdA', 1, 'bda@ens.fr']
members[-1] = ['BdA', 2, 'bda@ens.fr']
# On écrit un mail personnalisé à chaque participant # On écrit un mail personnalisé à chaque participant
mails_to_send = [] mails_to_send = []
mail_object = "%s - %s - %s" % (self.title, self.date_no_seconds(), mail_object = "%s - %s - %s" % (self.title, self.date_no_seconds(),
self.location) self.location)
for member in members.values(): for member in members.values():
mail_body = render_template('mail-rappel.txt', { mail_body = render_template('mail-rappel.txt', {
'member': member, 'name': member[0],
'nb_attr': member[1],
'show': self}) 'show': self})
mail_tot = mail.EmailMessage( mail_tot = mail.EmailMessage(
mail_object, mail_body, mail_object, mail_body,
settings.RAPPEL_FROM, [member.email], settings.MAIL_DATA['rappels']['FROM'], [member[2]],
[], headers={'Reply-To': settings.RAPPEL_REPLY_TO}) [], headers={
'Reply-To': settings.MAIL_DATA['rappels']['REPLYTO']})
mails_to_send.append(mail_tot) mails_to_send.append(mail_tot)
# On envoie les mails # On envoie les mails
connection = mail.get_connection() connection = mail.get_connection()
@ -223,6 +228,7 @@ class SpectacleRevente(models.Model):
answered_mail = models.ManyToManyField(Participant, answered_mail = models.ManyToManyField(Participant,
related_name="wanted", related_name="wanted",
blank=True) blank=True)
seller = models.ForeignKey(Participant, seller = models.ForeignKey(Participant,
related_name="original_shows", related_name="original_shows",
verbose_name="Vendeur") verbose_name="Vendeur")
@ -244,6 +250,11 @@ class SpectacleRevente(models.Model):
# On a aussi 1h pour changer d'avis # On a aussi 1h pour changer d'avis
return self.date + delay + timedelta(hours=1) return self.date + delay + timedelta(hours=1)
def expiration_time_str(self):
return self.expiration_time \
.astimezone(timezone.get_current_timezone()) \
.strftime('%D à %H:%M')
@property @property
def shotgun(self): def shotgun(self):
# Soit on a dépassé le délai du tirage, soit il reste peu de # Soit on a dépassé le délai du tirage, soit il reste peu de
@ -270,14 +281,14 @@ class SpectacleRevente(models.Model):
mail_body = render_template('mail-revente.txt', { mail_body = render_template('mail-revente.txt', {
'user': participant.user, 'user': participant.user,
'spectacle': self.attribution.spectacle, 'spectacle': self.attribution.spectacle,
'time': self.date.astimezone( 'revente': self,
timezone.get_current_timezone()) \ 'domain': Site.objects.get_current().domain})
.strftime('%d %b %Y %H:%M'),
'id': self.id})
mail_tot = mail.EmailMessage( mail_tot = mail.EmailMessage(
mail_object, mail_body, mail_object, mail_body,
settings.REVENTE_FROM, [participant.user.email], settings.MAIL_DATA['revente']['FROM'],
[], headers={'Reply-To': settings.REVENTE_REPLY_TO}) [participant.user.email],
[], headers={
'Reply-To': settings.MAIL_DATA['revente']['REPLYTO']})
mails_to_send.append(mail_tot) mails_to_send.append(mail_tot)
connection = mail.get_connection() connection = mail.get_connection()
@ -294,11 +305,14 @@ class SpectacleRevente(models.Model):
mail_body = render_template('mail-shotgun.txt', { mail_body = render_template('mail-shotgun.txt', {
'user': participant.user, 'user': participant.user,
'spectacle': self.attribution.spectacle, 'spectacle': self.attribution.spectacle,
'domain': Site.objects.get_current(),
'mail': self.attribution.participant.user.email}) 'mail': self.attribution.participant.user.email})
mail_tot = mail.EmailMessage( mail_tot = mail.EmailMessage(
mail_object, mail_body, mail_object, mail_body,
settings.REVENTE_FROM, [participant.user.email], settings.MAIL_DATA['revente']['FROM'],
[], headers={'Reply-To': settings.REVENTE_REPLY_TO}) [participant.user.email],
[], headers={
'Reply-To': settings.MAIL_DATA['revente']['REPLYTO']})
mails_to_send.append(mail_tot) mails_to_send.append(mail_tot)
connection = mail.get_connection() connection = mail.get_connection()
@ -320,7 +334,7 @@ Tu peux contacter le/la vendeur-se à l'adresse %s.
Chaleureusement, Chaleureusement,
Le BdA""" % (spectacle.title, spectacle.date_no_seconds(), Le BdA""" % (spectacle.title, spectacle.date_no_seconds(),
spectacle.location, spectacle.price, seller.email) spectacle.location, spectacle.price, seller.user.email)
mail.send_mail("BdA-Revente : %s" % spectacle.title, mail.send_mail("BdA-Revente : %s" % spectacle.title,
mail_buyer, "bda@ens.fr", [winner.user.email], mail_buyer, "bda@ens.fr", [winner.user.email],
@ -333,7 +347,7 @@ Chaleureusement,
Le BdA""" % (spectacle.title, winner.user.get_full_name(), winner.user.email) Le BdA""" % (spectacle.title, winner.user.get_full_name(), winner.user.email)
mail.send_mail("BdA-Revente : %s" % spectacle.title, mail.send_mail("BdA-Revente : %s" % spectacle.title,
mail_seller, "bda@ens.fr", [seller.email], mail_seller, "bda@ens.fr", [seller.user.email],
fail_silently=False) fail_silently=False)
self.tirage_done = True self.tirage_done = True
self.save() self.save()

View file

@ -11,20 +11,7 @@
{% endif %} {% endif %}
<form action="" class="form-horizontal" method="post"> <form action="" class="form-horizontal" method="post">
{% csrf_token %} {% csrf_token %}
<div class="form-group"> {{form | bootstrap}}
<h3>Spectacles</h3>
<br/>
<button type="button" class="btn btn-primary" onClick="select(true)">Tout sélectionner</button>
<button type="button" class="btn btn-primary" onClick="select(false)">Tout désélectionner</button>
<div class="multiple-checkbox">
<ul>
{% for checkbox in form.spectacles %}
<li>{{checkbox}}</li>
{%endfor%}
</ul>
</div>
</div>
<input type="submit" class="btn btn-primary" value="S'inscrire pour les places sélectionnées"> <input type="submit" class="btn btn-primary" value="S'inscrire pour les places sélectionnées">
</form> </form>

View file

@ -1,14 +1,14 @@
Bonjour {{ member.get_full_name }}, Bonjour {{ name }},
Nous te rappellons que tu as eu la chance d'obtenir {{ member.nb_attr|pluralize:"une place,deux places" }} Nous te rappellons que tu as eu la chance d'obtenir {{ nb_attr|pluralize:"une place,deux places" }}
pour {{ show.title }}, le {{ show.date_no_seconds }} au {{ show.location }}. N'oublie pas de t'y rendre ! pour {{ show.title }}, le {{ show.date_no_seconds }} au {{ show.location }}. N'oublie pas de t'y rendre !
{% if member.nb_attr == 2 %} {% if nb_attr == 2 %}
Tu as obtenu deux places pour ce spectacle. Nous te rappelons que Tu as obtenu deux places pour ce spectacle. Nous te rappelons que
ces places sont strictement réservées aux personnes de moins de 28 ans. ces places sont strictement réservées aux personnes de moins de 28 ans.
{% endif %} {% endif %}
{% if show.listing %}Pour ce spectacle, tu as reçu des places sur {% if show.listing %}Pour ce spectacle, tu as reçu des places sur
listing. Il te faudra donc te rendre 15 minutes en avance sur les lieux de la représentation listing. Il te faudra donc te rendre 15 minutes en avance sur les lieux de la représentation
pour retirer {{ member.nb_attr|pluralize:"ta place,tes places" }}. pour retirer {{ nb_attr|pluralize:"ta place,tes places" }}.
{% else %}Pour assister à ce spectacle, tu dois présenter les billets qui ont {% else %}Pour assister à ce spectacle, tu dois présenter les billets qui ont
été distribués au burô. été distribués au burô.
{% endif %} {% endif %}

View file

@ -1,9 +1,12 @@
Bonjour {{ user.get_full_name }} Bonjour {{ user.first_name }}
Une place pour le spectacle {{ spectacle.title }} ({{spectacle.date_no_seconds}}) a été postée sur BdA-Revente. Une place pour le spectacle {{ spectacle.title }} ({{ spectacle.date_no_seconds }})
a été postée sur BdA-Revente.
Si ce spectacle t'intéresse toujours, merci de nous le signaler en cliquant sur ce lien : {% url "bda-revente-interested" id %}. Si ce spectacle t'intéresse toujours, merci de nous le signaler en cliquant
Dans le cas où plusieurs personnes seraient intéressées, nous procèderons à un tirage au sort le {{time}}. sur ce lien : http://{{ domain }}{% url "bda-revente-interested" revente.id %}.
Dans le cas où plusieurs personnes seraient intéressées, nous procèderons à
un tirage au sort le {{ revente.expiration_time_str }}.
Chaleureusement, Chaleureusement,
Le BdA Le BdA

View file

@ -1,8 +1,11 @@
Bonjour {{ user.get_full_name }} Bonjour {{ user.first_name }}
Une place pour le spectacle {{ spectacle.title }} ({{spectacle.date_no_seconds}}) a été postée sur BdA-Revente. Une place pour le spectacle {{ spectacle.title }} ({{ spectacle.date_no_seconds }})
a été postée sur BdA-Revente.
Puisque ce spectacle a lieu dans moins de 24h, il n'y a pas de tirage au sort pour cette place : elle est disponible immédiatement à l'addresse {%url "bda-buy-revente" spectacle.id%}, à la disposition de tous. Puisque ce spectacle a lieu dans moins de 24h, il n'y a pas de tirage au sort pour
cette place : elle est disponible immédiatement à l'addresse
http://{{ domain }}{% url "bda-buy-revente" spectacle.id %}, à la disposition de tous.
Chaleureusement, Chaleureusement,
Le BdA Le BdA

View file

@ -333,7 +333,9 @@ def revente(request, tirage_id):
revente = rev.get() revente = rev.get()
revente.date = timezone.now() - timedelta(hours=1) revente.date = timezone.now() - timedelta(hours=1)
revente.soldTo = None revente.soldTo = None
revente.answered_mail = None if revente.answered_mail:
revente.answered_mail.clear()
revente.save()
else: else:
resellform = ResellForm(participant, prefix='resell') resellform = ResellForm(participant, prefix='resell')

View file

@ -145,15 +145,18 @@ ADMIN_MEDIA_PREFIX = '/static/grappelli/'
GRAPPELLI_ADMIN_HEADLINE = "GestioCOF" GRAPPELLI_ADMIN_HEADLINE = "GestioCOF"
GRAPPELLI_ADMIN_TITLE = "<a href=\"/\">GestioCOF</a>" GRAPPELLI_ADMIN_TITLE = "<a href=\"/\">GestioCOF</a>"
PETITS_COURS_FROM = "Le COF <cof@ens.fr>" MAIL_DATA = {
PETITS_COURS_BCC = "archivescof@gmail.com" 'petits_cours': {
PETITS_COURS_REPLYTO = "cof@ens.fr" 'FROM': "Le COF <cof@ens.fr>",
'BCC': "archivescof@gmail.com",
RAPPEL_FROM = 'Le BdA <bda@ens.fr>' 'REPLYTO': "cof@ens.fr"},
RAPPEL_REPLY_TO = RAPPEL_FROM 'rappels': {
'FROM': 'Le BdA <bda@ens.fr>',
REVENTE_FROM = 'BdA-Revente <bda-revente@ens.fr>' 'REPLYTO': 'Le BdA <bda@ens.fr>'},
REVENTE_REPLY_TO = REVENTE_FROM 'revente': {
'FROM': 'BdA-Revente <bda-revente@ens.fr>',
'REPLYTO': 'BdA-Revente <bda-revente@ens.fr>'},
}
LOGIN_URL = "/gestion/login" LOGIN_URL = "/gestion/login"
LOGIN_REDIRECT_URL = "/gestion/" LOGIN_REDIRECT_URL = "/gestion/"

View file

@ -282,9 +282,9 @@ def _traitement_post(request, demande):
{"proposals": proposals_list, {"proposals": proposals_list,
"unsatisfied": unsatisfied, "unsatisfied": unsatisfied,
"extra": extra}) "extra": extra})
frommail = settings.PETITS_COURS_FROM frommail = settings.MAIL_DATA['petits_cours']['FROM']
bccaddress = settings.PETITS_COURS_BCC bccaddress = settings.MAIL_DATA['petits_cours']['BCC']
replyto = settings.PETITS_COURS_REPLYTO replyto = settings.MAIL_DATA['petits_cours']['REPLYTO']
mails_to_send = [] mails_to_send = []
for (user, msg) in proposed_mails: for (user, msg) in proposed_mails:
msg = EmailMessage("Petits cours ENS par le COF", msg, msg = EmailMessage("Petits cours ENS par le COF", msg,