59 lines
2.5 KiB
Python
59 lines
2.5 KiB
Python
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": "Отклонена"})
|