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