From cb92192ed86ecadb63a4a81edc824e64562c27d5 Mon Sep 17 00:00:00 2001 From: Johann LORBER Date: Tue, 29 Jul 2025 12:13:19 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1(backend)=20move=20email=20sending=20t?= =?UTF-8?q?o=20celery?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move send_email and send_invitation_email operations to Celery tasks to prevent API endpoints from blocking while sending emails. Signed-off-by: Johann LORBER --- CHANGELOG.md | 1 + src/backend/core/api/viewsets.py | 12 +++++++----- src/backend/core/tasks/mail.py | 13 +++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87d362ae0a..33908953b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ and this project adheres to - ⚡️(frontend) improve tree stability #1207 - ⚡️(frontend) improve accessibility #1232 - 🛂(frontend) block drag n drop when not desktop #1239 +- ⚡(backend) move email sending to celery ### Fixed diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index a9c8ee2493..6c5d389bd3 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -38,7 +38,7 @@ from core import authentication, choices, enums, models from core.services.ai_services import AIService from core.services.collaboration_services import CollaborationService -from core.tasks.mail import send_ask_for_access_mail +from core.tasks.mail import send_ask_for_access_mail, send_invitation_mail from core.utils import extract_attachments, filter_descendants from . import permissions, serializers, utils @@ -1650,10 +1650,11 @@ def perform_create(self, serializer): access = serializer.save(document_id=self.kwargs["resource_id"]) if access.user: - access.document.send_invitation_email( + send_invitation_mail.delay( + access.document.id, access.user.email, access.role, - self.request.user, + self.request.user.id, access.user.language or self.request.user.language or settings.LANGUAGE_CODE, @@ -1924,10 +1925,11 @@ def perform_create(self, serializer): """Save invitation to a document then send an email to the invited user.""" invitation = serializer.save() - invitation.document.send_invitation_email( + send_invitation_mail.delay( + invitation.document.id, invitation.email, invitation.role, - self.request.user, + self.request.user.id, self.request.user.language or settings.LANGUAGE_CODE, ) diff --git a/src/backend/core/tasks/mail.py b/src/backend/core/tasks/mail.py index 483c961486..dfc7f4be2c 100644 --- a/src/backend/core/tasks/mail.py +++ b/src/backend/core/tasks/mail.py @@ -22,3 +22,16 @@ def send_ask_for_access_mail(ask_for_access_id): access.user.email, access.user.language or settings.LANGUAGE_CODE, ) + +@app.task +def send_mail(document_id, subject, emails, context=None, language=None): + """Send email from a document template.""" + document = models.Document.objects.get(id=document_id) + document.send_email(subject, emails, context, language) + +@app.task +def send_invitation_mail(document_id, email, role, sender_id, language=None): + """Send invitation email for a document.""" + document = models.Document.objects.get(id=document_id) + sender = models.User.objects.get(id=sender_id) + document.send_invitation_email(email, role, sender, language)