Premier jet pour les mails de rappel

La vue `bda.mails.send_rappel/<id>` envoie des mails aux participants
du spectacle référencé par `<id>`. Elle doit être déclenchée
manuellement.

Le template du mail est dans `bda/templates/mail-rappel.txt`. Tant que
GestioCOF ne sait pas si les spectacles sont sur listing ou non, il
reste une partie pas très belle.
This commit is contained in:
Martin Pépin 2016-06-10 00:43:48 +02:00
parent 15fdf4f5f9
commit 8ab7fac3be
4 changed files with 100 additions and 0 deletions

61
bda/mails.py Normal file
View file

@ -0,0 +1,61 @@
# coding: utf-8
from django.shortcuts import get_object_or_404, render
from django.core import mail
from django.template import loader, Context
from gestioncof.decorators import buro_required
from bda.models import Spectacle, Attribution
RAPPEL_FROM = 'Le BdA <bda@ens.fr>'
RAPPEL_REPLY_TO = RAPPEL_FROM
def render_template(template_name, data):
tmpl = loader.get_template(template_name)
ctxt = Context(data)
return tmpl.render(ctxt)
@buro_required
def send_rappel(request, spectacle_id):
# On récupère la liste des participants
show = get_object_or_404(Spectacle, id=spectacle_id)
members = {}
for attr in Attribution.objects.filter(spectacle=show).all():
member = attr.participant.user
if member.id in members:
members[member.id].nb_attr = 2
else:
member.nb_attr = 1
members[member.id] = member
# On écrit un mail personnalisé à chaque participant
mails_to_send = []
mail_object = "%s - %s - %s" % (show.title, show.date_no_seconds(),
show.location)
for member in members.values():
mail_body = render_template('mail-rappel.txt', {
'member': member,
'show': show})
mail_tot = mail.EmailMessage(mail_object, mail_body,
RAPPEL_FROM, [member.email],
[], headers={'Reply-To': RAPPEL_REPLY_TO})
mails_to_send.append(mail_tot)
# On envoie les mails
connection = mail.get_connection(fail_silently=True)
connection.send_messages(mails_to_send)
# Mails d'exemples
fake_member = request.user
fake_member.nb_attr = 1
example1 = render_template('mail-rappel.txt', {
'member': fake_member,
'show': show})
fake_member.nb_attr = 2
example2 = render_template('mail-rappel.txt', {
'member': fake_member,
'show': show})
return render(request, "mails-rappel-sent.html", {
'members': members.values(),
'show': show,
'example1': example1,
'example2': example2})

View file

@ -0,0 +1,21 @@
Bonjour {{ member.get_full_name }},
Nous te rappellons que tu as eu la chance d'obtenir {{ member.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 !
{% if member.nb_attr == 2 %}
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.
{% endif %}
SI BILLETS DISTRIBUÉS Pour assister à ce spectacle, tu dois présenter les billets qui ont
été distribués au burô. OU BIEN SI 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
pour retirer {{ member.nb_attr|pluralize:"ta place,tes places" }}.
Si tu ne peux plus assister à cette représentation, tu peux
revendre ta place via BdA-revente, accessible directement sur
GestioCOF (lien "revendre une place du premier tirage" sur la page
d'accueil https://www.cof.ens.fr/gestion/).
En te souhaitant un excellent spectacle,
Le Bureau des Arts

View file

@ -0,0 +1,17 @@
{% extends "base_title.html" %}
{% block realcontent %}
<h3>Les mails de rappel pour le spectacle {{ show.title }} ont bien été envoyés aux personnes suivantes</h3>
<ul>
{% for member in members %}
<li>{{ member.get_full_name }} ({{ member.email }})</li>
{% endfor %}
</ul>
<h3>Forme des mails envoyés</h3>
<br />Une seule place<br /><br />
<pre>{{ example1 }}</pre>
<br />Deux places<br /><br />
<pre>{{ example2 }}</pre>
{% endblock %}

View file

@ -52,6 +52,7 @@ urlpatterns = patterns('',
url(r'^bda/spectacles/(?P<tirage_id>\d+)/(?P<spectacle_id>\d+)$', "bda.views.spectacle", name = "bda-spectacle"), url(r'^bda/spectacles/(?P<tirage_id>\d+)/(?P<spectacle_id>\d+)$', "bda.views.spectacle", name = "bda-spectacle"),
url(r'^bda/spectacles-ics/(?P<tirage_id>\d+)$', 'bda.views.liste_spectacles_ics', name ="bda-liste-spectacles-ics"), url(r'^bda/spectacles-ics/(?P<tirage_id>\d+)$', 'bda.views.liste_spectacles_ics', name ="bda-liste-spectacles-ics"),
url(r'^bda/spectacles/unpaid/(?P<tirage_id>\d+)$', "bda.views.unpaid", name = "bda-unpaid"), url(r'^bda/spectacles/unpaid/(?P<tirage_id>\d+)$', "bda.views.unpaid", name = "bda-unpaid"),
url(r'bda/mails-rappel/(?P<spectacle_id>\d+)$', "bda.mails.send_rappel"),
url(r'^survey/(?P<survey_id>\d+)$', 'gestioncof.views.survey'), url(r'^survey/(?P<survey_id>\d+)$', 'gestioncof.views.survey'),
url(r'^event/(?P<event_id>\d+)$', 'gestioncof.views.event'), url(r'^event/(?P<event_id>\d+)$', 'gestioncof.views.event'),
url(r'^survey/(?P<survey_id>\d+)/status$', 'gestioncof.views.survey_status'), url(r'^survey/(?P<survey_id>\d+)/status$', 'gestioncof.views.survey_status'),