1
0
forked from erp-dev/erp
Files
erpnew/api_v2/views/stateflow.py
2025-12-16 08:42:53 +08:00

63 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from rest_framework import serializers, status, permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from stateflow import models as stateflow_models
from stateflow import services as stateflow_services
class BusinessObjectCloneRequestSerializer(serializers.Serializer):
business_object_id = serializers.IntegerField(min_value=1)
# 调用方必须显式传入 content_type 与 object_id
# - content_type仅用于校验与源对象一致不做额外校验
# - object_id克隆后的新业务对象 ID必须与源对象不同
content_type = serializers.IntegerField(min_value=1, allow_null=True)
object_id = serializers.IntegerField(min_value=1, allow_null=True)
class BusinessObjectCloneView(APIView):
"""
克隆 BusinessObject含所有状态流转记录与工艺参数记录
POST /api/v2/stateflow/business-objects/clone/
请求体:
{
"business_object_id": 123,
"content_type": 9,
"object_id": 456
}
返回:
{
"business_object_id": 456
}
"""
permission_classes = [permissions.IsAuthenticated]
def post(self, request):
srz = BusinessObjectCloneRequestSerializer(data=request.data)
srz.is_valid(raise_exception=True)
bo_id = srz.validated_data['business_object_id']
expected_content_type_id = srz.validated_data.get('content_type')
new_object_id = srz.validated_data.get('object_id')
try:
bo = stateflow_models.BusinessObject.objects.get(id=bo_id)
except stateflow_models.BusinessObject.DoesNotExist:
return Response({'detail': 'business_object 不存在'}, status=status.HTTP_404_NOT_FOUND)
try:
cloned = stateflow_services.clone_business_object(
bo,
new_object_id=new_object_id,
expected_content_type_id=expected_content_type_id,
)
except ValueError as e:
return Response({'detail': str(e)}, status=status.HTTP_400_BAD_REQUEST)
return Response({'business_object_id': cloned.id})