Skip to content
Snippets Groups Projects
Commit 16adaf63 authored by Dorian Lesbre's avatar Dorian Lesbre
Browse files

Working mass emails

parent c6154168
No related branches found
No related tags found
No related merge requests found
...@@ -128,7 +128,8 @@ class InterludesParticipant(models.Model): ...@@ -128,7 +128,8 @@ class InterludesParticipant(models.Model):
# mug = models.BooleanField("commander une tasse", default=False) # mug = models.BooleanField("commander une tasse", default=False)
def __str__(self) -> str: def __str__(self) -> str:
return "{} {} ({})".format(self.user.first_name, self.user.last_name, self.school) school = self.ENS(self.school).label.replace("ENS ", "") if self.school else ""
return "{} {} ({})".format(self.user.first_name, self.user.last_name, school)
@property @property
def nb_meals(self) -> int: def nb_meals(self) -> int:
......
...@@ -142,7 +142,7 @@ ...@@ -142,7 +142,7 @@
if (confirm( if (confirm(
`${errors}Cette action va envoyer {{ orga_email_nb }} emails.\nÊtes-vous sur de vouloir continuer ?` `${errors}Cette action va envoyer {{ orga_email_nb }} emails.\nÊtes-vous sur de vouloir continuer ?`
)) ))
window.location = "{% url 'home' %}"; window.location = "{% url 'email_orgas' %}";
} }
{% endif %} {% endif %}
</script> </script>
...@@ -152,11 +152,15 @@ ...@@ -152,11 +152,15 @@
<p>Un email communiquant la répartition aux utilisateurs a déjà été envoyé. <p>Un email communiquant la répartition aux utilisateurs a déjà été envoyé.
(Modifiez les paramètres s'il faut en renvoyer un) (Modifiez les paramètres s'il faut en renvoyer un)
</p> </p>
{% else %}
<p>L'email aux inscrits enverra un email à tous les utilisateurs inscrits</p>
{% endif %} {% endif %}
{% if settings.orga_notified %} {% if settings.orga_notified %}
<p>Un email communiquant les inscrits aux organisateur à déjà été envoyé. <p>Un email communiquant les inscrits aux organisateur à déjà été envoyé.
(Modifiez les paramètres s'il faut en renvoyer un) (Modifiez les paramètres s'il faut en renvoyer un)
</p> </p>
{% else %}
<p>L'email aux orga enverra un email uniquement aux orgas des activités qui ont demandé de communiquer la liste de participants.</p>
{% endif %} {% endif %}
<div class="flex wrap"> <div class="flex wrap">
......
...@@ -18,6 +18,7 @@ urlpatterns = [ ...@@ -18,6 +18,7 @@ urlpatterns = [
path('export/participants/', views.ExportParticipants.as_view(), name="participants.csv"), path('export/participants/', views.ExportParticipants.as_view(), name="participants.csv"),
path('export/activity_choices/', views.ExportActivityChoices.as_view(), name="activity_choices.csv"), path('export/activity_choices/', views.ExportActivityChoices.as_view(), name="activity_choices.csv"),
path('email/send_user_emails_0564946523/', views.SendUserEmail.as_view(), name="email_users"), path('email/send_user_emails_0564946523/', views.SendUserEmail.as_view(), name="email_users"),
path('email/send_orga_emails_5682480453/', views.SendOrgaEmail.as_view(), name="email_orgas"),
path( path(
'sitemap.xml', sitemap, {'sitemaps': sitemaps}, 'sitemap.xml', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap' name='django.contrib.sitemaps.views.sitemap'
......
from datetime import timedelta from datetime import timedelta
from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.sitemaps import Sitemap from django.contrib.sitemaps import Sitemap
...@@ -252,9 +251,7 @@ class AdminView(SuperuserRequiredMixin, TemplateView): ...@@ -252,9 +251,7 @@ class AdminView(SuperuserRequiredMixin, TemplateView):
validations += self.validate_activity_conflicts() validations += self.validate_activity_conflicts()
validations += '</ul>' validations += '</ul>'
user_email_nb = ActivityList.objects.filter( user_email_nb = InterludesParticipant.objects.filter(is_registered=True).count()
participant__is_registered=True
).values("participant").distinct().count()
orga_email_nb = InterludesActivity.objects.filter( orga_email_nb = InterludesActivity.objects.filter(
display=True, must_subscribe=True, communicate_participants=True display=True, must_subscribe=True, communicate_participants=True
).count() ).count()
...@@ -321,26 +318,40 @@ class ExportActivityChoices(SuperuserRequiredMixin, CSVWriteView): ...@@ -321,26 +318,40 @@ class ExportActivityChoices(SuperuserRequiredMixin, CSVWriteView):
]) ])
return rows return rows
class SendUserEmail(SuperuserRequiredMixin, RedirectView): class SendEmailBase(SuperuserRequiredMixin, RedirectView):
"""Envoie aux utilisateurs leur repartition d'activité""" """Classe abstraite pour l'envoie d'un groupe d'emails"""
pattern_name = "site_admin" pattern_name = "site_admin"
from_address = settings.DEFAULT_FROM_EMAIL from_address = None
def send_emails(self):
raise NotImplementedError("{}.send_emails isn't implemented".format(self.__class__.__name__))
def get_redirect_url(self, *args, **kwargs):
self.send_emails()
return reverse(self.pattern_name)
class SendUserEmail(SendEmailBase):
"""Envoie aux utilisateurs leur repartition d'activité"""
def get_emails(self): def get_emails(self):
"""genere les mails a envoyer""" """genere les mails a envoyer"""
# on envoie qu'au participant qui se sont inscrit à des activites # on envoie qu'au participant qui se sont inscrit à des activites
participants = ActivityList.objects.filter( participants = InterludesParticipant.objects.filter(is_registered=True)
participant__is_registered=True
).values("participant").distinct()
emails = [] emails = []
for p in participants: settings = SiteSettings.load()
participant = InterludesParticipant.objects.get(id = p["participant"]) for participant in participants:
messages = render_to my_activities = ActivityList.objects.filter(participant=participant)
message = render_to_string("email/user.html", {
"user": participant.user,
"settings": settings,
"requested_activities_nb": my_activities.count(),
"activities": my_activities.filter(accepted=True),
})
emails.append(( emails.append((
"Vos activités interludes", # subject "Vos activités interludes", # subject
message, message,
self.from_address, # From: self.from_address, # From:
[participant.user.email] # To: [participant.user.email], # To:
)) ))
return emails return emails
...@@ -351,12 +362,64 @@ class SendUserEmail(SuperuserRequiredMixin, RedirectView): ...@@ -351,12 +362,64 @@ class SendUserEmail(SuperuserRequiredMixin, RedirectView):
return return
settings.user_notified = True settings.user_notified = True
settings.save() settings.save()
messages.success(self.request, "Email aux utilisateurs envoyé") emails = self.get_emails()
send
nb_sent = send_mass_mail(emails, fail_silently=False)
mail_admins(
"Emails de répartition envoyés aux participants",
"Les participants ont reçu un mail leur communiquant la répartition des activités\n"
"Nombre total de mail envoyés: {}\n\n"
"-- Site Interludes (mail généré automatiquement".format(nb_sent)
)
messages.success(self.request, "{} mails envoyés aux utilisateurs".format(nb_sent))
class SendOrgaEmail(SendEmailBase):
"""
Envoie aux organisateur leur communiquant les nom/mail des inscrits
à leurs activités
"""
def get_emails(self):
"""genere les mails a envoyer"""
# on envoie qu'au participant qui se sont inscrit à des activites
activities = InterludesActivity.objects.filter(
must_subscribe=True, display=True, communicate_participants=True
)
emails = []
settings = SiteSettings.load()
for act in activities:
participants = ActivityList.objects.filter(activity=act, accepted=True)
message = render_to_string("email/orga.html", {
"activity": act,
"settings": settings,
"participants": participants,
})
emails.append((
"Vos activités interludes", # subject
message,
self.from_address, # From:
[act.host_email] # To:
))
return emails
def send_emails(self):
settings = SiteSettings.load()
if settings.orga_notified:
messages.error(self.request, "Les orgas ont déjà reçu un mail avec leur listes d'inscrits. Modifiez les réglages pour en envoyer un autre")
return
settings.orga_notified = True
settings.save()
emails = self.get_emails()
nb_sent = send_mass_mail(emails, fail_silently=False)
mail_admins(
"Listes d'inscrits envoyés aux orgas",
"Les mails communiquant aux organisateurs leur listes d'inscrit ont été envoyés\n"
"Nombre total de mail envoyés: {}\n\n"
"-- Site Interludes (mail généré automatiquement".format(nb_sent)
)
messages.success(self.request, "{} mails envoyés aux orgas".format(nb_sent))
def get_redirect_url(self, *args, **kwargs):
self.send_emails()
return reverse(self.pattern_name)
# ============================== # ==============================
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment