Skip to content

Commit

Permalink
Merge pull request #643 from maykinmedia/feature/638-improve-email
Browse files Browse the repository at this point in the history
[#638] Improve email body
  • Loading branch information
SilviaAmAm authored Jan 27, 2025
2 parents f606c01 + 726fe90 commit c5dca5f
Show file tree
Hide file tree
Showing 12 changed files with 392 additions and 62 deletions.
23 changes: 22 additions & 1 deletion backend/docs/manual/3-administrator/3.1-email-templates.rst
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,27 @@ Hier kun je de onderwerpen en de emailteksten voor de emails die worden gestuurd
- De record manager als een reviewer aanpassingen heeft aangevraagd op een lijst.
- De record manager en de reviewers als een lijst succesvol is vernietigd.

Tekst en HTML sjablonen moeten geconfigureerd worden voor elke email. Een voorbeeld voor de email
die wordt gestuurd naar een beoordelaar als een lijst goedgekeurd moet worden zou kunnen is:

- Tekst:

.. code::
Beste {{ user_name }},
Uw accordering van een vernietigingslijst wordt gevraagd.
U kunt hier {% destruction_list_link list_name 'review' %} de lijst bekijken om te controleren of de zaken op de lijst daadwerkelijk vernietigd kunnen worden.
- HTML:

.. code::
Beste {{ user_name }},
Uw accordering van een vernietigingslijst wordt gevraagd.
U kunt <a href="{% destruction_list_link list_name 'review' %}">hier</a> de lijst bekijken om te controleren of de zaken op de lijst daadwerkelijk vernietigd kunnen worden.
Beschikbare Sjabloonvariabelen
------------------------------

Expand All @@ -40,5 +61,5 @@ Voor elke emailtekst sjabloon, deze variabelen zijn beschikbaar:
:widths: 100, 70

"``{{ list_name }}``", "Geeft de naam van de vernietigingslijst."
"``{{ user }}``", "Geeft de voornaam, de achternaam en de gebruikersnaam (tussen haakjes) van de persoon die de email ontvangt."
"``{{ user_name }}``", "Geeft de voornaam en de achternaam van de persoon die de email ontvangt."
"``{{ reviewer }}``", "Geeft de voornaam, de achternaam en de gebruikersnaam (tussen haakjes) van de reviewer van de vernietigingslijst. Deze variabele is alleen beschikbaar in de sjabloon voor de email naar de record manager na een goedkeuring van de reviewer."
6 changes: 4 additions & 2 deletions backend/src/openarchiefbeheer/destruction/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ def notify_author_of_failure(sender: DestructionList, **kwargs):

notify(
subject=config.subject_error_during_deletion,
body=config.body_error_during_deletion,
body_html=config.body_error_during_deletion_html,
body_text=config.body_error_during_deletion_text,
context={"list_name": sender.name},
recipients=[sender.author.email],
)
Expand All @@ -62,7 +63,8 @@ def notify_co_reviewers(sender: DestructionList, **kwargs):
config = EmailConfig.get_solo()
notify(
subject=config.subject_co_review_request,
body=config.body_co_review_request,
body_html=config.body_co_review_request_html,
body_text=config.body_co_review_request_text,
context={"list_name": sender.name},
recipients=[co_reviewer["user"].email for co_reviewer in added_co_reviewers],
)
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ def test_fully_update_co_reviewers(self):
"openarchiefbeheer.destruction.utils.EmailConfig.get_solo",
return_value=EmailConfig(
subject_co_review_request="Please co-review!",
body_co_review_request="You have been invited to co-review.",
body_co_review_request_text="You have been invited to co-review.",
body_co_review_request_html="You have been invited to co-review.",
),
),
):
Expand Down Expand Up @@ -208,7 +209,8 @@ def test_partially_update_co_reviewers(self):
"openarchiefbeheer.destruction.utils.EmailConfig.get_solo",
return_value=EmailConfig(
subject_co_review_request="Please co-review!",
body_co_review_request="You have been invited to co-review.",
body_co_review_request_text="You have been invited to co-review.",
body_co_review_request_html="You have been invited to co-review.",
),
),
):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from django.contrib.auth.models import Group
from django.core import mail
from django.test import override_settings
from django.utils.translation import gettext_lazy as _

from furl import furl
Expand Down Expand Up @@ -706,6 +707,7 @@ def test_cannot_mark_as_final_if_posted_user_is_not_archivist(self):
_("The chosen user does not have the permission to review a final list."),
)

