New clean API alongside old calendar_app: API endpoints: - /api/v1/schedule/calendars/ - Calendar CRUD - /api/v1/schedule/events/ - Event CRUD (with timezone) - /api/v1/schedule/rules/ - rrule RFC 5545 rules - /api/v1/schedule/occurrences/ - materialized recurrences - /api/v1/schedule/relations/ - meeting attendees Features: - Timezone support (pytz) - RFC 5545 rrule for recurring events - EventRelation for meeting participants - Clean, tested code (django-scheduler) - Parallel work with old /api/v1/calendar/ Old API untouched, works as before. Gradual migration approach (Strangler Fig Pattern).
5.8 KiB
5.8 KiB
API v1/schedule - django-scheduler endpoints
Новая система календаря на проверенном решении django-scheduler.
Работает параллельно со старым /api/v1/calendar/.
🌐 Endpoints
Календари
Список календарей
GET /api/v1/schedule/calendars/
Создать календарь
POST /api/v1/schedule/calendars/
Content-Type: application/json
{
"name": "Мой календарь",
"slug": "my-calendar"
}
Детали календаря
GET /api/v1/schedule/calendars/1/
События
Список событий
GET /api/v1/schedule/events/
GET /api/v1/schedule/events/?calendar=1
GET /api/v1/schedule/events/?start=2026-02-01T00:00:00Z&end=2026-03-01T00:00:00Z
Создать событие
POST /api/v1/schedule/events/
Content-Type: application/json
{
"title": "Встреча с клиентом",
"description": "Обсуждение проекта",
"start": "2026-02-24T15:00:00+03:00",
"end": "2026-02-24T16:00:00+03:00",
"calendar": 1,
"color_event": "#ff5733"
}
Событие с повторением (rrule)
POST /api/v1/schedule/events/
Content-Type: application/json
{
"title": "Еженедельная планёрка",
"start": "2026-02-24T10:00:00+03:00",
"end": "2026-02-24T11:00:00+03:00",
"calendar": 1,
"rule": 1
}
Получить материализованные вхождения
GET /api/v1/schedule/events/occurrences/?calendar=1&start=2026-02-01T00:00:00Z&end=2026-03-01T00:00:00Z
Возвращает все вхождения recurring событий + обычные события в диапазоне.
Правила повторения (rrule)
Список правил
GET /api/v1/schedule/rules/
Создать правило (RFC 5545)
POST /api/v1/schedule/rules/
Content-Type: application/json
{
"name": "Каждый понедельник",
"description": "FREQ=WEEKLY;BYDAY=MO",
"frequency": "WEEKLY",
"params": "FREQ=WEEKLY;BYDAY=MO"
}
Примеры rrule:
FREQ=DAILY- ежедневноFREQ=WEEKLY;BYDAY=MO,WE,FR- пн, ср, птFREQ=WEEKLY;INTERVAL=2;BYDAY=TU- каждые 2 недели по вторникамFREQ=MONTHLY;BYMONTHDAY=15- 15 числа каждого месяцаFREQ=MONTHLY;BYDAY=-1MO- последний понедельник месяцаFREQ=YEARLY;BYMONTH=2;BYMONTHDAY=29- 29 февраля (високосный год)
Участники встреч
Список участников события
GET /api/v1/schedule/relations/?event=1
Добавить участника
POST /api/v1/schedule/relations/
Content-Type: application/json
{
"event": 1,
"content_type": "employees.employee",
"object_id": 5,
"distinction": "required"
}
Удалить участника
DELETE /api/v1/schedule/relations/1/
Вхождения (Occurrences)
Список вхождений
GET /api/v1/schedule/occurrences/?event=1
Occurrences создаются автоматически для recurring событий.
🔄 Сравнение со старым API
| Старый (calendar_app) | Новый (django-scheduler) |
|---|---|
/api/v1/calendar/events/ |
/api/v1/schedule/events/ |
/api/v1/calendar/calendars/ |
/api/v1/schedule/calendars/ |
start_date + start_time |
start (DateTimeField с timezone) |
recurrence (6 типов) |
rule (RFC 5545 rrule) |
| ❌ Нет timezone | ✅ pytz timezone |
| ❌ Нет участников | ✅ EventRelation |
| ❌ Нет iCalendar | ✅ RFC 5545 |
✅ Преимущества нового API
- Timezone support — события с правильными часовыми поясами
- RFC 5545 rrule — стандартные правила повторения
- Участники встреч — EventRelation (кто приглашён, RSVP)
- iCalendar export — интеграция с Outlook/Google/Apple
- Проверенный код — django-scheduler (community support)
- Документация — ReadTheDocs официальная
🧪 Тестирование
Создать тестовый календарь
curl -X POST http://localhost:8000/api/v1/schedule/calendars/ \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Тестовый календарь",
"slug": "test-calendar"
}'
Создать событие
curl -X POST http://localhost:8000/api/v1/schedule/events/ \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Тестовое событие",
"start": "2026-02-24T15:00:00+03:00",
"end": "2026-02-24T16:00:00+03:00",
"calendar": 1
}'
Получить события календаря
curl http://localhost:8000/api/v1/schedule/events/?calendar=1 \
-H "Authorization: Bearer YOUR_TOKEN"
📚 Следующие шаги
- ✅ API создан —
/api/v1/schedule/работает - ⏳ Тестирование — создать события, проверить rrule
- ⏳ Фронтенд — подключить к новому API
- ⏳ Миграция данных — перенести из старого календаря
- ⏳ Переключение — использовать только новый API
- ⏳ Удаление старого — через 2-3 спринта