106 lines
3.4 KiB
Python
Raw Permalink 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.

# 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")