Scheduling App
Приложение для интеграции и расширения django-scheduler в EUSRR.
Содержимое
📦 Основные модули
patch.py- Исправление бага django-scheduler сbyweekdaynotifications/- Система уведомлений для событий календаря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 для объектных прав доступа:
# В коде
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:
INSTALLED_APPS = [
# ...
'schedule', # django-scheduler (обязательно перед scheduling)
'scheduling', # Интеграция и расширения
# ...
]
Использование
Отправка уведомлений вручную
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
class EventViewSet(viewsets.ModelViewSet):
def perform_create(self, serializer):
event = serializer.save()
# Передаем создателя для уведомлений
event._creator = self.request.user
event.save()
Зависимости
django-scheduler >= 0.12.0django-rules(опционально, для rules.py)django-notifications-hq(для системы уведомлений)
История
Это приложение заменило старое calendar_app, которое содержало самописный календарь.
После перехода на django-scheduler, calendar_app был переименован в scheduling
и переориентирован на интеграцию, патчи и расширения для django-scheduler.
Дата миграции: 10 марта 2026 г.