Corp/backend/scheduling/README.md
lizerk b0e88e8e8b refactor(backend): migrate calendar_app to scheduling app
- Rename calendar_app → scheduling (integration app for django-scheduler)
- Move schedule_patch.py → scheduling/patch.py with improved logging
- Create scheduling.notifications system for django-scheduler events
- Add scheduling.rules for django-rules integration
- Remove unused calendar_app models and API (not registered in urls)
- Remove backend/api/v1/calendar/ (dead code)
- Remove old tests for calendar_app
- Add comprehensive documentation in scheduling/README.md
- Update settings.py: calendar_app.apps.CalendarAppConfig → scheduling.apps.SchedulingConfig
- Clean api/apps.py: remove schedule_patch import (now in scheduling.apps)

The scheduling app provides:
- Patches for django-scheduler bugs (byweekday fix)
- Notification system for calendar events
- Access rules via django-rules
- Auto-applies on Django startup

Closes integration of django-scheduler for EUSRR calendar system.
2026-03-10 15:21:28 +03:00

118 lines
4.5 KiB
Markdown
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.

# Scheduling App
Приложение для интеграции и расширения **django-scheduler** в EUSRR.
## Содержимое
### 📦 Основные модули
- **`patch.py`** - Исправление бага django-scheduler с `byweekday`
- **`notifications/`** - Система уведомлений для событий календаря
- **`rules.py`** - Правила доступа django-rules для календарей и событий
- **`apps.py`** - Конфигурация приложения (применяет патчи, регистрирует сигналы)
### 🔧 Патчи
**Проблема django-scheduler:**
При создании повторяющегося события с `byweekday=[1, 4]` (вторник и пятница), если событие создается в пятницу, django-scheduler неправильно заменяет весь массив на `[4]`, игнорируя вторник.
**Решение:**
Модуль `patch.py` автоматически применяется при запуске Django и исправляет метод `Event._event_params()`.
### 🔔 Уведомления
Автоматические уведомления для событий calendar через django signals:
- **Создание события** → уведомление всем участникам календаря
- **Изменение события** → уведомление при изменении важных полей (название, время, описание)
- **Удаление события** → уведомление об отмене
**Конфигурация:**
- `notifications/config.py` - шаблоны сообщений, URL-адреса
- `notifications/handlers.py` - бизнес-логика отправки уведомлений
- `notifications/signals.py` - Django signals для автоматической обработки
### 🔐 Права доступа
Интеграция с **django-rules** для объектных прав доступа:
```python
# В коде
if user.has_perm('can_edit_calendar', calendar):
# Редактирование разрешено
# В шаблонах
{% if request.user|has_rule:'can_edit_event' event %}
<button>Редактировать</button>
{% endif %}
```
**Правила:**
- `can_view_calendar` / `can_view_event` - просмотр
- `can_edit_calendar` / `can_edit_event` - редактирование
- `can_delete_calendar` / `can_delete_event` - удаление
Права проверяются через `CalendarRelation` из django-scheduler.
## Установка
Приложение автоматически активируется при добавлении в `INSTALLED_APPS`:
```python
INSTALLED_APPS = [
# ...
'schedule', # django-scheduler (обязательно перед scheduling)
'scheduling', # Интеграция и расширения
# ...
]
```
## Использование
### Отправка уведомлений вручную
```python
from scheduling.notifications.handlers import (
notify_event_created,
notify_event_changed,
notify_event_cancelled
)
from schedule.models import Event
event = Event.objects.get(id=1)
# Создано
notify_event_created(event, creator=request.user)
# Изменено
notify_event_changed(event, changed_fields=['title', 'start'], modifier=request.user)
# Отменено
notify_event_cancelled(event, canceller=request.user)
```
### Передача контекста для уведомлений в ViewSet
```python
class EventViewSet(viewsets.ModelViewSet):
def perform_create(self, serializer):
event = serializer.save()
# Передаем создателя для уведомлений
event._creator = self.request.user
event.save()
```
## Зависимости
- `django-scheduler >= 0.12.0`
- `django-rules` (опционально, для rules.py)
- `django-notifications-hq` (для системы уведомлений)
## История
Это приложение заменило старое `calendar_app`, которое содержало самописный календарь.
После перехода на django-scheduler, `calendar_app` был переименован в `scheduling`
и переориентирован на интеграцию, патчи и расширения для django-scheduler.
**Дата миграции:** 10 марта 2026 г.