✨(back) add invitation email templates
Add HTML and text email templates for calendar invitations, updates, cancellations and attendee reply notifications. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
145
src/backend/core/templates/emails/calendar_invitation.html
Normal file
145
src/backend/core/templates/emails/calendar_invitation.html
Normal file
@@ -0,0 +1,145 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Invitation à un événement</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
||||
line-height: 1.6;
|
||||
color: #333;
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
.container {
|
||||
background-color: #ffffff;
|
||||
border-radius: 8px;
|
||||
padding: 30px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.header {
|
||||
border-bottom: 2px solid #0066cc;
|
||||
padding-bottom: 15px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.header h1 {
|
||||
color: #0066cc;
|
||||
margin: 0;
|
||||
font-size: 24px;
|
||||
}
|
||||
.event-title {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
margin: 15px 0;
|
||||
}
|
||||
.event-details {
|
||||
background-color: #f8f9fa;
|
||||
border-left: 4px solid #0066cc;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.event-details table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.event-details td {
|
||||
padding: 8px 0;
|
||||
vertical-align: top;
|
||||
}
|
||||
.event-details td:first-child {
|
||||
font-weight: bold;
|
||||
color: #666;
|
||||
width: 120px;
|
||||
}
|
||||
.event-details td:last-child {
|
||||
color: #333;
|
||||
}
|
||||
.description {
|
||||
background-color: #fff;
|
||||
border: 1px solid #eee;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.description h3 {
|
||||
margin-top: 0;
|
||||
color: #666;
|
||||
}
|
||||
.instructions {
|
||||
background-color: #e7f3ff;
|
||||
border-radius: 4px;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.instructions p {
|
||||
margin: 0;
|
||||
color: #0066cc;
|
||||
}
|
||||
.footer {
|
||||
border-top: 1px solid #eee;
|
||||
padding-top: 15px;
|
||||
margin-top: 20px;
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
text-align: center;
|
||||
}
|
||||
.icon {
|
||||
vertical-align: middle;
|
||||
margin-right: 8px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<h1>Invitation à un événement</h1>
|
||||
</div>
|
||||
|
||||
<p>{{ organizer_display }} vous invite à un événement</p>
|
||||
|
||||
<div class="event-title">{{ event.summary }}</div>
|
||||
|
||||
<div class="event-details">
|
||||
<table>
|
||||
<tr>
|
||||
<td>Quand</td>
|
||||
<td>
|
||||
{{ start_date }}<br>
|
||||
<strong>{{ time_str }}</strong>
|
||||
{% if start_date != end_date %}<br>jusqu'au {{ end_date }}{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% if event.location %}
|
||||
<tr>
|
||||
<td>Lieu</td>
|
||||
<td>{{ event.location }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<td>Organisateur</td>
|
||||
<td>{{ organizer_display }} <{{ event.organizer_email }}></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% if event.description %}
|
||||
<div class="description">
|
||||
<h3>Description</h3>
|
||||
<p>{{ event.description|linebreaks }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="instructions">
|
||||
<p>Pour répondre à cette invitation, veuillez ouvrir le fichier .ics en pièce jointe avec votre application de calendrier ou répondre directement depuis votre client de messagerie.</p>
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<p>Cette invitation a été envoyée via {{ app_name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
19
src/backend/core/templates/emails/calendar_invitation.txt
Normal file
19
src/backend/core/templates/emails/calendar_invitation.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
{{ organizer_display }} vous invite à un événement
|
||||
|
||||
Détails de l'événement
|
||||
======================
|
||||
|
||||
Titre : {{ event.summary }}
|
||||
Quand : {{ start_date }} {{ time_str }}{% if start_date != end_date %} - {{ end_date }}{% endif %}
|
||||
{% if event.location %}Lieu : {{ event.location }}
|
||||
{% endif %}Organisateur : {{ organizer_display }} <{{ event.organizer_email }}>
|
||||
|
||||
{% if event.description %}
|
||||
Description :
|
||||
{{ event.description }}
|
||||
{% endif %}
|
||||
|
||||
Pour répondre à cette invitation, veuillez ouvrir le fichier .ics en pièce jointe avec votre application de calendrier ou répondre directement depuis votre client de messagerie.
|
||||
|
||||
---
|
||||
Cette invitation a été envoyée via {{ app_name }}
|
||||
@@ -0,0 +1,133 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Événement annulé</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
||||
line-height: 1.6;
|
||||
color: #333;
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
.container {
|
||||
background-color: #ffffff;
|
||||
border-radius: 8px;
|
||||
padding: 30px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.header {
|
||||
border-bottom: 2px solid #dc3545;
|
||||
padding-bottom: 15px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.header h1 {
|
||||
color: #dc3545;
|
||||
margin: 0;
|
||||
font-size: 24px;
|
||||
}
|
||||
.cancel-badge {
|
||||
display: inline-block;
|
||||
background-color: #dc3545;
|
||||
color: white;
|
||||
padding: 4px 12px;
|
||||
border-radius: 12px;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.event-title {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: #999;
|
||||
margin: 15px 0;
|
||||
text-decoration: line-through;
|
||||
}
|
||||
.event-details {
|
||||
background-color: #f8d7da;
|
||||
border-left: 4px solid #dc3545;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.event-details table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.event-details td {
|
||||
padding: 8px 0;
|
||||
vertical-align: top;
|
||||
color: #721c24;
|
||||
}
|
||||
.event-details td:first-child {
|
||||
font-weight: bold;
|
||||
width: 150px;
|
||||
}
|
||||
.instructions {
|
||||
background-color: #f8d7da;
|
||||
border-radius: 4px;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.instructions p {
|
||||
margin: 0;
|
||||
color: #721c24;
|
||||
}
|
||||
.footer {
|
||||
border-top: 1px solid #eee;
|
||||
padding-top: 15px;
|
||||
margin-top: 20px;
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<h1>Événement annulé</h1>
|
||||
</div>
|
||||
|
||||
<span class="cancel-badge">ANNULÉ</span>
|
||||
|
||||
<p>{{ organizer_display }} a annulé l'événement suivant</p>
|
||||
|
||||
<div class="event-title">{{ event.summary }}</div>
|
||||
|
||||
<div class="event-details">
|
||||
<table>
|
||||
<tr>
|
||||
<td>Était prévu le</td>
|
||||
<td>
|
||||
{{ start_date }}<br>
|
||||
<strong>{{ time_str }}</strong>
|
||||
{% if start_date != end_date %}<br>jusqu'au {{ end_date }}{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% if event.location %}
|
||||
<tr>
|
||||
<td>Lieu</td>
|
||||
<td>{{ event.location }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<td>Organisateur</td>
|
||||
<td>{{ organizer_display }} <{{ event.organizer_email }}></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="instructions">
|
||||
<p>Cet événement a été annulé. Ouvrez le fichier .ics en pièce jointe pour le supprimer de votre calendrier.</p>
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<p>Cette notification a été envoyée via {{ app_name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,14 @@
|
||||
{{ organizer_display }} a annulé l'événement : {{ event.summary }}
|
||||
|
||||
Détails de l'événement annulé
|
||||
=============================
|
||||
|
||||
Titre : {{ event.summary }}
|
||||
Était prévu le : {{ start_date }} {{ time_str }}{% if start_date != end_date %} - {{ end_date }}{% endif %}
|
||||
{% if event.location %}Lieu : {{ event.location }}
|
||||
{% endif %}Organisateur : {{ organizer_display }} <{{ event.organizer_email }}>
|
||||
|
||||
Cet événement a été annulé. Vous pouvez le supprimer de votre calendrier en ouvrant le fichier .ics en pièce jointe.
|
||||
|
||||
---
|
||||
Cette notification a été envoyée via {{ app_name }}
|
||||
120
src/backend/core/templates/emails/calendar_invitation_reply.html
Normal file
120
src/backend/core/templates/emails/calendar_invitation_reply.html
Normal file
@@ -0,0 +1,120 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Réponse à l'événement</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
||||
line-height: 1.6;
|
||||
color: #333;
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
.container {
|
||||
background-color: #ffffff;
|
||||
border-radius: 8px;
|
||||
padding: 30px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.header {
|
||||
border-bottom: 2px solid #28a745;
|
||||
padding-bottom: 15px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.header h1 {
|
||||
color: #28a745;
|
||||
margin: 0;
|
||||
font-size: 24px;
|
||||
}
|
||||
.event-title {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
margin: 15px 0;
|
||||
}
|
||||
.event-details {
|
||||
background-color: #d4edda;
|
||||
border-left: 4px solid #28a745;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.event-details table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.event-details td {
|
||||
padding: 8px 0;
|
||||
vertical-align: top;
|
||||
}
|
||||
.event-details td:first-child {
|
||||
font-weight: bold;
|
||||
color: #666;
|
||||
width: 120px;
|
||||
}
|
||||
.instructions {
|
||||
background-color: #d4edda;
|
||||
border-radius: 4px;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.instructions p {
|
||||
margin: 0;
|
||||
color: #155724;
|
||||
}
|
||||
.footer {
|
||||
border-top: 1px solid #eee;
|
||||
padding-top: 15px;
|
||||
margin-top: 20px;
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<h1>Réponse reçue</h1>
|
||||
</div>
|
||||
|
||||
<p>{{ attendee_display }} a répondu à votre événement</p>
|
||||
|
||||
<div class="event-title">{{ event.summary }}</div>
|
||||
|
||||
<div class="event-details">
|
||||
<table>
|
||||
<tr>
|
||||
<td>Quand</td>
|
||||
<td>
|
||||
{{ start_date }}<br>
|
||||
<strong>{{ time_str }}</strong>
|
||||
{% if start_date != end_date %}<br>jusqu'au {{ end_date }}{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% if event.location %}
|
||||
<tr>
|
||||
<td>Lieu</td>
|
||||
<td>{{ event.location }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<td>Participant</td>
|
||||
<td>{{ attendee_display }} <{{ event.attendee_email }}></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="instructions">
|
||||
<p>La réponse du participant a été enregistrée. Ouvrez le fichier .ics en pièce jointe pour mettre à jour votre calendrier.</p>
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<p>Cette notification a été envoyée via {{ app_name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,14 @@
|
||||
{{ attendee_display }} a répondu à votre événement : {{ event.summary }}
|
||||
|
||||
Détails de l'événement
|
||||
======================
|
||||
|
||||
Titre : {{ event.summary }}
|
||||
Quand : {{ start_date }} {{ time_str }}{% if start_date != end_date %} - {{ end_date }}{% endif %}
|
||||
{% if event.location %}Lieu : {{ event.location }}
|
||||
{% endif %}
|
||||
|
||||
La réponse du participant a été enregistrée dans le fichier .ics en pièce jointe.
|
||||
|
||||
---
|
||||
Cette notification a été envoyée via {{ app_name }}
|
||||
@@ -0,0 +1,150 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Événement modifié</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
||||
line-height: 1.6;
|
||||
color: #333;
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
.container {
|
||||
background-color: #ffffff;
|
||||
border-radius: 8px;
|
||||
padding: 30px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.header {
|
||||
border-bottom: 2px solid #ff9800;
|
||||
padding-bottom: 15px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.header h1 {
|
||||
color: #ff9800;
|
||||
margin: 0;
|
||||
font-size: 24px;
|
||||
}
|
||||
.update-badge {
|
||||
display: inline-block;
|
||||
background-color: #ff9800;
|
||||
color: white;
|
||||
padding: 4px 12px;
|
||||
border-radius: 12px;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.event-title {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
margin: 15px 0;
|
||||
}
|
||||
.event-details {
|
||||
background-color: #fff8e1;
|
||||
border-left: 4px solid #ff9800;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.event-details table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.event-details td {
|
||||
padding: 8px 0;
|
||||
vertical-align: top;
|
||||
}
|
||||
.event-details td:first-child {
|
||||
font-weight: bold;
|
||||
color: #666;
|
||||
width: 120px;
|
||||
}
|
||||
.description {
|
||||
background-color: #fff;
|
||||
border: 1px solid #eee;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.description h3 {
|
||||
margin-top: 0;
|
||||
color: #666;
|
||||
}
|
||||
.instructions {
|
||||
background-color: #fff8e1;
|
||||
border-radius: 4px;
|
||||
padding: 15px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.instructions p {
|
||||
margin: 0;
|
||||
color: #e65100;
|
||||
}
|
||||
.footer {
|
||||
border-top: 1px solid #eee;
|
||||
padding-top: 15px;
|
||||
margin-top: 20px;
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<h1>Événement modifié</h1>
|
||||
</div>
|
||||
|
||||
<span class="update-badge">MODIFIÉ</span>
|
||||
|
||||
<p>{{ organizer_display }} a modifié un événement auquel vous êtes invité(e)</p>
|
||||
|
||||
<div class="event-title">{{ event.summary }}</div>
|
||||
|
||||
<div class="event-details">
|
||||
<table>
|
||||
<tr>
|
||||
<td>Quand</td>
|
||||
<td>
|
||||
{{ start_date }}<br>
|
||||
<strong>{{ time_str }}</strong>
|
||||
{% if start_date != end_date %}<br>jusqu'au {{ end_date }}{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% if event.location %}
|
||||
<tr>
|
||||
<td>Lieu</td>
|
||||
<td>{{ event.location }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
<td>Organisateur</td>
|
||||
<td>{{ organizer_display }} <{{ event.organizer_email }}></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% if event.description %}
|
||||
<div class="description">
|
||||
<h3>Description</h3>
|
||||
<p>{{ event.description|linebreaks }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="instructions">
|
||||
<p>Cet événement a été modifié. Veuillez ouvrir le fichier .ics en pièce jointe pour mettre à jour votre calendrier.</p>
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<p>Cette notification a été envoyée via {{ app_name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,19 @@
|
||||
{{ organizer_display }} a modifié l'événement
|
||||
|
||||
Détails de l'événement mis à jour
|
||||
=================================
|
||||
|
||||
Titre : {{ event.summary }}
|
||||
Quand : {{ start_date }} {{ time_str }}{% if start_date != end_date %} - {{ end_date }}{% endif %}
|
||||
{% if event.location %}Lieu : {{ event.location }}
|
||||
{% endif %}Organisateur : {{ organizer_display }} <{{ event.organizer_email }}>
|
||||
|
||||
{% if event.description %}
|
||||
Description :
|
||||
{{ event.description }}
|
||||
{% endif %}
|
||||
|
||||
Cet événement a été modifié. Veuillez vérifier les changements et mettre à jour votre calendrier en conséquence.
|
||||
|
||||
---
|
||||
Cette notification a été envoyée via {{ app_name }}
|
||||
Reference in New Issue
Block a user