КРИТИЧНЫЕ УЛУЧШЕНИЯ: ✅ Убран хардкод '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+
42 lines
1.5 KiB
Python
42 lines
1.5 KiB
Python
"""
|
||
Celery задачи для отправки Web Push уведомлений
|
||
"""
|
||
from .base import BaseNotificationTask
|
||
from notifications import config
|
||
|
||
|
||
class PushNotificationTask(BaseNotificationTask):
|
||
"""
|
||
Celery задача для асинхронной отправки Web Push уведомлений.
|
||
|
||
Особенности:
|
||
- Rate limiting: из config (default: 50 push/минуту)
|
||
- Retry: из config (default: 2 попытки с интервалом 1 минута)
|
||
- Автоматическое удаление неактивных устройств
|
||
"""
|
||
|
||
task_name = "notifications.send_push"
|
||
max_retries = config.push_max_retries()
|
||
retry_delay = config.push_retry_delay()
|
||
rate_limit = config.push_rate_limit()
|
||
|
||
def send_notification(self, notification, **kwargs) -> bool:
|
||
"""
|
||
Отправляет Web Push через PushNotificationSender.
|
||
|
||
Args:
|
||
notification: Объект Notification
|
||
**kwargs: Дополнительные параметры
|
||
|
||
Returns:
|
||
True если успешно (хотя бы одно устройство), False иначе
|
||
"""
|
||
from notifications.senders.push import PushNotificationSender
|
||
|
||
sender = PushNotificationSender()
|
||
return sender.send(notification, **kwargs)
|
||
|
||
|
||
# Регистрируем задачу в Celery
|
||
send_push_notification = PushNotificationTask.register_task()
|