Source code for app_utils.allianceauth
"""Utilities related to Alliance Auth."""
# pylint: disable=unused-import
from functools import partial
from typing import Optional
from redis import Redis
from django.contrib.auth.models import User
from django.core.cache import caches
from allianceauth.notifications import notify
from allianceauth.views import NightModeRedirectView
from ._app_settings import APP_UTILS_NOTIFY_THROTTLED_TIMEOUT
from .helpers import throttle
from .testing import create_fake_user # noqa: F401
try:
import django_redis
except ImportError:
django_redis = None
[docs]
def notify_admins(message: str, title: str, level: str = "info") -> None:
"""Send notification to all admins.
Args:
message: Message text
title: Message title
level: Notification level of the message.
"""
for user in User.objects.filter(is_superuser=True):
notify(user, title=title, message=message, level=level)
[docs]
def notify_admins_throttled(
message_id: str,
message: str,
title: str,
level: str = "info",
timeout: Optional[int] = None,
):
"""Send notification to all admins, but limits the frequency
for sending messages with the same message ID, e.g. to once per day.
If this function is called during a timeout the notification will simply be ignored.
Args:
message_id: ID representing this message
message: Message text
title: Message title
level: Notification level of the message.
timeout: Time between each notification, e.g. 86400 = once per day.\
When not provided uses system default,\
which is 86400 and can also be set via this Django setting:\
APP_UTILS_NOTIFY_THROTTLED_TIMEOUT
"""
if not timeout:
timeout = APP_UTILS_NOTIFY_THROTTLED_TIMEOUT
throttle(
func=partial(notify_admins, message, title, level),
context_id=message_id,
timeout=timeout,
)
[docs]
def notify_throttled(
message_id: str,
user: User,
title: str,
message: str,
level: str = "info",
timeout: Optional[int] = None,
):
"""Send notification to user, but limits the frequency
for sending messages with the same message ID, e.g. to once per day.
If this function is called during a timeout the notification will simply be ignored.
Args:
message_id: ID representing this message
title: Message title
message: Message text
level: Notification level of the message.
timeout: Time between each notification, e.g. 86400 = once per day.\
When not provided uses system default,\
which is 86400 and can also be set via this Django setting:\
APP_UTILS_NOTIFY_THROTTLED_TIMEOUT
"""
if not timeout:
timeout = APP_UTILS_NOTIFY_THROTTLED_TIMEOUT
throttle(
func=partial(notify, user, title, message, level),
context_id=message_id,
timeout=timeout,
)
[docs]
def is_night_mode(request) -> bool:
"""Returns True if the current user session is in night mode, else False"""
return NightModeRedirectView.night_mode_state(request)
[docs]
def get_redis_client() -> Redis:
"""Return configured redis client used for Django caching in Alliance Auth."""
try:
return django_redis.get_redis_connection("default") # type: ignore
except AttributeError:
default_cache = caches["default"]
return default_cache.get_master_client() # type: ignore