172 lines
5.5 KiB
Python
172 lines
5.5 KiB
Python
from enum import Enum
|
|
|
|
import structlog
|
|
from constance import config
|
|
from django.conf import settings
|
|
from django.utils import timezone
|
|
from sendgrid import Mail, SendGridAPIClient
|
|
|
|
from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse
|
|
|
|
logger = structlog.get_logger(__name__)
|
|
|
|
DATETIME_FORMAT_SWISS_STR = "%d.%m.%Y %H:%M"
|
|
|
|
|
|
def format_swiss_datetime(dt: timezone.datetime) -> str:
|
|
return dt.astimezone(timezone.get_current_timezone()).strftime(
|
|
DATETIME_FORMAT_SWISS_STR
|
|
)
|
|
|
|
|
|
class EmailTemplate(Enum):
|
|
"""Enum for the different Sendgrid email templates."""
|
|
|
|
# VBV - Erinnerung Präsenzkurse
|
|
ATTENDANCE_COURSE_REMINDER = {
|
|
"de": "d-9af079f98f524d85ac6e4166de3480da",
|
|
"it": "d-ab78ddca8a7a46b8afe50aaba3efee81",
|
|
"fr": "d-f88d9912e5484e55a879571463e4a166",
|
|
}
|
|
|
|
ASSIGNMENT_REMINDER_CASEWORK_MEMBER = {
|
|
"de": "d-8b84fd96213540a796c40d4344bc606f",
|
|
"fr": "d-ae6cd87b6b574643b4fff209148c7620",
|
|
"it": "d-1bf8b12a70324e1b91050d5fa01ed81f",
|
|
}
|
|
|
|
ASSIGNMENT_REMINDER_PREP_ASSIGNMENT_MEMBER = {
|
|
"de": "d-cb866d8c538f4ffaab923022ef7209fa",
|
|
"fr": "d-fdc84ae0e1b7417a8ede8db4e07ee7a8",
|
|
"it": "d-39d16586341b4559b3a3df71db3d04fb",
|
|
}
|
|
|
|
ASSIGNMENT_REMINDER_EDONIQ_MEMBER = {
|
|
"de": "d-4b26911d04834079a64ab1758ca470cc",
|
|
"fr": "d-b9f27e3e13e44f20aa5d1a40c93da00d",
|
|
"it": "d-1d3d854c5b3e4012ac3d33eeb3d6e7d1",
|
|
}
|
|
|
|
EVALUATION_REMINDER_CASEWORK_EXPERT = {
|
|
"de": "d-6e3dd4acc7fc4ce7a2776f5147bd32fd",
|
|
"fr": "d-0104add90a354d7fb1fc9fecfa132d06",
|
|
"it": "d-630e9316960647768c0a657e175436aa",
|
|
}
|
|
|
|
# VBV - Geleitete Fallarbeit abgegeben
|
|
CASEWORK_SUBMITTED = {"de": "d-599f0b35ddcd4fac99314cdf8f5446a2"}
|
|
|
|
# VBV - Geleitete Fallarbeit bewertet
|
|
CASEWORK_EVALUATED = {"de": "d-8c57fa13116b47be8eec95dfaf2aa030"}
|
|
|
|
# VBV - Neues Feedback für Circle
|
|
NEW_FEEDBACK = {"de": "d-40fb94d5149949e7b8e7ddfcf0fcfdde"}
|
|
|
|
# Versicherungsvermittler CC (after buying a course with Credit Card)
|
|
WELCOME_MAIL_VV_CC = {
|
|
"de": "d-308a72c779b74c8487cdec03c772ad13",
|
|
"fr": "d-77b3c3a0f185408da55ce006226ca3ff",
|
|
"it": "d-d27db9fc96f34f55a8cacf7640787c4e",
|
|
}
|
|
|
|
# Versicherungsvermittler invoice (after buying a course invoice)
|
|
WELCOME_MAIL_VV_INVOICE = {
|
|
"de": "d-9cded96aaed54301af8099d420b316de",
|
|
"fr": "d-e79eadd996c74d9c85a7cd6f6b313185",
|
|
"it": "d-ee4e11583eee4e7087bbbf1331b6d13a",
|
|
}
|
|
|
|
# VV - Lernbegleitung Einladung
|
|
LEARNING_MENTOR_INVITATION = {
|
|
"de": "d-8c862afde62748b6b8410887eeee89d8",
|
|
"fr": "d-7451e3c858954c15a9f410fa9d92dc06",
|
|
"it": "d-30c6aa9accda4973a940dd25703cb4a9",
|
|
}
|
|
|
|
# üK - Praxisbildner Einladung
|
|
PRAXISBILDNER_INVITATION = {
|
|
"de": "d-480c78cf1ff2471c8b4d230539a206c7",
|
|
"fr": "d-3e198460d98745799c7ec4b5959ab3d1",
|
|
"it": "d-b3b5404b627d46b5ba466ce2b57fa681",
|
|
}
|
|
|
|
# Fremdeinschätzung (Requester → Provider)
|
|
SELF_EVALUATION_FEEDBACK_REQUESTED = {
|
|
"de": "d-cf9c6681991d4293a7baccaa5b043c5c",
|
|
"fr": "d-6b103876807a4a0db6a0c31651c1e8ba",
|
|
"it": "d-403b2f9d09bb41dc9dc85eed6c35c942",
|
|
}
|
|
|
|
# Fremdeinschätzung (Provider → Requester)
|
|
SELF_EVALUATION_FEEDBACK_PROVIDED = {
|
|
"de": "d-e547bff40252458fa802759f2c502e3a",
|
|
"fr": "d-62aa7ce8639c49319f92edb858bbb1cd",
|
|
"it": "d-de2b5dfaf5d2470dbeea5d3ea2a6c442",
|
|
}
|
|
|
|
|
|
def send_email(
|
|
recipient_email: str,
|
|
template: EmailTemplate,
|
|
template_data: dict,
|
|
template_language: str = "de",
|
|
fail_silently: bool = True,
|
|
) -> bool:
|
|
log = logger.bind(
|
|
recipient_email=recipient_email,
|
|
template=template.name,
|
|
template_data=template_data,
|
|
template_language=template_language,
|
|
)
|
|
try:
|
|
whitelist_emails = [
|
|
email.strip()
|
|
for email in config.EMAIL_RECIPIENT_WHITELIST.strip().split(",")
|
|
]
|
|
if "*" in whitelist_emails or recipient_email in whitelist_emails:
|
|
_send_sendgrid_email(
|
|
recipient_email=recipient_email,
|
|
template=template,
|
|
template_data=template_data,
|
|
template_language=template_language,
|
|
)
|
|
log.info("Email sent successfully")
|
|
return True
|
|
else:
|
|
log.info("Email not sent because recipient is not whitelisted")
|
|
return False
|
|
except Exception as e:
|
|
log.error(
|
|
"Failed to send Email", exception=str(e), exc_info=True, stack_info=True
|
|
)
|
|
if not fail_silently:
|
|
raise e
|
|
return False
|
|
|
|
|
|
def _send_sendgrid_email(
|
|
recipient_email: str,
|
|
template: EmailTemplate,
|
|
template_data: dict,
|
|
template_language: str = "de",
|
|
) -> None:
|
|
message = Mail(
|
|
from_email="noreply@my.vbv-afa.ch",
|
|
to_emails=recipient_email,
|
|
)
|
|
message.template_id = template.value.get(template_language, template.value["de"])
|
|
message.dynamic_template_data = template_data
|
|
SendGridAPIClient(settings.SENDGRID_API_KEY).send(message)
|
|
|
|
|
|
def create_template_data_from_course_session_attendance_course(
|
|
attendance_course: CourseSessionAttendanceCourse,
|
|
):
|
|
return {
|
|
"attendance_course": attendance_course.learning_content.title,
|
|
"location": attendance_course.location,
|
|
"trainer": attendance_course.trainer,
|
|
"start": format_swiss_datetime(attendance_course.due_date.start),
|
|
"end": format_swiss_datetime(attendance_course.due_date.end),
|
|
}
|