60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
|
|
"""Invitation Service."""
|
||
|
|
|
||
|
|
import smtplib
|
||
|
|
from logging import getLogger
|
||
|
|
|
||
|
|
from django.conf import settings
|
||
|
|
from django.core.mail import send_mail
|
||
|
|
from django.template.loader import render_to_string
|
||
|
|
from django.utils.translation import get_language, override
|
||
|
|
from django.utils.translation import gettext_lazy as _
|
||
|
|
|
||
|
|
logger = getLogger(__name__)
|
||
|
|
|
||
|
|
|
||
|
|
class InvitationError(Exception):
|
||
|
|
"""Exception raised when invitation emails cannot be sent."""
|
||
|
|
|
||
|
|
status_code = 500
|
||
|
|
|
||
|
|
|
||
|
|
class InvitationService:
|
||
|
|
"""Service for invitations to users."""
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def invite_to_room(room, sender, emails):
|
||
|
|
"""Send invitation emails to join a room."""
|
||
|
|
|
||
|
|
language = get_language()
|
||
|
|
|
||
|
|
context = {
|
||
|
|
"brandname": settings.EMAIL_BRAND_NAME,
|
||
|
|
"logo_img": settings.EMAIL_LOGO_IMG,
|
||
|
|
"domain": settings.EMAIL_DOMAIN,
|
||
|
|
"room_url": f"{settings.EMAIL_APP_BASE_URL}/{room.slug}",
|
||
|
|
"room_link": f"{settings.EMAIL_DOMAIN}/{room.slug}",
|
||
|
|
"sender_email": sender.email,
|
||
|
|
}
|
||
|
|
|
||
|
|
with override(language):
|
||
|
|
msg_html = render_to_string("mail/html/invitation.html", context)
|
||
|
|
msg_plain = render_to_string("mail/text/invitation.txt", context)
|
||
|
|
subject = str(
|
||
|
|
_(
|
||
|
|
f"Video call in progress: {sender.email} is waiting for you to connect"
|
||
|
|
)
|
||
|
|
) # Force translation
|
||
|
|
|
||
|
|
try:
|
||
|
|
send_mail(
|
||
|
|
subject,
|
||
|
|
msg_plain,
|
||
|
|
settings.EMAIL_FROM,
|
||
|
|
emails,
|
||
|
|
html_message=msg_html,
|
||
|
|
fail_silently=False,
|
||
|
|
)
|
||
|
|
except smtplib.SMTPException as e:
|
||
|
|
logger.error("invitation to %s was not sent: %s", emails, e)
|
||
|
|
raise InvitationError("Could not send invitation") from e
|