1
0
forked from erp-dev/erp
Files
erpnew/api_v1/views/print_count.py

58 lines
1.9 KiB
Python

from django.db import transaction
from django.db.models import F
from rest_framework import permissions, status
from rest_framework.response import Response
from rest_framework.views import APIView
from api_v1.serializers import PrintCountDeltaSerializer
from api_v1.enums import PrintCountObjectType
from printing import models as printing_models
class PrintCountDeltaView(APIView):
"""通用打印次数递增接口"""
permission_classes = [permissions.IsAuthenticated]
OBJECT_MODEL_MAP = {
PrintCountObjectType.PRINTING_ORDER: printing_models.PrintingOrder,
PrintCountObjectType.PLATE_ORDER: printing_models.PlateOrder,
}
def post(self, request, *args, **kwargs):
serializer = PrintCountDeltaSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.validated_data
model = self.OBJECT_MODEL_MAP.get(data['object_type'])
if model is None:
return Response(
{'detail': '不支持的对象类型'},
status=status.HTTP_400_BAD_REQUEST,
)
with transaction.atomic():
updated = model.objects.filter(id=data['object_id']).update(
print_count=F('print_count') + data['delta']
)
if not updated:
return Response(
{'detail': '指定对象不存在'},
status=status.HTTP_404_NOT_FOUND,
)
fresh_value = model.objects.only('print_count').get(id=data['object_id']).print_count
return Response(
{
'object_type': data['object_type'],
'object_id': data['object_id'],
'delta': data['delta'],
'print_count': fresh_value,
},
status=status.HTTP_200_OK,
)
adjust_print_count = PrintCountDeltaView.as_view()