from rest_framework import viewsets from rest_framework.exceptions import ValidationError from .models import Contact, Relation, NetworkMap, NetworkMapMembership, NetworkMapType from .serializers import ( ContactSerializer, RelationSerializer, NetworkMapSerializer, NetworkMapMembershipSerializer, NetworkMapTypeSerializer, ) class ContactViewSet(viewsets.ModelViewSet): queryset = Contact.objects.all() serializer_class = ContactSerializer def get_queryset(self): qs = super().get_queryset() q = self.request.query_params.get('search', '') if q: qs = qs.filter(name__icontains=q) return qs class RelationViewSet(viewsets.ModelViewSet): queryset = Relation.objects.select_related('source', 'target').all() serializer_class = RelationSerializer class NetworkMapViewSet(viewsets.ModelViewSet): queryset = NetworkMap.objects.select_related('map_type').all() serializer_class = NetworkMapSerializer class NetworkMapTypeViewSet(viewsets.ModelViewSet): queryset = NetworkMapType.objects.all() serializer_class = NetworkMapTypeSerializer def perform_destroy(self, instance): if instance.is_default: raise ValidationError({'detail': 'Нельзя удалить тип карты по умолчанию.'}) if instance.maps.exists(): raise ValidationError({'detail': 'Тип используется картами сети. Сначала смените тип у карт.'}) instance.delete() class NetworkMapMembershipViewSet(viewsets.ModelViewSet): serializer_class = NetworkMapMembershipSerializer def get_queryset(self): map_id = self.kwargs.get('map_pk') return NetworkMapMembership.objects.filter( map_id=map_id ).select_related('contact', 'map') def perform_create(self, serializer): map_id = self.kwargs.get('map_pk') serializer.save(map_id=map_id)