from rest_framework import viewsets, status from rest_framework.response import Response from rest_framework.decorators import action from django.contrib.auth.models import User from .models import StickerTransferRequest, StickerTransferItem, Sticker, StickerMovement from .serializers import StickerTransferRequestSerializer, StickerTransferItemSerializer from django.shortcuts import get_object_or_404 from django.utils import timezone class StickerTransferRequestViewSet(viewsets.ModelViewSet): queryset = StickerTransferRequest.objects.all().select_related('from_user', 'to_user').prefetch_related('items__sticker') serializer_class = StickerTransferRequestSerializer def get_queryset(self): user = self.request.user return StickerTransferRequest.objects.filter(from_user=user) | StickerTransferRequest.objects.filter(to_user=user) def perform_create(self, serializer): serializer.save(from_user=self.request.user) @action(detail=True, methods=['post']) def accept(self, request, pk=None): transfer = get_object_or_404(StickerTransferRequest, pk=pk) if transfer.to_user != request.user: return Response({"error": "Нет прав для принятия этой передачи."}, status=status.HTTP_403_FORBIDDEN) if transfer.status != 'pending': return Response({"error": "Передача уже обработана."}, status=status.HTTP_400_BAD_REQUEST) # Перемещение стикеров for item in transfer.items.all(): StickerMovement.objects.create( sticker=item.sticker, from_location='склад', to_location='цех', quantity=item.quantity ) item.sticker.location = 'цех' item.sticker.save() transfer.status = 'accepted' transfer.save() return Response({"status": "Принята"}) @action(detail=True, methods=['post']) def decline(self, request, pk=None): transfer = get_object_or_404(StickerTransferRequest, pk=pk) if transfer.to_user != request.user: return Response({"error": "Нет прав для отклонения этой передачи."}, status=status.HTTP_403_FORBIDDEN) if transfer.status != 'pending': return Response({"error": "Передача уже обработана."}, status=status.HTTP_400_BAD_REQUEST) transfer.status = 'declined' transfer.save() return Response({"status": "Отклонена"})