@override_settings(FRONTEND_URL="https://openarchiefbeheer.nl/")
def test_mark_as_ready_to_review(self):
record_manager = UserFactory.create(
username="dolly123",
Expand Down Expand Up @@ -737,7 +739,8 @@ def test_mark_as_ready_to_review(self):
"openarchiefbeheer.destruction.utils.EmailConfig.get_solo",
return_value=EmailConfig(
subject_review_required="Destruction list review request",
body_review_required="Please review the list",
body_review_required_text="Please review the list here: {% destruction_list_link list_name 'review' %}",
body_review_required_html="Please review the list <a href=\"{% destruction_list_link list_name 'review' %}\">here</a>.",
),
),
):
Expand All @@ -759,6 +762,15 @@ def test_mark_as_ready_to_review(self):
self.assertEqual(len(sent_mail), 1)
self.assertEqual(sent_mail[0].subject, "Destruction list review request")
self.assertEqual(sent_mail[0].recipients(), [reviewer.user.email])
self.assertEqual(
sent_mail[0].body,
f"Please review the list here: https://openarchiefbeheer.nl/destruction-lists/{destruction_list.uuid}/review",
)
self.assertEqual(
sent_mail[0].alternatives[0][0],
f'Please review the list <a href="https://openarchiefbeheer.nl/destruction-lists/{destruction_list.uuid}/review">here</a>.',
)
self.assertEqual(sent_mail[0].alternatives[0][1], "text/html")

logs = TimelineLog.objects.for_object(destruction_list)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -922,7 +922,8 @@ def test_create_review_accepted(self):
"openarchiefbeheer.destruction.utils.EmailConfig.get_solo",
return_value=EmailConfig(
subject_positive_review="Review accepted",
body_positive_review="Yuppiii reviewer accepted!",
body_positive_review_text="Yuppiii reviewer accepted!",
body_positive_review_html="Yuppiii reviewer accepted!",
),
),
):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ class SignalsTests(TestCase):
"openarchiefbeheer.destruction.utils.EmailConfig.get_solo",
return_value=EmailConfig(
subject_changes_requested="Changes requested",
body_changes_requested="Changes requested",
body_changes_requested_text="Changes requested",
body_changes_requested_html="Changes requested",
),
)
def test_no_email_sent_if_not_review_created(self, m):
Expand Down Expand Up @@ -52,7 +53,8 @@ def test_failure_during_deletion_sends_signal(self):
"openarchiefbeheer.destruction.utils.EmailConfig.get_solo",
return_value=EmailConfig(
subject_error_during_deletion="FAILURE!!",
body_error_during_deletion="ERROR AAAh!",
body_error_during_deletion_text="ERROR AAAh!",
body_error_during_deletion_html="ERROR AAAh!",
),
),
):
Expand Down
9 changes: 6 additions & 3 deletions backend/src/openarchiefbeheer/destruction/tests/test_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,8 @@ def test_changes_to_both_zaak_and_destruction_list_item(self, m):
"openarchiefbeheer.destruction.utils.EmailConfig.get_solo",
return_value=EmailConfig(
subject_review_required="Destruction list review request",
body_review_required="Please review the list",
body_review_required_text="Please review the list",
body_review_required_html="Please review the list",
),
),
):
Expand Down Expand Up @@ -188,7 +189,8 @@ def test_reject_suggestion_does_not_change_zaak(self, m):
"openarchiefbeheer.destruction.utils.EmailConfig.get_solo",
return_value=EmailConfig(
subject_review_required="Destruction list review request",
body_review_required="Please review the list",
body_review_required_text="Please review the list",
body_review_required_html="Please review the list",
),
),
):
Expand Down Expand Up @@ -615,7 +617,8 @@ def test_complete_and_notify(self):
"openarchiefbeheer.destruction.utils.EmailConfig.get_solo",
return_value=EmailConfig(
subject_successful_deletion="DELETED!",
body_successful_deletion="Wohoo deleted list",
body_successful_deletion_text="Wohoo deleted list",
body_successful_deletion_html="Wohoo deleted list",
),
),
patch("openarchiefbeheer.destruction.utils.create_zaak_for_report"),
Expand Down
41 changes: 25 additions & 16 deletions backend/src/openarchiefbeheer/destruction/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import Protocol

