141 lines
4.7 KiB
Python
141 lines
4.7 KiB
Python
"""
|
||
Централизованная конфигурация модуля notifications
|
||
|
||
Все настройки вынесены в один файл для удобства переиспользования.
|
||
Значения можно переопределить в settings.py проекта через NOTIFICATIONS_CONFIG.
|
||
"""
|
||
|
||
from django.conf import settings
|
||
|
||
|
||
# Базовая конфигурация по умолчанию
|
||
DEFAULT_CONFIG = {
|
||
# === Каналы доставки ===
|
||
"CHANNELS_ENABLED": {
|
||
"email": True,
|
||
"push": True,
|
||
"websocket": True,
|
||
},
|
||
# === Email настройки ===
|
||
"EMAIL_RATE_LIMIT": "10/m", # 10 писем в минуту
|
||
"EMAIL_MAX_RETRIES": 3,
|
||
"EMAIL_RETRY_DELAY": 300, # 5 минут в секундах
|
||
"EMAIL_DEFAULT_FREQUENCY": "instant", # instant, daily, weekly, disabled
|
||
# === Push настройки ===
|
||
"PUSH_RATE_LIMIT": "50/m", # 50 push в минуту
|
||
"PUSH_MAX_RETRIES": 2,
|
||
"PUSH_RETRY_DELAY": 60, # 1 минута в секундах
|
||
# URL иконки по умолчанию (None = browser default)
|
||
"PUSH_DEFAULT_ICON": None,
|
||
"PUSH_DEFAULT_BADGE": None, # URL badge по умолчанию (None = без badge)
|
||
# === WebSocket настройки ===
|
||
"WEBSOCKET_MAX_RETRIES": 1,
|
||
"WEBSOCKET_RETRY_DELAY": 5, # 5 секунд
|
||
# === Digest настройки ===
|
||
"DIGEST_DAILY_TIME": "09:00", # Время отправки дейли дайджеста
|
||
"DIGEST_WEEKLY_DAY": "monday", # День недели для weekly дайджеста
|
||
"DIGEST_WEEKLY_TIME": "09:00",
|
||
# === Общие настройки ===
|
||
"SITE_NAME": "My Site", # Название сайта для email
|
||
# None = использовать settings.DEFAULT_FROM_EMAIL
|
||
"DEFAULT_FROM_EMAIL": None,
|
||
"NOTIFICATION_MAX_AGE_DAYS": 90, # Храним уведомления 90 дней
|
||
"UNREAD_NOTIFICATIONS_LIMIT": 100, # Максимум непрочитанных для показа
|
||
# === DND режим ===
|
||
"DND_ENABLED": True, # Включить поддержку "Не беспокоить"
|
||
"DND_SILENT_CHANNELS": ["websocket"], # В DND только silent websocket
|
||
}
|
||
|
||
|
||
def get_config():
|
||
"""
|
||
Получить конфигурацию модуля.
|
||
Объединяет DEFAULT_CONFIG с пользовательскими настройками
|
||
из settings.NOTIFICATIONS_CONFIG.
|
||
|
||
Returns:
|
||
dict: Итоговая конфигурация
|
||
|
||
Usage:
|
||
from notifications.config import get_config
|
||
config = get_config()
|
||
rate_limit = config['EMAIL_RATE_LIMIT']
|
||
"""
|
||
config = DEFAULT_CONFIG.copy()
|
||
|
||
# Обновляем из settings проекта
|
||
user_config = getattr(settings, "NOTIFICATIONS_CONFIG", {})
|
||
config.update(user_config)
|
||
|
||
return config
|
||
|
||
|
||
def get(key, default=None):
|
||
"""
|
||
Получить конкретную настройку по ключу
|
||
|
||
Args:
|
||
key: Ключ настройки
|
||
default: Значение по умолчанию если не найдено
|
||
|
||
Returns:
|
||
Значение настройки
|
||
|
||
Usage:
|
||
from notifications.config import get
|
||
rate_limit = get('EMAIL_RATE_LIMIT', '10/m')
|
||
"""
|
||
config = get_config()
|
||
return config.get(key, default)
|
||
|
||
|
||
# Удобные алиасы для часто используемых настроек
|
||
def email_rate_limit():
|
||
"""Получить rate limit для email"""
|
||
return get("EMAIL_RATE_LIMIT")
|
||
|
||
|
||
def email_max_retries():
|
||
"""Получить максимум retry для email"""
|
||
return get("EMAIL_MAX_RETRIES")
|
||
|
||
|
||
def email_retry_delay():
|
||
"""Получить задержку retry для email"""
|
||
return get("EMAIL_RETRY_DELAY")
|
||
|
||
|
||
def push_rate_limit():
|
||
"""Получить rate limit для push"""
|
||
return get("PUSH_RATE_LIMIT")
|
||
|
||
|
||
def push_max_retries():
|
||
"""Получить максимум retry для push"""
|
||
return get("PUSH_MAX_RETRIES")
|
||
|
||
|
||
def push_retry_delay():
|
||
"""Получить задержку retry для push"""
|
||
return get("PUSH_RETRY_DELAY")
|
||
|
||
|
||
def websocket_max_retries():
|
||
"""Получить максимум retry для websocket"""
|
||
return get("WEBSOCKET_MAX_RETRIES")
|
||
|
||
|
||
def websocket_retry_delay():
|
||
"""Получить задержку retry для websocket"""
|
||
return get("WEBSOCKET_RETRY_DELAY")
|
||
|
||
|
||
def site_name():
|
||
"""Получить название сайта"""
|
||
return get("SITE_NAME") or getattr(settings, "SITE_NAME", "My Site")
|
||
|
||
|
||
def from_email():
|
||
"""Получить from email"""
|
||
return get("DEFAULT_FROM_EMAIL") or settings.DEFAULT_FROM_EMAIL
|