Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jinja templating #629

Merged
merged 11 commits into from
Jan 3, 2025
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,6 @@ logs/

# Pytest-cov
.coverage

# Jinja templates test output
tests/jinja_test_outputs/
12 changes: 12 additions & 0 deletions assets/templates/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Email Jinja Templates

The directory contains the templates used in the automatic mails sent by Hyperion.
Each mail is based on the `base_mail.html` template.

## Adding a new mail template

To add a new mail template, simply copy the `custom_mail_template.html` and modify it.

## Testing your template

To test how the templates render, you can run the Python file `tests/template_tester.py`.
46 changes: 18 additions & 28 deletions assets/templates/account_exists_mail.html
Original file line number Diff line number Diff line change
@@ -1,33 +1,23 @@
<!DOCTYPE html>
{% extends "base_mail.html" %}

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title lang="en">MyECL - Your account already exists!</title>
</head>
{% block title %}MyECL - Your account already exists!{% endblock %}

<body>
<h1 lang="fr">Ton compte MyECL existe déjà !</h1>
<p lang="fr">
Tu as demandé à créer un compte, mais ton adresse mail est déjà associée à un compte existant. Si tu as oublié ton mot de passe, tu peux utiliser la fonctionnalité de
<a href="https://myecl.fr/forgot_password">mot de passe oublié</a>.
{% block french_message %}
<h1>Ton compte MyECL existe déjà !</h1>
<p>
Tu as demandé à créer un compte, mais ton adresse mail est déjà associée à un compte existant.
Si tu as oublié ton mot de passe, tu peux utiliser le réinitialiser en cliquant sur le lien suivant :
<a href="https://myecl.fr/forgot_password">https://myecl.fr/forgot_password</a>
</p>
<p lang="fr">Si tu n'es pas à l'origine de cette demande, c'est qu'un bon fyot a tenté de s'inscrire avec ton adresse mail... Bref tu peux ignorer ce message.</p>
<p>Si tu n'es pas à l'origine de cette demande, c'est qu'un bon fyot a tenté de s'inscrire avec ton adresse mail... Bref tu peux ignorer ce message.</p>
{% endblock %}

<br />

<h1 lang="en">Your MyECL account already exists!</h1>
<p lang="en">
You've asked to create an account, but your e-mail address is already linked to an existing account. If you've forgotten your password, you can use the
<a href="https://myecl.fr/forgot_password">forgotten password</a> feature.
{% block english_message %}
<h1>Your MyECL account already exists!</h1>
<p>
You've asked to create an account, but your e-mail address is already linked to an existing account.
If you have forgotten your password, you can reset it by clicking on the following link:
<a href="https://myecl.fr/forgot_password">https://myecl.fr/forgot_password</a>
</p>
<p lang="en">If you are not behind this request, it likely means that a fool has tried to sign up using your e-mail address... In short, you can ignore this message.</p>

<br /><br />
<p lang="fr">Éclairement,</p>
<br />

<td style="width: 105px;"><img style="width: 100px; height: 100px;" src="data:image/png;base64,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"></td>
</body>

</html>
<p>If you have not initiated this request, it likely means that some fool tried to sign up using your e-mail address... You can safely ignore this message.</p>
{% endblock %}
40 changes: 13 additions & 27 deletions assets/templates/activation_mail.html
Original file line number Diff line number Diff line change
@@ -1,32 +1,18 @@
<!DOCTYPE html>
{% extends "base_mail.html" %}

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title lang="en">MyECL - Activate your account</title>
</head>
{% block title %}MyECL - Activate your account{% endblock %}

<body>
<h1 lang="fr">Bienvenue sur MyECL !</h1>
<p lang="fr">Pour continuer ton inscription, tu peux utiliser ce
<a href="{{ calypsso_activate_url }}">lien unique</a>.
{% block french_message %}
<h1>Bienvenue sur MyECL !</h1>
<p>Pour continuer ton inscription, clique sur le lien unique suivant :
<a href="{{ calypsso_activate_url }}">{{ calypsso_activate_url }}</a>
</p>
{% endblock %}

<br />

<h1 lang="en">Welcome on MyECL!</h1>
<p lang="en">
To pursue your registration, you can use this
<a href="{{ calypsso_activate_url }}">unique link</a>.
{% block english_message %}
<h1>Welcome to MyECL !</h1>
<p>
To complete your registration, click on the following one-time link :
<a href="{{ calypsso_activate_url }}">{{ calypsso_activate_url }}</a>
</p>

<br /><br />
<p lang="fr">Éclairement,</p>
<br />

<td style="width: 105px;"><img style="width: 100px; height: 100px;"
src="data:image/png;base64,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">
</td>
</body>

</html>
{% endblock %}
Loading
Loading