from django.conf import settings
from django.core.mail import send_mail
from django.core.mail import EmailMultiAlternatives
from django.db import transaction
from django.db.models import OuterRef, Q, QuerySet, Subquery
from django.utils import timezone
Expand Down Expand Up @@ -36,22 +36,27 @@
)


def notify(subject: str, body: str, context: dict, recipients: list[str]) -> None:
if body == "" or subject == "" or len(recipients) == 0:
def notify(
subject: str, body_html: str, body_text: str, context: dict, recipients: list[str]
) -> None:
if body_text == "" or body_html == "" or subject == "" or len(recipients) == 0:
return

backend = get_sandboxed_backend()

template = backend.from_string(body)
formatted_body = template.render(context=context)
template_html = backend.from_string(body_html)
template_text = backend.from_string(body_text)
html_content = template_html.render(context=context)
text_content = template_text.render(context=context)

send_mail(
message = EmailMultiAlternatives(
subject=subject,
message=formatted_body,
body=text_content,
from_email=settings.DEFAULT_FROM_EMAIL,
recipient_list=recipients,
fail_silently=False,
to=recipients,
)
message.attach_alternative(html_content, "text/html")
message.send()


def notify_reviewer(
Expand All @@ -62,8 +67,9 @@ def notify_reviewer(

notify(
subject=config.subject_review_required,
body=config.body_review_required,
context={"user": user, "list_name": destruction_list.name},
body_text=config.body_review_required_text,
body_html=config.body_review_required_html,
context={"user_name": user.get_full_name(), "list_name": destruction_list.name},
recipients=[user.email],
)

Expand All @@ -78,9 +84,10 @@ def notify_author_positive_review(

notify(
subject=config.subject_positive_review,
body=config.body_positive_review,
body_text=config.body_positive_review_text,
body_html=config.body_positive_review_html,
context={
"user": user,
"user_name": user.get_full_name(),
"list_name": destruction_list.name,
"reviewer": last_reviewer,
"current_reviewer": destruction_list.assignee,
Expand All @@ -97,8 +104,9 @@ def notify_author_changes_requested(

notify(
subject=config.subject_changes_requested,
body=config.body_changes_requested,
context={"user": user, "list_name": destruction_list.name},
body_text=config.body_changes_requested_text,
body_html=config.body_changes_requested_html,
context={"user_name": user.get_full_name(), "list_name": destruction_list.name},
recipients=[user.email],
)

Expand All @@ -109,7 +117,8 @@ def notify_assignees_successful_deletion(destruction_list: DestructionList) -> N

notify(
subject=config.subject_successful_deletion,
body=config.body_successful_deletion,
body_text=config.body_successful_deletion_text,
body_html=config.body_successful_deletion_html,
context={
"list_name": destruction_list.name,
},
Expand Down
27 changes: 20 additions & 7 deletions backend/src/openarchiefbeheer/emails/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,41 @@ class EmailConfigAdmin(SingletonModelAdmin):
{
"fields": [
"subject_review_required",
"body_review_required",
"body_review_required_html",
"body_review_required_text",
"subject_co_review_request",
"body_co_review_request",
"body_co_review_request_html",
"body_co_review_request_text",
],
},
),
(
_("Template review reminder"),
{
"fields": ["subject_review_reminder", "body_review_reminder"],
"fields": [
"subject_review_reminder",
"body_review_reminder_html",
"body_review_reminder_text",
],
},
),
(
_("Template changes requested"),
{
"fields": ["subject_changes_requested", "body_changes_requested"],
"fields": [
"subject_changes_requested",
"body_changes_requested_html",
"body_changes_requested_text",
],
},
),
(
_("Templates positive review"),
{
"fields": [
"subject_positive_review",
"body_positive_review",
"body_positive_review_html",
"body_positive_review_text",
]
},
),
Expand All @@ -46,7 +57,8 @@ class EmailConfigAdmin(SingletonModelAdmin):
{
"fields": [
"subject_error_during_deletion",
"body_error_during_deletion",
"body_error_during_deletion_html",
"body_error_during_deletion_text",
]
},
),
Expand All @@ -55,7 +67,8 @@ class EmailConfigAdmin(SingletonModelAdmin):
{
"fields": [
"subject_successful_deletion",
"body_successful_deletion",
"body_successful_deletion_html",
"body_successful_deletion_text",
]
},
),
Expand Down
Loading

0 comments on commit c5dca5f

Please sign in to comment.