Kod źródłowy modułu poradnia.template_mail.utils

import logging
import sys
from enum import Enum

from django.conf import settings
from django.core.mail import get_connection
from django.core.mail.message import EmailMultiAlternatives
from django.template import loader

logger = logging.getLogger(__name__)


[dokumentacja] def make_auto(): """eum.auto replacement""" def loop(): i = 1 while True: yield i i += 1 loop = loop() return lambda: next(loop)
auto = make_auto()
[dokumentacja] class TemplateKey(Enum): CASE_CLOSED = auto() CASE_GRANT_GROUP = auto() CASE_GRANTED = auto() CASE_NEW = auto() CASE_REGISTERED = auto() CASE_UPDATED = auto() CASE_DELETE_OLD = auto() EVENT_CREATED = auto() EVENT_UPDATED = auto() EVENT_REMINDER = auto() LETTER_ACCEPTED = auto() LETTER_REFUSED = auto() LETTER_CREATED = auto() LETTER_DROP_A_NOTE = auto() LETTER_SEND_TO_CLIENT = auto() LETTER_UPDATED = auto() USER_NEW = auto() @classmethod def get_by_target_verb(cls, target, verb): model_name = target._meta.model_name name = "{model}_{verb}".format(model=model_name, verb=verb).upper() return TemplateKey[name]
class MailTemplate: def __init__(self, txt_path, html_path=None): self.txt_path = txt_path self.html_path = html_path def __str__(self): return "{}-{}".format(self.txt_path, self.html_path) @classmethod def from_prefix(cls, prefix): txt_path = prefix + ".txt" html_path = prefix + ".html" return cls(txt_path, html_path) def render(self, context): txt = loader.get_template(self.txt_path).render(context) html = loader.get_template(self.html_path).render(context) return (txt, html) class TemplateMailManager: TEMPLATE_MAP = { TemplateKey.CASE_CLOSED: MailTemplate.from_prefix("cases/email/case_closed"), TemplateKey.CASE_GRANT_GROUP: MailTemplate.from_prefix( "cases/email/case_grant_group" ), TemplateKey.CASE_GRANTED: MailTemplate.from_prefix("cases/email/case_granted"), TemplateKey.CASE_NEW: MailTemplate.from_prefix("cases/email/case_new"), TemplateKey.CASE_REGISTERED: MailTemplate.from_prefix( "cases/email/case_registered" ), TemplateKey.CASE_UPDATED: MailTemplate.from_prefix("cases/email/case_updated"), TemplateKey.CASE_DELETE_OLD: MailTemplate.from_prefix( "cases/email/case_delete_old" ), TemplateKey.EVENT_CREATED: MailTemplate.from_prefix( "events/email/event_created" ), TemplateKey.EVENT_UPDATED: MailTemplate.from_prefix( "events/email/event_updated" ), TemplateKey.EVENT_REMINDER: MailTemplate.from_prefix( "events/email/event_reminder" ), TemplateKey.LETTER_ACCEPTED: MailTemplate.from_prefix( "letters/email/letter_accepted" ), TemplateKey.LETTER_REFUSED: MailTemplate.from_prefix( "letters/email/letter_refused" ), TemplateKey.LETTER_CREATED: MailTemplate.from_prefix( "letters/email/letter_created" ), TemplateKey.LETTER_DROP_A_NOTE: MailTemplate.from_prefix( "letters/email/letter_drop_a_note" ), TemplateKey.LETTER_SEND_TO_CLIENT: MailTemplate.from_prefix( "letters/email/letter_send_to_client" ), TemplateKey.LETTER_UPDATED: MailTemplate.from_prefix( "letters/email/letter_updated" ), TemplateKey.USER_NEW: MailTemplate.from_prefix("users/email/new_user"), } @classmethod def send(cls, template_key, recipient_list, context=None, from_email=None, **kwds): template = cls.TEMPLATE_MAP[template_key] txt, html = template.render(context or {}) subject, txt = txt.strip().split("\n", 1) from_email = from_email if from_email else settings.DEFAULT_FROM_EMAIL headers = {} if len(sys.argv) > 1 and sys.argv[1] == "test": headers["Template"] = str(template) return cls._send_mail_with_header( subject=subject.strip(), message=txt, html_message=html, from_email=from_email, recipient_list=recipient_list, headers=headers, **kwds, ) @staticmethod def _send_mail_with_header( subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None, headers=None, ): """ Fork of django.core.mail.send_mail to add haders attribute """ connection = connection or get_connection( username=auth_user, password=auth_password, fail_silently=fail_silently ) mail = EmailMultiAlternatives( subject, message, from_email, recipient_list, connection=connection, headers=headers or {}, ) if html_message: mail.attach_alternative(html_message, "text/html") return mail.send()