Source code for cms_qe.utils
from collections.abc import Iterable
from importlib import import_module
from typing import Optional, Union
from django.apps import apps
from django.conf import settings
from django.contrib.sites.shortcuts import get_current_site
from django.template import TemplateDoesNotExist
from django.template.loader import get_template
from mailqueue.models import MailerMessage
# pylint:disable=invalid-name
[docs]def get_email(template: str, subject: str, to: Union[str, Iterable[str]], from_email: Optional[str] = None, **kwargs):
"""
Returns a ``MailerMessage`` instance from ``mailqueue``. Use ``save()`` method instead of ``send()`` to send
message or put it to a mailqueue.
Template should be without extension and you should create both ``.txt`` and ``.html`` version.
Second one is not mandatory but is good to provide it as well.
"""
email = MailerMessage()
email.subject = subject
email.from_address = from_email or settings.DEFAULT_FROM_EMAIL
if isinstance(to, str):
to = [to]
email.to_address = ', '.join(to)
template_txt = get_template(template + '.txt')
content = template_txt.render(kwargs)
email.content = content
try:
template_html = get_template(template + '.html')
except TemplateDoesNotExist:
return email
email.html_content = template_html.render(kwargs)
return email
[docs]def get_base_url(request) -> str:
"""
Helper to get absolute URL of application. It requires to set
correctly domain of site framework.
"""
protocol = settings.META_SITE_PROTOCOL
domain = get_current_site(request)
return f'{protocol}://{domain}'
[docs]def get_functions(module_name: str, function_name: str) -> Iterable[tuple[str, object]]:
"""
Get function by ``function_name`` of ``module_name`` for every installed
Django app. Returns tuple of ``app_name`` and ``function``. Example usage:
.. code-block:: python
for app, func in get_functions('monitoring', 'get_status'):
# ...
"""
for app_name, module in get_modules(module_name):
function = getattr(module, function_name, None)
if function:
yield (app_name, function)
[docs]def get_modules(module_name: str) -> Iterable[tuple[str, object]]:
"""
Get module by ``module_name`` for every installed Django app.
Returns tuple of ``app_name`` and ``module``. Example usage:
.. code-block:: python
for app, module in get_modules('models'):
# ...
"""
for app in apps.get_app_configs():
module = get_module(app.name, module_name)
if module:
yield (app.name, module)
[docs]def get_module(app_name: str, module_name: str) -> object:
"""
Helper to load module by ``module_name`` of Django app ``app_name``.
Returns ``None`` if module does not exist.
"""
import_module(app_name) # The app has to exists.
module_name = f'{app_name}.{module_name}'
try:
return import_module(module_name)
except ImportError:
return None