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