Проблема: - Монолитный notification_signals.py (~220 строк) смешивал разные concerns - Логика отслеживания изменений полей переплетена с signal receivers - Вспомогательные функции без четкой структуры Решение: Разделен на модульную структуру calendar_app/notifications/: - config.py - NotificationVerbs, MessageTemplates, ActionURLs, константы полей, вспомогательные функции (format_date, format_changes, FIELD_NAMES, IMPORTANT_FIELDS) - handlers.py - get_event_recipients(), notify_event_created(), notify_event_changed(), notify_event_cancelled() - signals.py - Django signal receivers (@receiver) для CalendarEvent - __init__.py - публичный API модуля Изменения: - Создан: calendar_app/notifications/ модуль с 4 файлами - Переименован: notification_signals.py → notification_signals.py.old - Изменен: apps.py - обновлен импорт на calendar_app.notifications Логика уведомлений: 1. Новое событие → получатели по типу (компания/отдел/личное) 2. Изменение события → участники события (если изменены важные поля) 3. Отмена события → все участники Преимущества: - ✅ Единообразие со всеми остальными приложениями - ✅ Четкое разделение ответственности (SRP) - ✅ Отслеживание изменений полей вынесено в отдельный signal - ✅ Централизованные константы для важных полей - ✅ Легче тестировать компоненты - ✅ Публичный API для переиспользования Верификация: - python manage.py check - успешно
46 lines
2.0 KiB
Python
46 lines
2.0 KiB
Python
# backend/calendar_app/apps.py
|
|
from __future__ import annotations
|
|
|
|
from django.apps import AppConfig
|
|
from django.apps import apps as django_apps
|
|
from django.db.models.signals import post_delete, post_save
|
|
|
|
|
|
class CalendarAppConfig(AppConfig):
|
|
"""Конфиг приложения календаря. Подключает сигналы к модели сотрудника."""
|
|
name = "calendar_app"
|
|
verbose_name = "Календарь"
|
|
|
|
def ready(self) -> None:
|
|
"""Подключает обработчики сигналов к employees.Employee.
|
|
|
|
Raises:
|
|
LookupError: Если приложение 'employees' или модель 'Employee' не найдены.
|
|
"""
|
|
import calendar_app.notifications # Модуль уведомлений (signals регистрируются автоматически)
|
|
from calendar_app import signals # noqa: F401 - старая система
|
|
import calendar_app.rules # django-rules: регистрация предикатов и правил доступа
|
|
|
|
try:
|
|
Employee = django_apps.get_model("employees", "Employee")
|
|
except LookupError:
|
|
# Если в проекте иное имя модели — замените здесь.
|
|
return
|
|
|
|
# ===== СТАРАЯ СИСТЕМА (calendar_app) =====
|
|
# Оставлена для совместимости во время миграции
|
|
post_save.connect(
|
|
signals.handle_employee_saved,
|
|
sender=Employee,
|
|
dispatch_uid="calendar_app.employee_saved_sync_birthday",
|
|
)
|
|
post_delete.connect(
|
|
signals.handle_employee_deleted,
|
|
sender=Employee,
|
|
dispatch_uid="calendar_app.employee_deleted_remove_birthday",
|
|
)
|
|
|
|
# NOTE: Синхронизация дней рождения через django-scheduler
|
|
# перенесена в employees/signals_birthday.py
|
|
|