Send mails

This commit is contained in:
Yohann D'ANELLO 2020-05-05 17:12:24 +02:00
parent c9b198cd3d
commit f9dc0e57ad
9 changed files with 77 additions and 27 deletions

View File

@ -1,6 +1,8 @@
import os import os
from django.core.mail import send_mail
from django.db import models from django.db import models
from django.template.loader import render_to_string
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -201,6 +203,15 @@ class Team(models.Model):
verbose_name_plural = _("teams") verbose_name_plural = _("teams")
unique_together = (('name', 'year',), ('trigram', 'year',),) unique_together = (('name', 'year',), ('trigram', 'year',),)
def send_mail(self, template_name, subject="Contact TFJM²", **kwargs):
context = kwargs
context["team"] = self
for user in self.users.all():
context["user"] = user
message = render_to_string("mail_templates/" + template_name + ".txt", context=context)
message_html = render_to_string("mail_templates/" + template_name + ".html", context=context)
send_mail(subject, message, "contact@tfjm.org", [user.email], html_message=message_html)
def __str__(self): def __str__(self):
return self.trigram + " -- " + self.name return self.trigram + " -- " + self.name

View File

@ -2,7 +2,7 @@ from django.urls import path
from .views import TournamentListView, TournamentCreateView, TournamentDetailView, TournamentUpdateView, \ from .views import TournamentListView, TournamentCreateView, TournamentDetailView, TournamentUpdateView, \
TeamDetailView, TeamUpdateView, AddOrganizerView, SolutionsView, SolutionsOrgaListView, SynthesesView, \ TeamDetailView, TeamUpdateView, AddOrganizerView, SolutionsView, SolutionsOrgaListView, SynthesesView, \
SynthesesOrgaListView, PoolListView, PoolCreateView, PoolDetailView, PoolEndpoint SynthesesOrgaListView, PoolListView, PoolCreateView, PoolDetailView
app_name = "tournament" app_name = "tournament"
@ -20,6 +20,5 @@ urlpatterns = [
path("all_syntheses/", SynthesesOrgaListView.as_view(), name="all_syntheses"), path("all_syntheses/", SynthesesOrgaListView.as_view(), name="all_syntheses"),
path("pools/", PoolListView.as_view(), name="pools"), path("pools/", PoolListView.as_view(), name="pools"),
path("pool/add/", PoolCreateView.as_view(), name="create_pool"), path("pool/add/", PoolCreateView.as_view(), name="create_pool"),
path("pool/add/endpoint/", PoolEndpoint.as_view(), name="create_pool_endpoint"),
path("pool/<int:pk>/", PoolDetailView.as_view(), name="pool_detail"), path("pool/<int:pk>/", PoolDetailView.as_view(), name="pool_detail"),
] ]

View File

@ -11,15 +11,12 @@ from django.shortcuts import redirect
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils import timezone from django.utils import timezone
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import DetailView, CreateView, UpdateView from django.views.generic import DetailView, CreateView, UpdateView
from django.views.generic.edit import BaseFormView from django.views.generic.edit import BaseFormView
from django_tables2.views import SingleTableView from django_tables2.views import SingleTableView
from member.models import TFJMUser, Solution, Synthesis from member.models import TFJMUser, Solution, Synthesis
from .forms import TournamentForm, OrganizerForm, SolutionForm, SynthesisForm, TeamForm, PoolForm from .forms import TournamentForm, OrganizerForm, SolutionForm, SynthesisForm, TeamForm, PoolForm
from .models import Tournament, Team, Pool from .models import Tournament, Team, Pool
from .tables import TournamentTable, TeamTable, SolutionTable, SynthesisTable, PoolTable from .tables import TournamentTable, TeamTable, SolutionTable, SynthesisTable, PoolTable
@ -145,17 +142,17 @@ class TeamDetailView(LoginRequiredMixin, DetailView):
elif "request_validation" in request.POST and request.user.participates: elif "request_validation" in request.POST and request.user.participates:
team.validation_status = "1waiting" team.validation_status = "1waiting"
team.save() team.save()
# TODO Send mail team.send_mail("request_validation", "Demande de validation TFJM²")
return redirect('tournament:team_detail', pk=team.pk) return redirect('tournament:team_detail', pk=team.pk)
elif "validate" in request.POST and request.user.organizes: elif "validate" in request.POST and request.user.organizes:
team.validation_status = "2valid" team.validation_status = "2valid"
team.save() team.save()
# TODO Send mail team.send_mail("validate_team", "Équipe validée TFJM²")
return redirect('tournament:team_detail', pk=team.pk) return redirect('tournament:team_detail', pk=team.pk)
elif "invalidate" in request.POST and request.user.organizes: elif "invalidate" in request.POST and request.user.organizes:
team.validation_status = "0invalid" team.validation_status = "0invalid"
team.save() team.save()
# TODO Send mail team.send_mail("unvalidate_team", "Équipe non validée TFJM²")
return redirect('tournament:team_detail', pk=team.pk) return redirect('tournament:team_detail', pk=team.pk)
elif "delete" in request.POST and request.user.organizes: elif "delete" in request.POST and request.user.organizes:
team.delete() team.delete()
@ -485,11 +482,3 @@ class PoolDetailView(LoginRequiredMixin, DetailView):
return resp return resp
return self.get(request, *args, **kwargs) return self.get(request, *args, **kwargs)
@method_decorator(csrf_exempt, 'dispatch')
class PoolEndpoint(View):
def post(self, request, *args, **kwargs):
print(request.headers)
print(request.user)
print(self.request.POST)

