- Интегрирован django-service-objects 0.7.1 для Service Layer Pattern
- Перенесена вся логика дней рождения из calendar_app → employees:
* UpsertBirthdayEventService - создание/обновление событий ДР
* DeleteBirthdayEventService - удаление событий ДР
* BulkSyncBirthdaysService - массовая синхронизация
* signals_birthday.py - автосинхронизация через post_save/post_delete
* management command sync_birthdays - CLI команда синхронизации
* тесты (11 tests, 6 passing)
- Обновлена миграция 0013_migrate_to_django_scheduler:
* Добавлен ШАГ 5: автоматическая синхронизация дней рождения (131 событие)
* Исключены старые события ДР из миграции (source.endswith(':birthday'))
* Исправлены имена сотрудников (f'{last_name} {first_name}' вместо get_full_name())
* Добавлен цвет #FFC107 для событий дней рождения
- Очищен calendar_app от birthday сервисов:
* Удалены calendar_app/services/birthday_events.py
* Удалены calendar_app/signals_scheduler.py
* Удалены calendar_app/management/commands/sync_birthdays.py
* Удалены calendar_app/tests/test_services.py
* Обновлен apps.py - удалены ссылки на signals_scheduler
- API улучшения:
* Добавлен api/v1/schedule/permissions.py (IsCalendarOwnerOrAdmin)
* Обновлен views.py с правильными permissions
- Документация:
* DJANGO_SERVICE_OBJECTS_INTEGRATION.md - руководство по Service Layer
* CALENDAR_MIGRATION_ANALYSIS.md - анализ миграции
* MODERNIZATION_ANALYSIS.md - анализ модернизации кодовой базы
Цель: подготовка к будущему удалению calendar_app, централизация
логики сотрудников в employees приложении.
Refs: #birthday-refactoring
45 lines
1.8 KiB
Python
45 lines
1.8 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.notification_signals # noqa: F401
|
|
from calendar_app import signals # noqa: F401 - старая система
|
|
|
|
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
|
|
|