lizerk ae21c7cae7 refactor(communications): Сделать автоматические уведомления опциональными через COMMUNICATIONS_AUTO_NOTIFY
- Добавлен флаг COMMUNICATIONS_AUTO_NOTIFY (по умолчанию True)
- Оба сигнала теперь проверяют флаг перед выполнением
- Улучшена документация: объяснено что сигналы опциональны
- Для standalone использования можно отключить автоуведомления
2026-03-11 17:38:55 +03:00

84 lines
3.6 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.

"""
Django signals для автоматической генерации уведомлений в модуле Communications.
Обрабатывает события:
- post_save для Message - новое сообщение (с упоминаниями, ответами)
- m2m_changed для Chat.participants - добавление пользователей в чат
ВАЖНО: Эти сигналы ОПЦИОНАЛЬНЫ и могут быть отключены через настройку:
COMMUNICATIONS_AUTO_NOTIFY = False # в settings.py
По умолчанию включены для обратной совместимости с EUSRR.
Для standalone использования рекомендуется вызывать handlers вручную
или отключить автоматические уведомления.
"""
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save, m2m_changed
from django.dispatch import receiver
from ..models import Message, Chat
from .handlers import notify_new_message, notify_chat_added
User = get_user_model()
# Проверяем, включены ли автоматические уведомления
_AUTO_NOTIFY_ENABLED = getattr(settings, 'COMMUNICATIONS_AUTO_NOTIFY', True)
@receiver(post_save, sender=Message)
def create_message_notifications(sender, instance, created, **kwargs):
"""
Создает уведомления при создании нового сообщения.
Обрабатывает:
1. Новое сообщение в чате (для всех участников кроме автора)
2. Упоминания (@username) в тексте
3. Ответ на сообщение (reply_to)
ОПТИМИЗАЦИЯ: Уведомления отправляются через универсальную систему
channels.py → Celery → WebSocket/Email/Push
NOTE: Можно отключить через COMMUNICATIONS_AUTO_NOTIFY = False
"""
if not _AUTO_NOTIFY_ENABLED:
return
if not created or instance.is_system or instance.is_deleted:
return
# Отправляем через универсальную систему
notify_new_message(instance)
@receiver(m2m_changed, sender=Chat.participants.through)
def create_chat_added_notifications(sender, instance, action, pk_set, **kwargs):
"""
Создает уведомления когда пользователя добавляют в чат.
Args:
instance: Chat объект
action: Тип изменения ('post_add', 'post_remove', etc.)
pk_set: Набор ID добавленных/удаленных пользователей
NOTE: Можно отключить через COMMUNICATIONS_AUTO_NOTIFY = False
"""
if not _AUTO_NOTIFY_ENABLED:
return
if action != 'post_add':
return
chat = instance
# Получаем информацию о том, кто добавил (если доступно)
# Это может быть последний изменивший или создатель чата
added_by = getattr(chat, 'created_by', None) or chat.participants.first()
# ОПТИМИЗАЦИЯ: Получаем всех новых пользователей одним запросом
new_users = User.objects.filter(id__in=pk_set)
# Отправляем уведомления через handlers
notify_chat_added(chat, new_users, added_by=added_by)