feat: implement daily intervention summary email and unread notification reminders with associated settings and workflow views

This commit is contained in:
Karl Determe 2026-08-14 21:59:00 +02:00
parent 387f1ae9d6
commit 34d8e51626
4 changed files with 13 additions and 9 deletions

View file

@ -255,7 +255,7 @@ class Command(BaseCommand):
] ]
body = "\n".join(body_lines) body = "\n".join(body_lines)
from_email = getattr(settings, "DEFAULT_FROM_EMAIL", 'no-reply@streetup.be') from_email = getattr(settings, "DEFAULT_FROM_EMAIL", 'StreetUp no-reply <no-reply@streetup.be>')
email = EmailMultiAlternatives( email = EmailMultiAlternatives(
subject=subject, subject=subject,

View file

@ -820,7 +820,7 @@ def attempt_status_update(request, intervention, user, new_status, pause_reason=
# html_body = render_to_string("emails/new_intervention.html", context) # html_body = render_to_string("emails/new_intervention.html", context)
from_email = getattr(settings, "DEFAULT_FROM_EMAIL", 'no-reply@streetup.be') from_email = getattr(settings, "DEFAULT_FROM_EMAIL", 'StreetUp no-reply <no-reply@streetup.be>')
reply_to = [] reply_to = []
# Récupérer les autres pièces jointes déjà liées à l'intervention # Récupérer les autres pièces jointes déjà liées à l'intervention
@ -1011,7 +1011,7 @@ def attempt_status_update(request, intervention, user, new_status, pause_reason=
text_body = render_to_string("emails/intervention_canceled.txt", context) text_body = render_to_string("emails/intervention_canceled.txt", context)
from_email = getattr(settings, "DEFAULT_FROM_EMAIL", 'no-reply@streetup.be') from_email = getattr(settings, "DEFAULT_FROM_EMAIL", 'StreetUp no-reply <no-reply@streetup.be>')
reply_to = [] reply_to = []
existing_attachments = get_intervention_attachments( existing_attachments = get_intervention_attachments(
@ -1243,7 +1243,7 @@ def send_intervention_reminder(request, intervention_id):
text_body = render_to_string("emails/intervention_reminder.txt", context) text_body = render_to_string("emails/intervention_reminder.txt", context)
from_email = getattr(settings, "DEFAULT_FROM_EMAIL", 'no-reply@streetup.be') from_email = getattr(settings, "DEFAULT_FROM_EMAIL", 'StreetUp no-reply <no-reply@streetup.be>')
reply_to = [] reply_to = []
existing_attachments = get_intervention_attachments( existing_attachments = get_intervention_attachments(
@ -1381,7 +1381,7 @@ def send_intervention_modification(request, intervention_id):
text_body = render_to_string("emails/intervention_modification.txt", context) text_body = render_to_string("emails/intervention_modification.txt", context)
from_email = getattr(settings, "DEFAULT_FROM_EMAIL", 'no-reply@streetup.be') from_email = getattr(settings, "DEFAULT_FROM_EMAIL", 'StreetUp no-reply <no-reply@streetup.be>')
reply_to = [] reply_to = []
existing_attachments = get_intervention_attachments( existing_attachments = get_intervention_attachments(

View file

@ -92,7 +92,7 @@ class Command(BaseCommand):
subject = f"[StreetUp] Rappel : {count} notification(s) non lue(s)" subject = f"[StreetUp] Rappel : {count} notification(s) non lue(s)"
# Host URL pour les liens # Host URL pour les liens
domain = getattr(settings, 'SITE_URL', 'http://localhost:8003') domain = (getattr(settings, 'ROOT_URL', '') or getattr(settings, 'SITE_URL', '') or 'http://localhost:8000').rstrip('/')
lines_text = [ lines_text = [
f"Bonjour {user.get_full_name() or user.username},\n", f"Bonjour {user.get_full_name() or user.username},\n",
@ -104,7 +104,11 @@ class Command(BaseCommand):
n = r.notification n = r.notification
created_str = n.created_at.strftime('%d/%m/%Y à %H:%M') created_str = n.created_at.strftime('%d/%m/%Y à %H:%M')
sender_str = n.sender.get_full_name() if n.sender else _("Système") sender_str = n.sender.get_full_name() if n.sender else _("Système")
link = f"{domain}{n.action_url}" if n.action_url else f"{domain}/notifications/" if n.action_url:
action_path = n.action_url if n.action_url.startswith('/') else f"/{n.action_url}"
link = f"{domain}{action_path}"
else:
link = f"{domain}/notifications/"
lines_text.append(f"- [{n.get_notification_type_display()}] {n.title} (reçue le {created_str} par {sender_str})") lines_text.append(f"- [{n.get_notification_type_display()}] {n.title} (reçue le {created_str} par {sender_str})")
lines_text.append(f" Lien: {link}\n") lines_text.append(f" Lien: {link}\n")
@ -143,7 +147,7 @@ class Command(BaseCommand):
msg = EmailMultiAlternatives( msg = EmailMultiAlternatives(
subject=subject, subject=subject,
body=text_body, body=text_body,
from_email=getattr(settings, 'DEFAULT_FROM_EMAIL', 'noreply@streetup.be'), from_email=getattr(settings, 'DEFAULT_FROM_EMAIL', 'StreetUp no-reply <no-reply@streetup.be>'),
to=recipient_emails, to=recipient_emails,
) )
msg.attach_alternative(html_body, "text/html") msg.attach_alternative(html_body, "text/html")

View file

@ -239,7 +239,7 @@ EMAIL_USE_SSL = True
EMAIL_PORT = getenv("EMAIL_PORT") EMAIL_PORT = getenv("EMAIL_PORT")
EMAIL_HOST_USER = getenv("EMAIL_HOST_USER") EMAIL_HOST_USER = getenv("EMAIL_HOST_USER")
EMAIL_HOST_PASSWORD = getenv("EMAIL_HOST_PASSWORD") EMAIL_HOST_PASSWORD = getenv("EMAIL_HOST_PASSWORD")
DEFAULT_FROM_EMAIL = 'no-reply@streetup.be' DEFAULT_FROM_EMAIL = getenv("DEFAULT_FROM_EMAIL", "StreetUp no-reply <no-reply@streetup.be>")
# Override email recipients for testing (set to None in production) # Override email recipients for testing (set to None in production)
# If set, all emails will be sent to this address instead of real recipients # If set, all emails will be sent to this address instead of real recipients