View File

@ -6,11 +6,11 @@
<title>Demande de validation - TFJM²</title> <title>Demande de validation - TFJM²</title>
</head> </head>
<body> <body>
Bonjour {FIRST_NAME} {SURNAME},<br /> Bonjour {{ user }},<br />
<br /> <br />
L'équipe « {TEAM_NAME} » ({TRIGRAM}) vient de demander à valider son équipe pour participer au tournoi {TOURNAMENT} du L'équipe « {{ team.name }} » ({{ team.trigram }}) vient de demander à valider son équipe pour participer au tournoi
TFJM². Vous pouvez décider d'accepter ou de refuser l'équipe en vous rendant sur la page de l'équipe : {{ tournament }} du TFJM². Vous pouvez décider d'accepter ou de refuser l'équipe en vous rendant sur la page de l'équipe :
<a href="{URL_BASE}/equipe/{TRIGRAM}">{URL_BASE}/equipe/{TRIGRAM}</a><br/> <a href="{% url "tournament:team_detail" pk=team.pk %}">{% url "tournament:team_detail" pk=team.pk %}</a><br/>
<br/> <br/>
Cordialement,<br/> Cordialement,<br/>
<br /> <br />

View File

@ -0,0 +1,9 @@
Bonjour {{ user }},
L'équipe « {{ team.name }} » ({{ team.trigram }}) vient de demander à valider son équipe pour participer au tournoi
{{ tournament }} du TFJM². Vous pouvez décider d'accepter ou de refuser l'équipe en vous rendant sur la page de l'équipe :
<a href="{% url "tournament:team_detail" pk=team.pk %}">{% url "tournament:team_detail" pk=team.pk %}</a>
Cordialement,
Le comité national d'organisation du TFJM²

View File

@ -2,15 +2,22 @@
<html lang="fr"> <html lang="fr">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Équipe non validée TFJM² {YEAR}</title> <title>Équipe non validée TFJM²</title>
</head> </head>
<body> <body>
Bonjour {FIRST_NAME} {SURNAME},<br/> Bonjour {{ user }},<br/>
<br/> <br/>
Maleureusement, votre équipe « {TEAM_NAME} » ({TRIGRAM}) n'a pas été validée. Veuillez vérifier que vos autorisations sont correctes. Maleureusement, votre équipe « {{ team.name }} » ({{ team.trigram }}) n'a pas été validée. Veuillez vérifier que vos autorisations sont correctes.
{MESSAGE}<br /> {% if message %}
<p>
Le CNO vous adresse le message suivant :
<div>
{{ message }}
</div>
</p>
{% endif %}
<br /> <br />
N'hésitez pas à nous contacter à l'adresse <a href="contact@tfjm.org">contact@tfjm.org</a> pour plus d'informations. N'hésitez pas à nous contacter à l'adresse <a href="mailto:contact@tfjm.org">contact@tfjm.org</a> pour plus d'informations.
<br/> <br/>
Cordialement,<br/> Cordialement,<br/>
<br/> <br/>

View File

@ -0,0 +1,15 @@
Bonjour {{ user }},
Maleureusement, votre équipe « {{ team.name }} » ({{ team.trigram }}) n'a pas été validée. Veuillez vérifier que vos autorisations sont correctes.
{% if message %}
Le CNO vous adresse le message suivant :
{{ message }}
{% endif %}
N'hésitez pas à nous contacter à l'adresse contact@tfjm.org pour plus d'informations.
Cordialement,
Le comité national d'organisation du TFJM²

View File

@ -9,7 +9,14 @@ Bonjour {{ user }},<br/>
<br/> <br/>
Félicitations ! Votre équipe « {{ team }} » ({{ team.trigram }}) est désormais validée ! Vous êtes désormais apte à travailler sur Félicitations ! Votre équipe « {{ team }} » ({{ team.trigram }}) est désormais validée ! Vous êtes désormais apte à travailler sur
vos problèmes et publier vos solutions sur la plateforme. vos problèmes et publier vos solutions sur la plateforme.
{{ message }}<br /> {% if message %}
<p>
Le CNO vous adresse le message suivant :
<div>
{{ message }}
</div>
</p>
{% endif %}
<br/> <br/>
Cordialement,<br/> Cordialement,<br/>
<br/> <br/>

View File

@ -0,0 +1,13 @@
Bonjour {{ user }},
Félicitations ! Votre équipe « {{ team }} » ({{ team.trigram }}) est désormais validée ! Vous êtes désormais apte à travailler sur
vos problèmes et publier vos solutions sur la plateforme.
{% if message %}
Le CNO vous adresse le message suivant :
{{ message }}
{% endif %}
Cordialement,
Le comité national d'organisation du TFJM²