From e62284d55c9c0b74d9fa2289ed0e8534d25fa96c Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Fri, 2 Feb 2018 09:55:09 +0100 Subject: [PATCH] Add confirmation/validation/convocation views --- candidats/admin.py | 108 +++-------- candidats/models.py | 7 + candidats/tests.py | 135 ++++++++++---- candidats/views.py | 171 +++++++++++++++--- common/urls.py | 7 +- templates/email/candidate_confirm_EDE.txt | 15 +- templates/email/candidate_confirm_FE.txt | 9 +- templates/email/validation_enseignant_EDE.txt | 19 ++ 8 files changed, 312 insertions(+), 159 deletions(-) create mode 100644 templates/email/validation_enseignant_EDE.txt diff --git a/candidats/admin.py b/candidats/admin.py index c595c3a..467d760 100644 --- a/candidats/admin.py +++ b/candidats/admin.py @@ -1,21 +1,13 @@ -import os -import tempfile -import zipfile from collections import OrderedDict -from datetime import date -from django import forms from django.contrib import admin -from django.core.mail import EmailMessage from django.db.models import BooleanField -from django.http import HttpResponse -from django.template import loader from django.urls import reverse +from django.utils.html import format_html from stages.exports import OpenXMLExport from .forms import CandidateForm from .models import Candidate, Interview, GENDER_CHOICES -from .pdf import InscriptionSummaryPDF def export_candidates(modeladmin, request, queryset): @@ -46,85 +38,21 @@ def export_candidates(modeladmin, request, queryset): export_candidates.short_description = "Exporter les candidats sélectionnés" -def send_confirmation_mail(modeladmin, request, queryset): - from_email = request.user.email - subject = "Confirmation de votre inscription à l'Ecole Santé-social Pierre-Coullery" - email_sent = 0 - - for candidate in queryset.filter( - deposite_date__isnull=False, date_confirmation_mail__isnull=True, canceled_file=False): - to = [candidate.email] - - if candidate.corporation and candidate.corporation.email: - to.append(candidate.corporation.email) - if candidate.instructor and candidate.instructor.email: - to.append(candidate.instructor.email) - - context = { - 'candidate_civility': candidate.civility, - 'candidate_name': " ".join([candidate.civility, candidate.first_name, candidate.last_name]), - 'section': candidate.section, - 'sender_name': " ".join([request.user.first_name, request.user.last_name]), - 'sender_email': from_email, - } - - if candidate.section == 'EDE': - body = loader.render_to_string('email/candidate_confirm_EDE.txt', context) - else: - body = loader.render_to_string('email/candidate_confirm_FE.txt', context) - - email = EmailMessage( - subject=subject, - body=body, - from_email=from_email, - to=to, - bcc=[from_email] - ) - - try: - email.send() - email_sent += 1 - except Exception as err: - modeladmin.message_user(request, "Échec d’envoi pour le candidat {0} ({1})".format(candidate, err)) - else: - candidate.date_confirmation_mail = date.today() - candidate.save() - modeladmin.message_user(request, "%d messages de confirmation ont été envoyés." % email_sent) -send_confirmation_mail.short_description = "Envoyer email de confirmation" - - -def print_summary(modeladmin, request, queryset): - """ - Print a summary of inscription - """ - filename = 'archive_InscriptionResumes.zip' - path = os.path.join(tempfile.gettempdir(), filename) - - with zipfile.ZipFile(path, mode='w', compression=zipfile.ZIP_DEFLATED) as filezip: - for candidate in queryset: - pdf = InscriptionSummaryPDF(candidate) - pdf.produce(candidate) - filezip.write(pdf.filename) - - with open(filezip.filename, mode='rb') as fh: - response = HttpResponse(fh.read(), content_type='application/zip') - response['Content-Disposition'] = 'attachment; filename="{0}"'.format(filename) - return response -print_summary.short_description = 'Imprimer résumé' - - class CandidateAdmin(admin.ModelAdmin): form = CandidateForm list_display = ('last_name', 'first_name', 'section', 'confirm_mail', 'convocation') list_filter = ('section', 'option') - readonly_fields = ('total_result_points', 'total_result_mark', 'confirmation_date') - actions = [export_candidates, send_confirmation_mail, print_summary] + readonly_fields = ( + 'total_result_points', 'total_result_mark', 'confirmation_date', 'validation_date', + 'convocation_date', 'candidate_actions', + ) + actions = [export_candidates] fieldsets = ( (None, { 'fields': (('first_name', 'last_name', 'gender'), ('street', 'pcode', 'city', 'district'), ('mobile', 'email'), - ('birth_date', 'avs', 'handicap', 'has_photo'), + ('birth_date', 'avs', 'handicap'), ('section', 'option'), ('corporation', 'instructor'), ('deposite_date', 'confirmation_date', 'canceled_file'), @@ -138,15 +66,19 @@ class CandidateAdmin(admin.ModelAdmin): ("EDE/EDS", { 'classes': ('collapse',), 'fields': (('diploma', 'diploma_detail', 'diploma_status'), - ('registration_form', 'certificate_of_payement', 'cv', 'police_record', 'reflexive_text', + ('registration_form', 'has_photo', 'certificate_of_payement', 'cv', 'police_record', 'reflexive_text', 'marks_certificate', 'residence_permits', 'aes_accords'), ('certif_of_800_childhood', 'certif_of_800_general', 'work_certificate'), ('promise', 'contract', 'activity_rate'), ('interview',), ('examination_result', 'interview_result', 'file_result', 'total_result_points', - 'total_result_mark') + 'total_result_mark'), + ('confirmation_date', 'validation_date', 'convocation_date'), ), }), + (None, { + 'fields': (('candidate_actions',)), + }), ) def confirm_mail(self, obj): @@ -164,6 +96,20 @@ class CandidateAdmin(admin.ModelAdmin): convocation.short_description = 'Convoc. aux examens' convocation.allow_tags = True + def candidate_actions(self, obj): + return format_html( + 'Confirmation de réception ' + 'Validation enseignants EDE ' + 'Convocation aux examens EDE ' + 'Impression du résumé du dossier EDE', + reverse('candidate-confirmation', args=[obj.pk]), + reverse('candidate-validation', args=[obj.pk]), + reverse('candidate-convocation', args=[obj.pk]), + reverse('candidate-summary', args=[obj.pk]), + ) + candidate_actions.short_description = 'Actions pour candidats' + candidate_actions.allow_tags = True + class InterviewAdmin(admin.ModelAdmin): pass diff --git a/candidats/models.py b/candidats/models.py index 49ec1bb..38b6219 100644 --- a/candidats/models.py +++ b/candidats/models.py @@ -139,6 +139,13 @@ class Candidate(models.Model): else: return '' + @property + def section_option(self): + if not self.option: + return self.get_section_display() + else: + return '{0}, option «{1}»'.format(self.get_section_display(), self.get_option_display()) + def get_ok(self, fieldname): return 'OK' if getattr(self, fieldname) is True else 'NON' diff --git a/candidats/tests.py b/candidats/tests.py index a3a378b..ce5632a 100644 --- a/candidats/tests.py +++ b/candidats/tests.py @@ -86,6 +86,8 @@ class CandidateTests(TestCase): self.assertEqual(response.status_code, 302) def test_send_confirmation_mail(self): + self.maxDiff = None + ede = Section.objects.create(name='EDE') ase = Section.objects.create(name='ASE') Candidate.objects.bulk_create([ @@ -96,50 +98,67 @@ class CandidateTests(TestCase): Candidate(first_name='Hervé', last_name='Bern', gender='M', section=ede, deposite_date=date.today(), canceled_file=True), # Good + Candidate(first_name='Henri', last_name='Dupond', gender='M', section=ede, option='ENF', + email='henri@example.org', deposite_date=date.today()), Candidate(first_name='Joé', last_name='Glatz', gender='F', section=ase, email='joe@example.org', deposite_date=date.today()), - Candidate(first_name='Henri', last_name='Dupond', gender='M', section=ede, - email='henri@example.org', deposite_date=date.today()), ]) - change_url = reverse('admin:candidats_candidate_changelist') self.client.login(username='me', password='mepassword') - response = self.client.post(change_url, { - 'action': 'send_confirmation_mail', - '_selected_action': Candidate.objects.values_list('pk', flat=True) - }, follow=True) - self.assertEqual(len(mail.outbox), 2) + cand1 = Candidate.objects.get(last_name='Simth') + response = self.client.get(reverse('candidate-confirmation', args=[cand1.pk]), follow=True) + msg = "\n".join(str(m) for m in response.context['messages']) + self.assertEqual(msg, "Une confirmation a déjà été envoyée!") + + cand2 = Candidate.objects.get(last_name='Bern') + response = self.client.get(reverse('candidate-confirmation', args=[cand2.pk]), follow=True) + msg = "\n".join(str(m) for m in response.context['messages']) + self.assertEqual(msg, "Ce dossier a été annulé!") + + cand3 = Candidate.objects.get(last_name='Dupond') + response = self.client.get(reverse('candidate-confirmation', args=[cand3.pk])) + data = response.context['form'].initial + response = self.client.post( + reverse('candidate-confirmation', args=[cand3.pk]), data=data, follow=True + ) + self.assertEqual(len(mail.outbox), 1) # Logged-in user also receives as Bcc self.assertEqual(mail.outbox[0].recipients(), ['henri@example.org', 'me@example.org']) - self.assertEqual(mail.outbox[1].recipients(), ['joe@example.org', 'me@example.org']) # Mail content differ depending on the section - self.assertEqual(mail.outbox[0].body, """Monsieur, + self.assertEqual(mail.outbox[0].body, """Monsieur Henri Dupond, -Par ce courriel, nous vous confirmons la bonne réception de votre dossier de candidature à la formation ES d’Educateur-trice de l’enfance et vous remercions de l’intérêt que vous portez à notre institution. +Par ce courriel, nous vous confirmons la bonne réception de vos documents de candidature à la formation Education de l'enfance, dipl. ES, option «Enfance» et vous remercions de l’intérêt que vous portez à notre institution. -Celui-ci sera traité et des nouvelles vous seront communiquées par courriel durant la 2ème quinzaine du mois de février. +Votre dossier sera traité dans les jours à venir et des nouvelles vous seront communiquées par courriel durant la 2ème quinzaine du mois de février. Dans l’intervalle, nous vous adressons, Monsieur, nos salutations les plus cordiales. -Secrétariat de l'EPC -tél. 032 886 33 00 - +Secrétariat de la filière Education de l’enfance, dipl. ES Hans Schmid me@example.org -""".format() +tél. 032 886 33 00""" ) - self.assertEqual(mail.outbox[1].body, """Madame, Monsieur, -Nous vous confirmons la bonne réception de l'inscription de Madame Joé Glatz dans la filière ASE pour l'année scolaire à venir. + mail.outbox = [] + cand4 = Candidate.objects.get(last_name='Glatz') + response = self.client.get(reverse('candidate-confirmation', args=[cand4.pk])) + data = response.context['form'].initial + response = self.client.post( + reverse('candidate-confirmation', args=[cand4.pk]), data=data, follow=True + ) + self.assertEqual(len(mail.outbox), 1) + # Logged-in user also receives as Bcc + self.assertEqual(mail.outbox[0].recipients(), ['joe@example.org', 'me@example.org']) + self.assertEqual(mail.outbox[0].body, """Madame, Monsieur, + +Nous vous confirmons la bonne réception de l’inscription de Madame Joé Glatz dans la filière Assist. socio-éducatif-ve CFC pour l’année scolaire à venir. Nous nous tenons à votre disposition pour tout renseignement complémentaire et vous prions de recevoir, Madame, Monsieur, nos salutations les plus cordiales. -Secrétariat de l'EPC -tél. 032 886 33 00 - +Secrétariat de l’EPC Hans Schmid me@example.org -""".format() +tél. 032 886 33 00""" ) # One was already set, 2 new. self.assertEqual(Candidate.objects.filter(confirmation_date__isnull=False).count(), 3) @@ -150,14 +169,14 @@ me@example.org first_name='Henri', last_name='Dupond', gender='M', section=ede, email='henri@example.org', deposite_date=date.today() ) - change_url = reverse('admin:candidats_candidate_changelist') self.client.login(username='me', password='mepassword') + response = self.client.get(reverse('candidate-confirmation', args=[henri.pk])) + data = response.context['form'].initial with mock.patch('django.core.mail.EmailMessage.send') as mocked: mocked.side_effect = Exception("Error sending mail") - response = self.client.post(change_url, { - 'action': 'send_confirmation_mail', - '_selected_action': Candidate.objects.values_list('pk', flat=True) - }, follow=True) + response = self.client.post( + reverse('candidate-confirmation', args=[henri.pk]), data=data, follow=True + ) self.assertContains(response, "Échec d’envoi pour le candidat Dupond Henri (Error sending mail)") henri.refresh_from_db() self.assertIsNone(henri.confirmation_date) @@ -217,21 +236,69 @@ tél. 032 886 33 00 henri.refresh_from_db() self.assertIsNotNone(henri.convocation_date) + def test_validation_enseignant_ede(self): + self.maxDiff = None + ede = Section.objects.create(name='EDE') + henri = Candidate.objects.create( + first_name='Henri', last_name='Dupond', gender='M', birth_date=date(2000, 5, 15), + street="Rue Neuve 3", pcode='2222', city='Petaouchnok', + section=ede, option='ENF', + email='henri@example.org', deposite_date=date.today() + ) + t1 = Teacher.objects.create( + first_name="Julie", last_name="Caux", abrev="JCA", email="julie@example.org" + ) + t2 = Teacher.objects.create( + first_name='Jeanne', last_name='Dubois', abrev="JDU", email="jeanne@example.org" + ) + inter = Interview.objects.create( + date=datetime(2018, 3, 10, 10, 30), room='B103', candidat=henri, + teacher_int=t1, teacher_file=t2, + ) + self.client.login(username='me', password='mepassword') + response = self.client.get(reverse('candidate-validation', args=[henri.pk])) + expected_message = """Bonjour, + +Par ce courriel, je vous informe qu'un entretien d'admission a été planifié selon les modalités suivantes: + +- samedi 10 mars 2018 à 10h30, en salle B103 + Candidat : + Monsieur Henri Dupond + Rue Neuve 3 + 2222 Petaouchnok + Date de naiss.: 15 mai 2000 + +Sans nouvelle de votre part dans les 48 heures, une convocation définitive sera envoyée au candidat. + +Avec mes meilleurs messages. + +Secrétariat de la filière Education de l’enfance, dipl. ES +Hans Schmid +me@example.org +tél. 032 886 33 00 +""" + self.assertEqual(response.context['form'].initial['message'], expected_message) + + data = response.context['form'].initial + response = self.client.post(reverse('candidate-validation', args=[henri.pk]), data=data) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(mail.outbox[0].recipients(), ["julie@example.org", "jeanne@example.org", 'me@example.org']) + self.assertEqual(mail.outbox[0].subject, "Validation de l'entretien d'admission") + henri.refresh_from_db() + self.assertIsNotNone(henri.validation_date) + def test_summary_pdf(self): ede = Section.objects.create(name='EDE') cand = Candidate.objects.create( first_name='Henri', last_name='Dupond', gender='M', section=ede, email='henri@example.org', deposite_date=date.today() ) - change_url = reverse('admin:candidats_candidate_changelist') + summary_url = reverse('candidate-summary', args=[cand.pk]) self.client.login(username='me', password='mepassword') - response = self.client.post(change_url, { - 'action': 'print_summary', - '_selected_action': Candidate.objects.values_list('pk', flat=True) - }, follow=True) + response = self.client.post(summary_url, follow=True) self.assertEqual( response['Content-Disposition'], - 'attachment; filename="archive_InscriptionResumes.zip"' + 'attachment; filename="dupond_henri.pdf"' ) - self.assertEqual(response['Content-Type'], 'application/zip') + self.assertEqual(response['Content-Type'], 'application/pdf') self.assertGreater(len(response.content), 200) diff --git a/candidats/views.py b/candidats/views.py index 2fa2d34..e8e0ab7 100644 --- a/candidats/views.py +++ b/candidats/views.py @@ -1,19 +1,145 @@ +import os + from django.conf import settings from django.contrib import messages from django.core.mail import EmailMessage +from django.http import HttpResponse +from django.shortcuts import redirect from django.template import loader -from django.urls import reverse_lazy +from django.urls import reverse, reverse_lazy from django.utils import timezone from django.views.generic import FormView from candidats.forms import EmailBaseForm -from candidats.models import Candidate +from candidats.models import Candidate, Interview +from .pdf import InscriptionSummaryPDF -class SendConvocationView(FormView): +class EmailConfirmationBaseView(FormView): template_name = 'email_base.html' form_class = EmailBaseForm success_url = reverse_lazy('admin:candidats_candidate_changelist') + success_message = "Le message a été envoyé pour le candidat {candidate}" + candidate_date_field = None + + def form_valid(self, form): + email = EmailMessage( + subject=form.cleaned_data['subject'], + body=form.cleaned_data['message'], + from_email=form.cleaned_data['sender'], + to=form.cleaned_data['to'].split(';'), + bcc=form.cleaned_data['cci'].split(';'), + ) + candidate = Candidate.objects.get(pk=self.kwargs['pk']) + try: + email.send() + except Exception as err: + messages.error(self.request, "Échec d’envoi pour le candidat {0} ({1})".format(candidate, err)) + else: + setattr(candidate, self.candidate_date_field, timezone.now()) + candidate.save() + messages.success(self.request, self.success_message.format(candidate=candidate)) + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({ + 'candidat': Candidate.objects.get(pk=self.kwargs['pk']), + 'title': self.title, + }) + return context + + +class ConfirmationView(EmailConfirmationBaseView): + success_message = "Le message de confirmation a été envoyé pour le candidat {candidate}" + candidate_date_field = 'confirmation_date' + title = "Confirmation de réception de dossier" + + def get(self, request, *args, **kwargs): + candidate = Candidate.objects.get(pk=self.kwargs['pk']) + if candidate.confirmation_date: + messages.error(request, 'Une confirmation a déjà été envoyée!') + return redirect(reverse("admin:candidats_candidate_change", args=(candidate.pk,))) + elif candidate.canceled_file: + messages.error(request, 'Ce dossier a été annulé!') + return redirect(reverse("admin:candidats_candidate_change", args=(candidate.pk,))) + return super().get(request, *args, **kwargs) + + def get_initial(self): + initial = super().get_initial() + candidate = Candidate.objects.get(pk=self.kwargs['pk']) + + to = [candidate.email] + if candidate.section == 'EDE': + src_email = 'email/candidate_confirm_EDE.txt' + else: + src_email = 'email/candidate_confirm_FE.txt' + if candidate.corporation and candidate.corporation.email: + to.append(candidate.corporation.email) + if candidate.instructor and candidate.instructor.email: + to.append(candidate.instructor.email) + + msg_context = { + 'candidate': candidate, + 'sender': self.request.user, + } + initial.update({ + 'id_candidate': candidate.pk, + 'cci': self.request.user.email, + 'to': '; '.join(to), + 'subject': "Inscription à la formation {0}".format(candidate.section_option), + 'message': loader.render_to_string(src_email, msg_context), + 'sender': self.request.user.email, + }) + return initial + + +class ValidationView(EmailConfirmationBaseView): + success_message = "Le message de validation a été envoyé pour le candidat {candidate}" + candidate_date_field = 'validation_date' + title = "Validation des examens par les enseignant-e-s EDE" + + def get(self, request, *args, **kwargs): + candidate = Candidate.objects.get(pk=self.kwargs['pk']) + if candidate.validation_date: + messages.error(request, 'Une validation a déjà été envoyée!') + return redirect(reverse("admin:candidats_candidate_change", args=(candidate.pk,))) + return super().get(request, *args, **kwargs) + + def get_initial(self): + initial = super().get_initial() + candidate = Candidate.objects.get(pk=self.kwargs['pk']) + + msg_context = { + 'candidate': candidate, + 'sender': self.request.user, + } + initial.update({ + 'id_candidate': candidate.pk, + 'cci': self.request.user.email, + 'to': ';'.join([ + candidate.interview.teacher_int.email, candidate.interview.teacher_file.email + ]), + 'subject': "Validation de l'entretien d'admission", + 'message': loader.render_to_string('email/validation_enseignant_EDE.txt', msg_context), + 'sender': self.request.user.email, + }) + return initial + + +class ConvocationView(EmailConfirmationBaseView): + success_message = "Le message de convocation a été envoyé pour le candidat {candidate}" + candidate_date_field = 'convocation_date' + title = "Convocation aux examens d'admission EDE" + + def get(self, request, *args, **kwargs): + candidate = Candidate.objects.get(pk=self.kwargs['pk']) + try: + candidate.interview + except Interview.DoesNotExist: + messages.error(request, "Impossible de convoquer sans d'abord définir un interview!") + return redirect(reverse("admin:candidats_candidate_change", args=(candidate.pk,))) + return super().get(request, *args, **kwargs) def get_initial(self): initial = super().get_initial() @@ -59,31 +185,16 @@ class SendConvocationView(FormView): }) return initial - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context.update({ - 'candidat': Candidate.objects.get(pk=self.kwargs['pk']), - 'title': "Convocation aux examens d'admission EDE", - }) - return context - def form_valid(self, form): - email = EmailMessage( - subject=form.cleaned_data['subject'], - body=form.cleaned_data['message'], - from_email=form.cleaned_data['sender'], - to=form.cleaned_data['to'].split(';'), - bcc=form.cleaned_data['cci'].split(';'), - ) - candidate = Candidate.objects.get(pk=self.kwargs['pk']) - try: - email.send() - except Exception as err: - messages.error(self.request, "Échec d’envoi pour le candidat {0} ({1})".format(candidate, err)) - else: - candidate.convocation_date = timezone.now() - candidate.save() - messages.success(self.request, - "Le message de convocation a été envoyé pour le candidat {0}".format(candidate) - ) - return super().form_valid(form) +def inscription_summary(request, pk): + """ + Print a PDF summary of inscription + """ + candidat = Candidate.objects.get(pk=pk) + pdf = InscriptionSummaryPDF(candidat) + pdf.produce(candidat) + + with open(pdf.filename, mode='rb') as fh: + response = HttpResponse(fh.read(), content_type='application/pdf') + response['Content-Disposition'] = 'attachment; filename="{0}"'.format(os.path.basename(pdf.filename)) + return response diff --git a/common/urls.py b/common/urls.py index f82fb50..44362a9 100644 --- a/common/urls.py +++ b/common/urls.py @@ -22,8 +22,13 @@ urlpatterns = [ path('classes/', views.KlassListView.as_view(), name='classes'), path('classes//', views.KlassView.as_view(), name='class'), - path('candidate//send_convocation/', candidats_views.SendConvocationView.as_view(), + path('candidate//send_convocation/', candidats_views.ConvocationView.as_view(), name='candidate-convocation'), + path('candidate//send_confirmation/', candidats_views.ConfirmationView.as_view(), + name='candidate-confirmation'), + path('candidate//send_validation/', candidats_views.ValidationView.as_view(), + name='candidate-validation'), + path('candidate//summary/', candidats_views.inscription_summary, name='candidate-summary'), path('imputations/export/', views.imputations_export, name='imputations_export'), path('print/update_form/', views.print_update_form, name='print_update_form'), diff --git a/templates/email/candidate_confirm_EDE.txt b/templates/email/candidate_confirm_EDE.txt index 58bf84c..b9c38bf 100644 --- a/templates/email/candidate_confirm_EDE.txt +++ b/templates/email/candidate_confirm_EDE.txt @@ -1,14 +1,13 @@ -{{ candidate_civility }}, +{{ candidate.civility }} {{ candidate.first_name }} {{ candidate.last_name }}, -Par ce courriel, nous vous confirmons la bonne réception de votre dossier de candidature à la formation ES d’Educateur-trice de l’enfance et vous remercions de l’intérêt que vous portez à notre institution. +Par ce courriel, nous vous confirmons la bonne réception de vos documents de candidature à la formation {{ candidate.section_option }} et vous remercions de l’intérêt que vous portez à notre institution. -Celui-ci sera traité et des nouvelles vous seront communiquées par courriel durant la 2ème quinzaine du mois de février. +Votre dossier sera traité dans les jours à venir et des nouvelles vous seront communiquées par courriel durant la 2ème quinzaine du mois de février. -Dans l’intervalle, nous vous adressons, {{ candidate_civility }}, nos salutations les plus cordiales. +Dans l’intervalle, nous vous adressons, {{ candidate.civility }}, nos salutations les plus cordiales. -Secrétariat de l'EPC +Secrétariat de la filière Education de l’enfance, dipl. ES +{{ sender.first_name }} {{ sender.last_name }} +{{ sender.email }} tél. 032 886 33 00 - -{{ sender_name }} -{{ sender_email }} diff --git a/templates/email/candidate_confirm_FE.txt b/templates/email/candidate_confirm_FE.txt index c0fd20b..3eb903b 100644 --- a/templates/email/candidate_confirm_FE.txt +++ b/templates/email/candidate_confirm_FE.txt @@ -1,11 +1,10 @@ Madame, Monsieur, -Nous vous confirmons la bonne réception de l'inscription de {{ candidate_name }} dans la filière {{ section }} pour l'année scolaire à venir. +Nous vous confirmons la bonne réception de l’inscription de {{ candidate.civility }} {{ candidate.first_name }} {{candidate.last_name}} dans la filière {{ candidate.section_option }} pour l’année scolaire à venir. Nous nous tenons à votre disposition pour tout renseignement complémentaire et vous prions de recevoir, Madame, Monsieur, nos salutations les plus cordiales. -Secrétariat de l'EPC +Secrétariat de l’EPC +{{ sender.first_name }} {{ sender.last_name }} +{{ sender.email }} tél. 032 886 33 00 - -{{ sender_name }} -{{ sender_email }} diff --git a/templates/email/validation_enseignant_EDE.txt b/templates/email/validation_enseignant_EDE.txt new file mode 100644 index 0000000..e03321e --- /dev/null +++ b/templates/email/validation_enseignant_EDE.txt @@ -0,0 +1,19 @@ +Bonjour, + +Par ce courriel, je vous informe qu'un entretien d'admission a été planifié selon les modalités suivantes: + +- {{ candidate.interview.date_formatted }}, en salle {{ candidate.interview.room }} + Candidat{% if candidate.gender == "F" %}e{% endif %} : + {{ candidate.civility }} {{ candidate.first_name }} {{ candidate.last_name }} + {{ candidate.street }} + {{ candidate.pcode }} {{ candidate.city }} + Date de naiss.: {{ candidate.birth_date }} + +Sans nouvelle de votre part dans les 48 heures, une convocation définitive sera envoyée {% if candidate.gender == "F" %}à la candidate{% else %} au candidat{% endif %}. + +Avec mes meilleurs messages. + +Secrétariat de la filière Education de l’enfance, dipl. ES +{{ sender.first_name }} {{ sender.last_name }} +{{ sender.email }} +tél. 032 886 33 00