Some checks failed
CI/CD Pipeline / Run Tests (push) Failing after 45s
CI/CD Pipeline / Code Quality Checks (push) Failing after 48s
CI/CD Pipeline / Build Docker Images (push) Has been skipped
CI/CD Pipeline / Push to Gitea Registry (push) Has been skipped
CI/CD Pipeline / Deploy to Server (push) Has been skipped
83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
"""
|
|
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",
|
|
)
|
|
)
|
|
)
|