from rest_framework import viewsets from rest_framework.exceptions import PermissionDenied, ValidationError from core.access import use_jwt_auth from core.drf_mixins import JwtAuthMixin from .mixins import OwnerScopedMixin from .models import Contact, Relation, NetworkMap, NetworkMapMembership, NetworkMapType from .serializers import ( ContactSerializer, RelationSerializer, NetworkMapSerializer, NetworkMapMembershipSerializer, NetworkMapTypeSerializer, ) class ContactViewSet(JwtAuthMixin, OwnerScopedMixin, 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(JwtAuthMixin, OwnerScopedMixin, viewsets.ModelViewSet): queryset = Relation.objects.select_related('source', 'target').all() serializer_class = RelationSerializer class NetworkMapViewSet(JwtAuthMixin, OwnerScopedMixin, viewsets.ModelViewSet): queryset = NetworkMap.objects.select_related('map_type').all() serializer_class = NetworkMapSerializer class NetworkMapTypeViewSet(JwtAuthMixin, OwnerScopedMixin, 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(JwtAuthMixin, viewsets.ModelViewSet): serializer_class = NetworkMapMembershipSerializer def get_queryset(self): map_id = self.kwargs.get('map_pk') qs = NetworkMapMembership.objects.filter( map_id=map_id ).select_related('contact', 'map') if use_jwt_auth(): user = self.request.user if user and user.is_authenticated: return qs.filter(map__owner=user, contact__owner=user) return qs.none() return qs def perform_create(self, serializer): map_id = self.kwargs.get('map_pk') if use_jwt_auth(): user = self.request.user if not user or not user.is_authenticated: raise PermissionDenied() network_map = NetworkMap.objects.filter(pk=map_id, owner=user).first() if not network_map: raise PermissionDenied() contact = serializer.validated_data.get('contact') if contact.owner_id != user.id: raise ValidationError({'contact': 'Контакт не принадлежит текущему пользователю.'}) serializer.save(map_id=map_id) def perform_update(self, serializer): if use_jwt_auth(): user = self.request.user contact = serializer.validated_data.get('contact', serializer.instance.contact) if contact.owner_id != user.id: raise ValidationError({'contact': 'Контакт не принадлежит текущему пользователю.'}) serializer.save()