Files
ihrm/base/backends.py

260 lines
7.4 KiB
Python
Raw Normal View History

2024-01-04 11:05:11 +05:30
"""
email_backend.py
This module is used to write email backends
"""
import importlib
import logging
from django.core.cache import cache
from django.core.mail import EmailMessage
2024-01-04 11:05:11 +05:30
from django.core.mail.backends.smtp import EmailBackend
from base.models import DynamicEmailConfiguration, EmailLog
from horilla import settings
from horilla.horilla_middlewares import _thread_locals
2024-01-04 11:05:11 +05:30
logger = logging.getLogger(__name__)
2024-01-04 11:05:11 +05:30
class DefaultHorillaMailBackend(EmailBackend):
2024-01-04 11:05:11 +05:30
def __init__(
self,
host=None,
port=None,
username=None,
password=None,
use_tls=None,
fail_silently=None,
use_ssl=None,
timeout=None,
ssl_keyfile=None,
ssl_certfile=None,
**kwargs,
2024-01-04 11:05:11 +05:30
):
self.configuration = self.get_dynamic_email_config()
ssl_keyfile = (
getattr(self.configuration, "ssl_keyfile", None)
if self.configuration
else ssl_keyfile or getattr(settings, "ssl_keyfile", None)
)
ssl_certfile = (
getattr(self.configuration, "ssl_certfile", None)
if self.configuration
else ssl_certfile or getattr(settings, "ssl_certfile", None)
)
super().__init__(
host=self.dynamic_host,
port=self.dynamic_port,
username=self.dynamic_username,
password=self.dynamic_password,
use_tls=self.dynamic_use_tls,
fail_silently=self.dynamic_fail_silently,
use_ssl=self.dynamic_use_ssl,
timeout=self.dynamic_timeout,
ssl_keyfile=ssl_keyfile,
ssl_certfile=ssl_certfile,
**kwargs,
)
@staticmethod
def get_dynamic_email_config():
2024-01-04 11:05:11 +05:30
request = getattr(_thread_locals, "request", None)
company = None
if request and not request.user.is_anonymous:
company = request.user.employee_get.get_company()
2024-01-04 11:05:11 +05:30
configuration = DynamicEmailConfiguration.objects.filter(
company_id=company
2024-01-04 11:05:11 +05:30
).first()
2024-01-29 11:48:32 +05:30
if configuration is None:
configuration = DynamicEmailConfiguration.objects.filter(
is_primary=True
2024-01-29 11:48:32 +05:30
).first()
if configuration:
display_email_name = (
f"{configuration.display_name} <{configuration.from_email}>"
)
if request:
if (
configuration.use_dynamic_display_name
and request.user.is_authenticated
):
display_email_name = f"{request.user.employee_get.get_full_name()} <{request.user.employee_get.get_email()}>"
cache.set(f"dynamic_display_name{request.user.pk}", display_email_name)
if request.user.is_authenticated:
reply_to = [
f"{request.user.employee_get.get_full_name()} <{request.user.employee_get.get_email()}>",
]
cache.set(f"reply_to{request.user.pk}", reply_to)
return configuration
@property
def dynamic_host(self):
return (
self.configuration.host
if self.configuration
else getattr(settings, "EMAIL_HOST", None)
2024-01-04 11:05:11 +05:30
)
@property
def dynamic_port(self):
return (
self.configuration.port
if self.configuration
else getattr(settings, "EMAIL_PORT", None)
2024-01-04 11:05:11 +05:30
)
@property
def dynamic_username(self):
return (
self.configuration.username
if self.configuration
else getattr(settings, "EMAIL_HOST_USER", None)
2024-01-04 11:05:11 +05:30
)
@property
def dynamic_mail_sent_from(self):
return (
self.configuration.from_email
if self.configuration
else getattr(settings, "DEFAULT_FROM_EMAIL", None)
)
@property
def dynamic_display_name(self):
return self.configuration.display_name if self.configuration else None
@property
def dynamic_from_email_with_display_name(self):
return (
f"{self.dynamic_display_name} <{self.dynamic_mail_sent_from}>"
if self.dynamic_display_name
else self.dynamic_mail_sent_from
)
@property
def dynamic_password(self):
return (
self.configuration.password
if self.configuration
else getattr(settings, "EMAIL_HOST_PASSWORD", None)
2024-01-04 11:05:11 +05:30
)
@property
def dynamic_use_tls(self):
return (
self.configuration.use_tls
if self.configuration
else getattr(settings, "EMAIL_USE_TLS", None)
2024-01-04 11:05:11 +05:30
)
@property
def dynamic_fail_silently(self):
return (
self.configuration.fail_silently
if self.configuration
else getattr(settings, "EMAIL_FAIL_SILENTLY", True)
2024-01-04 11:05:11 +05:30
)
@property
def dynamic_use_ssl(self):
return (
self.configuration.use_ssl
if self.configuration
else getattr(settings, "EMAIL_USE_SSL", None)
2024-01-04 11:05:11 +05:30
)
@property
def dynamic_timeout(self):
return (
self.configuration.timeout
if self.configuration
else getattr(settings, "EMAIL_TIMEOUT", None)
2024-01-04 11:05:11 +05:30
)
EMAIL_BACKEND = getattr(settings, "EMAIL_BACKEND", "")
BACKEND_CLASS: EmailBackend = DefaultHorillaMailBackend
default = "base.backends.ConfiguredEmailBackend"
setattr(BACKEND_CLASS, "send_messages", DefaultHorillaMailBackend.send_messages)
if EMAIL_BACKEND and EMAIL_BACKEND != default:
module_path, class_name = EMAIL_BACKEND.rsplit(".", 1)
module = importlib.import_module(module_path)
BACKEND_CLASS = getattr(module, class_name)
class ConfiguredEmailBackend(BACKEND_CLASS):
2024-01-29 11:48:32 +05:30
def send_messages(self, email_messages):
response = super(BACKEND_CLASS, self).send_messages(email_messages)
2024-01-29 11:48:32 +05:30
for message in email_messages:
email_log = EmailLog(
subject=message.subject,
from_email=self.dynamic_from_email_with_display_name,
2024-01-29 11:48:32 +05:30
to=message.to,
body=message.body,
status="sent" if response else "failed",
)
email_log.save()
return response
2024-01-04 11:05:11 +05:30
if EMAIL_BACKEND != default:
from_mail = getattr(settings, "DEFAULT_FROM_EMAIL", "example@gmail.com")
username = getattr(settings, "EMAIL_HOST_USER", "example@gmail.com")
ConfiguredEmailBackend.dynamic_username = from_mail
ConfiguredEmailBackend.dynamic_from_email_with_display_name = from_mail
2024-01-04 11:05:11 +05:30
__all__ = ["ConfiguredEmailBackend"]
message_init = EmailMessage.__init__
def new_init(
self,
subject="",
body="",
from_email=None,
to=None,
bcc=None,
connection=None,
attachments=None,
headers=None,
cc=None,
reply_to=None,
):
"""
custom __init_method to override
"""
request = getattr(_thread_locals, "request", None)
DefaultHorillaMailBackend()
from_email = cache.get(f"dynamic_display_name{request.user.pk}")
if request.user.is_authenticated:
reply_to = cache.get(f"reply_to{request.user.pk}") if not reply_to else reply_to
message_init(
self,
subject=subject,
body=body,
from_email=from_email,
to=to,
bcc=bcc,
connection=connection,
attachments=attachments,
headers=headers,
cc=cc,
reply_to=reply_to,
)
EmailMessage.__init__ = new_init