lizerk 8182199744 refactor(communications): реструктуризация notifications в модульную архитектуру
Проблема:
- Монолитный notification_signals.py (~310 строк) смешивал разные concerns
- Сложная логика с упоминаниями, ответами и обычными сообщениями в одном файле
- Множество вспомогательных функций без четкой структуры

Решение:
Разделен на модульную структуру communications/notifications/:
- config.py - NotificationVerbs, MessageTemplates, ActionURLs, вспомогательные функции
  (extract_mentions, truncate_message, get_chat_name)
- handlers.py - notify_new_message(), notify_chat_added(),
  get_users_with_notifications_enabled()
- signals.py - Django signal receivers (@receiver)
- __init__.py - публичный API модуля

Изменения:
- Создан: communications/notifications/ модуль с 4 файлами
- Переименован: notification_signals.py → notification_signals.py.old
- Изменен: apps.py - обновлен импорт на communications.notifications

Логика уведомлений:
1. Упоминания (@email) - высокий приоритет
2. Ответы на сообщения - средний приоритет
3. Обычные сообщения - низкий приоритет

Преимущества:
- ✅ Единообразие с requests_app, procurement, feed
- ✅ Четкое разделение ответственности (SRP)
- ✅ ОПТИМИЗАЦИЯ: Настройки уведомлений загружаются одним запросом
- ✅ Легче тестировать компоненты
- ✅ Публичный API для переиспользования функций
- ✅ Централизованные шаблоны сообщений

Верификация:
- python manage.py check - успешно
2026-03-10 13:27:32 +03:00

20 lines
790 B
Python

# backend\communications\apps.py
from django.apps import AppConfig
class CommunicationsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "communications"
def ready(self):
import communications.signals
import communications.notifications # Модуль уведомлений (signals регистрируются автоматически)
import communications.rules # django-rules: регистрация предикатов и правил доступа
def create_main_global_chat(sender, **kwargs):
from communications.models import Chat
if not Chat.objects.filter(type="global", is_main=True).exists():
Chat.objects.create(type="global", is_main=True)