backend/inventory/views_transfer.py

59 lines
2.5 KiB
Python
Raw Normal View History

2025-03-23 21:24:08 +10:00
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": "Отклонена"})