""" API ViewSets для организаций. Содержит: - OrganizationViewSet - CRUD для организаций """ from apps.core.viewsets import ReadOnlyViewSet from apps.organization.models import Organization from apps.organization.serializers import ( OrganizationListSerializer, OrganizationSerializer, ) from apps.registers.models import RegistryMembershipPeriod from django.db.models import Prefetch from django_filters import rest_framework as filters from rest_framework.permissions import IsAuthenticated class OrganizationFilter(filters.FilterSet): """Фильтры для организаций.""" name = filters.CharFilter(lookup_expr="icontains") inn = filters.CharFilter(lookup_expr="exact") ogrn = filters.CharFilter(lookup_expr="exact") registry = filters.UUIDFilter(method="filter_registry") @staticmethod def filter_registry(queryset, _name, value): return queryset.filter( membership_periods__registry_id=value, membership_periods__ended_at__isnull=True, ).distinct() class Meta: model = Organization fields = ["name", "inn", "ogrn", "registry"] class OrganizationViewSet(ReadOnlyViewSet[Organization]): """ ViewSet для просмотра организаций. Только чтение - организации создаются автоматически при загрузке форм. Эндпоинты: GET /organizations/ - список организаций GET /organizations/{id}/ - детали организации """ queryset = Organization.objects.all() serializer_class = OrganizationSerializer permission_classes = [IsAuthenticated] filterset_class = OrganizationFilter search_fields = ["name", "inn", "ogrn"] ordering_fields = ["name", "inn", "created_at"] ordering = ["name"] serializer_classes = { "list": OrganizationListSerializer, } def get_serializer_class(self): """Возвращает serializer в зависимости от action.""" if self.action in self.serializer_classes: return self.serializer_classes[self.action] return super().get_serializer_class() def get_queryset(self): return ( super() .get_queryset() .prefetch_related( Prefetch( "membership_periods", queryset=RegistryMembershipPeriod.objects.filter( ended_at__isnull=True ).select_related("registry"), to_attr="active_membership_periods_prefetched", ) ) )