lizerk 5220a96684 refactor: Модуль notifications полностью самостоятельный и переиспользуемый
КРИТИЧНЫЕ УЛУЧШЕНИЯ:
✅ Убран хардкод 'EUSRR' → универсальное 'My Site'
✅ Созданы email шаблоны внутри модуля (4 файла)
✅ Централизованная конфигурация в config.py
✅ API перемещен в notifications/api/

Новые файлы:
- config.py - централизованные настройки с fallback значениями
- templates/notifications/email/*.html/*.txt - HTML и текстовые шаблоны
- api/__init__.py, api/views.py, api/urls.py - REST API внутри модуля

Изменения в существующих файлах:
- senders/email.py: использует config.site_name() и config.from_email()
- tasks/email.py: rate_limit, max_retries, retry_delay из config
- tasks/push.py: rate_limit, max_retries, retry_delay из config
- tasks/websocket.py: max_retries, retry_delay из config
- api/v1/notifications/urls.py: реэкспорт из notifications.api (обратная совместимость)

Структура шаблонов:
📁 notifications/templates/notifications/email/
  ├── notification.html - красивый HTML для обычных уведомлений
  ├── notification.txt - текстовая версия
  ├── digest.html - HTML дайджест (daily/weekly)
  └── digest.txt - текстовая версия дайджеста

Конфигурация (config.py):
- DEFAULT_CONFIG с fallback значениями для всех параметров
- get_config() - объединяет с settings.NOTIFICATIONS_CONFIG
- Удобные функции: email_rate_limit(), push_max_retries(), site_name()
- Полностью настраиваемо через settings проекта

API внутри модуля:
- notifications/api/views.py - все endpoint'ы
- notifications/api/urls.py - URL patterns
- Относительные импорты (from ..models)
- Обратная совместимость через api/v1/notifications/urls.py

УНИВЕРСАЛЬНОСТЬ:
✅ Нет хардкода проекта
✅ Все шаблоны внутри модуля
✅ API внутри модуля
✅ Конфигурация через settings
✅ Можно скопировать в любой проект Django 5.2+
2026-03-09 17:06:20 +03:00

141 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Централизованная конфигурация модуля 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 минута в секундах
# === 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
'DEFAULT_FROM_EMAIL': None, # None = использовать settings.DEFAULT_FROM_EMAIL
'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