From c6cb735a09c176b1634843cd5442dbdfe4039e82 Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Thu, 10 Apr 2025 15:59:38 +0200 Subject: [PATCH] wip poc a email notification --- .../core/recording/event/notification.py | 70 +++++++++++++++++-- src/backend/meet/settings.py | 3 + .../dev-keycloak/values.meet.yaml.gotmpl | 3 + src/helm/env.d/dev/values.meet.yaml.gotmpl | 2 + src/mail/mjml/screen_recording.mjml | 67 ++++++++++++++++++ 5 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 src/mail/mjml/screen_recording.mjml diff --git a/src/backend/core/recording/event/notification.py b/src/backend/core/recording/event/notification.py index 04cf8d46..ed9898ec 100644 --- a/src/backend/core/recording/event/notification.py +++ b/src/backend/core/recording/event/notification.py @@ -1,8 +1,14 @@ """Service to notify external services when a new recording is ready.""" import logging +import smtplib from django.conf import settings +from django.template.loader import render_to_string +from django.utils.translation import get_language, override +from django.utils.translation import gettext_lazy as _ +from django.contrib.sites.models import Site +from django.core.mail import send_mail import requests @@ -21,10 +27,7 @@ class NotificationService: return self._notify_summary_service(recording) if recording.mode == models.RecordingModeChoices.SCREEN_RECORDING: - logger.warning( - "Screen recording mode not implemented for recording %s", recording.id - ) - return False + return self._notify_user_by_email(recording) logger.error( "Unknown recording mode %s for recording %s", @@ -33,6 +36,65 @@ class NotificationService: ) return False + @staticmethod + def _notify_user_by_email(recording) -> bool: + """Wip.""" + + # subject + # emails + domain = Site.objects.get_current().domain + + owner_accesses = ( + models.RecordingAccess.objects.select_related("user") + .filter( + role=models.RoleChoices.OWNER, + recording_id=recording.id, + ) + .all() + ) + + if not owner_accesses: + logger.error("No owner found for recording %s", recording.id) + return False + + language = get_language() + + context = ( + { + "brandname": settings.EMAIL_BRAND_NAME, + "support_email": settings.EMAIL_SUPPORT_EMAIL, + "logo_img": settings.EMAIL_LOGO_IMG, + "domain": domain, + "room_name": recording.room.name, + "recording_date": recording.created_at.strftime("%A %d %B %Y"), + "recording_time": recording.created_at.strftime("%H:%M"), + "link": f"{domain}/recordings/{recording.id}", + } + ) + + emails = [access.user.email for access in owner_accesses] + + with override(language): + msg_html = render_to_string("mail/html/screen_recording.html", context) + msg_plain = render_to_string("mail/text/screen_recording.txt", context) + subject = str(_("Your recording is ready")) # Force translation + + try: + send_mail( + subject.capitalize(), + msg_plain, + settings.EMAIL_FROM, + emails, + html_message=msg_html, + fail_silently=False, + ) + except smtplib.SMTPException as exception: + logger.error("notification to %s was not sent: %s", emails, exception) + return False + + return True + + @staticmethod def _notify_summary_service(recording): """Notify summary service about a new recording.""" diff --git a/src/backend/meet/settings.py b/src/backend/meet/settings.py index 57d076c8..c6605dd5 100755 --- a/src/backend/meet/settings.py +++ b/src/backend/meet/settings.py @@ -318,6 +318,9 @@ class Base(Configuration): EMAIL_USE_TLS = values.BooleanValue(False) EMAIL_USE_SSL = values.BooleanValue(False) EMAIL_FROM = values.Value("from@example.com") + EMAIL_BRAND_NAME = values.Value(None) + EMAIL_SUPPORT_EMAIL = values.Value(None) + EMAIL_LOGO_IMG = values.Value(None) AUTH_USER_MODEL = "core.User" diff --git a/src/helm/env.d/dev-keycloak/values.meet.yaml.gotmpl b/src/helm/env.d/dev-keycloak/values.meet.yaml.gotmpl index 805dc813..d58aac45 100644 --- a/src/helm/env.d/dev-keycloak/values.meet.yaml.gotmpl +++ b/src/helm/env.d/dev-keycloak/values.meet.yaml.gotmpl @@ -16,6 +16,9 @@ backend: DJANGO_EMAIL_HOST: "mailcatcher" DJANGO_EMAIL_PORT: 1025 DJANGO_EMAIL_USE_SSL: False + DJANGO_EMAIL_BRAND_NAME: "La Suite Numérique" + DJANGO_EMAIL_SUPPORT_EMAIL: "test@yopmail.com" + DJANGO_EMAIL_LOGO_IMG: https://meet.127.0.0.1.nip.io/assets/logo-suite-numerique.png OIDC_OP_JWKS_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/meet/protocol/openid-connect/certs OIDC_OP_AUTHORIZATION_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/meet/protocol/openid-connect/auth OIDC_OP_TOKEN_ENDPOINT: https://keycloak.127.0.0.1.nip.io/realms/meet/protocol/openid-connect/token diff --git a/src/helm/env.d/dev/values.meet.yaml.gotmpl b/src/helm/env.d/dev/values.meet.yaml.gotmpl index ad1b3544..46f4792f 100644 --- a/src/helm/env.d/dev/values.meet.yaml.gotmpl +++ b/src/helm/env.d/dev/values.meet.yaml.gotmpl @@ -32,6 +32,8 @@ backend: DJANGO_EMAIL_HOST: "mailcatcher" DJANGO_EMAIL_PORT: 1025 DJANGO_EMAIL_USE_SSL: False + DJANGO_EMAIL_BRAND_NAME: "La Suite Numérique" + DJANGO_EMAIL_SUPPORT_EMAIL: "test@yopmail.com" OIDC_OP_JWKS_ENDPOINT: https://fca.integ01.dev-agentconnect.fr/api/v2/jwks OIDC_OP_AUTHORIZATION_ENDPOINT: https://fca.integ01.dev-agentconnect.fr/api/v2/authorize OIDC_OP_TOKEN_ENDPOINT: https://fca.integ01.dev-agentconnect.fr/api/v2/token diff --git a/src/mail/mjml/screen_recording.mjml b/src/mail/mjml/screen_recording.mjml new file mode 100644 index 00000000..1e96402b --- /dev/null +++ b/src/mail/mjml/screen_recording.mjml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + +

{% trans "Your recording is ready!"%}

+
+ + + {% blocktrans %} + Your recording of "{{room_name}}" on {{recording_date}} at {{recording_time}} is now ready to view. + {% endblocktrans %} + + +

{% trans "To keep this recording permanently:" %}

+
    +
  1. {% trans "Click the \"Open\" button below" %}
  2. +
  3. {% trans "Use the \"Download\" button in the interface" %}
  4. +
  5. {% trans "Save the file to your preferred location" %}
  6. +
+
+ + {% trans "Open"%} + + + {% blocktrans %} + If you have any questions or need assistance, please contact our support team at {{support_email}}. + {% endblocktrans %} + + + + +

+ {% blocktrans %} + Thank you for using {{brandname}}. + {% endblocktrans %} +

+
+
+
+
+
+
\ No newline at end of file