forked from erp-dev/erp
63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
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})
|
||
|
||
|