forked from DGNum/gestioCOF
Merge branch 'master' of https://git.eleves.ens.fr/cof-geek/gestioCOF into Aufinal/bda_shotgun
This commit is contained in:
commit
9e9cf3145b
9 changed files with 67 additions and 55 deletions
|
@ -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))
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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/"
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue