Проблема: - Монолитный notification_signals.py (~200 строк) смешивал разные concerns - Сложно поддерживать и понимать логику уведомлений - Отсутствовала интеграция с API для уведомлений о лайках Решение: Разделен на модульную структуру feed/notifications/: - config.py - NotificationVerbs, MessageTemplates, ActionURLs, truncate_text - handlers.py - notify_new_post(), notify_comment(), notify_post_reaction(), get_post_recipients() - signals.py - Django signal receivers (@receiver) - __init__.py - публичный API модуля Изменения: - Создан: feed/notifications/ модуль с 4 файлами - Переименован: notification_signals.py → notification_signals.py.old - Изменен: apps.py - обновлен импорт на feed.notifications - Изменен: api/v1/feed/views.py - добавлен вызов notify_post_reaction() в метод like() Преимущества: - ✅ Единообразие с requests_app и procurement - ✅ Четкое разделение ответственности (SRP) - ✅ Легче тестировать отдельные компоненты - ✅ Публичный API через __init__.py - ✅ Уведомления о лайках теперь работают - ✅ Централизованные шаблоны сообщений Верификация: - python manage.py check - успешно
45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
"""
|
||
Django signals для автоматической генерации уведомлений в модуле Feed.
|
||
|
||
Обрабатывает события:
|
||
- post_save для Post - создание новой публикации
|
||
- post_save для Comment - добавление комментария
|
||
"""
|
||
|
||
from django.db.models.signals import post_save
|
||
from django.dispatch import receiver
|
||
|
||
from ..models import Post, Comment
|
||
from .handlers import notify_new_post, notify_comment
|
||
|
||
|
||
@receiver(post_save, sender=Post)
|
||
def create_post_notification(sender, instance, created, **kwargs):
|
||
"""
|
||
Создает уведомления при создании новой публикации.
|
||
|
||
Уведомления отправляются в зависимости от типа:
|
||
- TYPE_COMPANY - всем сотрудникам
|
||
- TYPE_DEPARTMENT - сотрудникам отдела
|
||
- TYPE_EMPLOYEE - подписчикам автора (если реализовано)
|
||
"""
|
||
if not created:
|
||
return
|
||
|
||
# Отправляем уведомления через универсальную систему
|
||
# channels.py автоматически обработает через Celery
|
||
notify_new_post(instance)
|
||
|
||
|
||
@receiver(post_save, sender=Comment)
|
||
def create_comment_notification(sender, instance, created, **kwargs):
|
||
"""
|
||
Создает уведомления при добавлении комментария к публикации.
|
||
|
||
Уведомляет автора публикации о новом комментарии.
|
||
"""
|
||
if not created:
|
||
return
|
||
|
||
notify_comment(instance)
|