106 lines
3.4 KiB
Python
106 lines
3.4 KiB
Python
# backend/api/v1/schedule/views.py
|
||
"""
|
||
ViewSets для django-scheduler (чистый, проверенный код).
|
||
Параллельно работают со старым calendar_app.
|
||
"""
|
||
|
||
from rest_framework import viewsets
|
||
from rest_framework.permissions import IsAuthenticated
|
||
from rest_framework.renderers import JSONRenderer
|
||
from schedule.models import (
|
||
Event,
|
||
EventRelation,
|
||
Occurrence,
|
||
Rule,
|
||
)
|
||
|
||
from scheduling.services import (
|
||
filter_events_for_user,
|
||
)
|
||
|
||
from ..permissions import (
|
||
CanManageEventRelation,
|
||
CanManageScheduleRule,
|
||
)
|
||
from ..serializers import (
|
||
EventRelationSerializer,
|
||
OccurrenceSerializer,
|
||
RuleSerializer,
|
||
)
|
||
from .common import _admin_requested_all_scope
|
||
|
||
|
||
class ScheduleRuleViewSet(viewsets.ModelViewSet):
|
||
"""CRUD для django-scheduler Rule (rrule RFC 5545).
|
||
|
||
Endpoints:
|
||
- GET /api/v1/schedule/rules/ - список правил
|
||
- POST /api/v1/schedule/rules/ - создать правило
|
||
- GET /api/v1/schedule/rules/{id}/ - детали
|
||
"""
|
||
|
||
queryset = Rule.objects.order_by("name", "id")
|
||
serializer_class = RuleSerializer
|
||
permission_classes = [CanManageScheduleRule]
|
||
renderer_classes = [JSONRenderer]
|
||
|
||
|
||
class ScheduleOccurrenceViewSet(viewsets.ReadOnlyModelViewSet):
|
||
"""Просмотр Occurrence (материализованных вхождений).
|
||
|
||
Read-only ViewSet (Occurrence создаются автоматически).
|
||
"""
|
||
|
||
queryset = Occurrence.objects.select_related("event", "event__calendar")
|
||
serializer_class = OccurrenceSerializer
|
||
permission_classes = [IsAuthenticated]
|
||
renderer_classes = [JSONRenderer]
|
||
|
||
def get_queryset(self):
|
||
"""Фильтрация по событию."""
|
||
qs = super().get_queryset()
|
||
visible_event_ids = filter_events_for_user(
|
||
Event.objects.all(),
|
||
self.request.user,
|
||
allow_admin_all=_admin_requested_all_scope(self.request),
|
||
).values_list("id", flat=True)
|
||
qs = qs.filter(event_id__in=visible_event_ids)
|
||
|
||
event_id = self.request.query_params.get("event")
|
||
if event_id:
|
||
qs = qs.filter(event_id=event_id)
|
||
|
||
return qs.order_by("start")
|
||
|
||
|
||
class ScheduleEventRelationViewSet(viewsets.ModelViewSet):
|
||
"""CRUD для EventRelation (участники встреч).
|
||
|
||
Endpoints:
|
||
- GET /api/v1/schedule/relations/ - список участников
|
||
- GET /api/v1/schedule/relations/?event=1 - участники события
|
||
- POST /api/v1/schedule/relations/ - добавить участника
|
||
- DELETE /api/v1/schedule/relations/{id}/ - удалить участника
|
||
"""
|
||
|
||
queryset = EventRelation.objects.select_related("event", "content_type")
|
||
serializer_class = EventRelationSerializer
|
||
permission_classes = [CanManageEventRelation]
|
||
renderer_classes = [JSONRenderer]
|
||
|
||
def get_queryset(self):
|
||
"""Фильтрация по событию."""
|
||
qs = super().get_queryset()
|
||
visible_event_ids = filter_events_for_user(
|
||
Event.objects.all(),
|
||
self.request.user,
|
||
allow_admin_all=_admin_requested_all_scope(self.request),
|
||
).values_list("id", flat=True)
|
||
qs = qs.filter(event_id__in=visible_event_ids)
|
||
|
||
event_id = self.request.query_params.get("event")
|
||
if event_id:
|
||
qs = qs.filter(event_id=event_id)
|
||
|
||
return qs.order_by("id")
|