workflow clone 接口
This commit is contained in:
parent
477bde5af8
commit
46a1fcf50a
|
@ -12,6 +12,12 @@ class WorkflowSerializer(CustomModelSerializer):
|
|||
fields = '__all__'
|
||||
|
||||
|
||||
class WorkflowCloneSerializer(CustomModelSerializer):
|
||||
class Meta:
|
||||
model = Workflow
|
||||
fields = ['name', 'key']
|
||||
|
||||
|
||||
class StateSerializer(CustomModelSerializer):
|
||||
class Meta:
|
||||
model = State
|
||||
|
|
|
@ -12,7 +12,7 @@ from apps.wf.serializers import CustomFieldCreateUpdateSerializer, CustomFieldSe
|
|||
TicketCreateSerializer, TicketDeliverSerializer, TicketDestorySerializer, TicketFlowSerializer, \
|
||||
TicketHandleSerializer, TicketRetreatSerializer, \
|
||||
TicketSerializer, TransitionSerializer, WorkflowSerializer, \
|
||||
TicketListSerializer, TicketDetailSerializer
|
||||
TicketListSerializer, TicketDetailSerializer, WorkflowCloneSerializer
|
||||
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
||||
from rest_framework.decorators import action
|
||||
from apps.wf.models import CustomField, Ticket, Workflow, State, Transition, TicketFlow
|
||||
|
@ -22,6 +22,7 @@ from rest_framework.exceptions import ParseError, NotFound
|
|||
from rest_framework import status
|
||||
from django.db.models import Count
|
||||
from rest_framework.serializers import Serializer
|
||||
from apps.utils.snowflake import idWorker
|
||||
|
||||
from apps.wf.tasks import run_task
|
||||
|
||||
|
@ -118,14 +119,59 @@ class WorkflowViewSet(CustomModelViewSet):
|
|||
return Response(ret)
|
||||
|
||||
@action(methods=['post'], detail=True, perms_map={'post': 'workflow.clone'},
|
||||
pagination_class=None, serializer_class=Serializer)
|
||||
pagination_class=None, serializer_class=WorkflowCloneSerializer)
|
||||
@transaction.atomic
|
||||
def clone(self, request, pk=None):
|
||||
"""工作流复制
|
||||
|
||||
工作流复制
|
||||
"""
|
||||
pass
|
||||
|
||||
wf = self.get_object()
|
||||
sr = WorkflowCloneSerializer(data=request.data)
|
||||
sr.is_valid(raise_exception=True)
|
||||
vdata = sr.validated_data
|
||||
wf_new = Workflow()
|
||||
for f in Workflow._meta.fields:
|
||||
if f.name not in ['id', 'create_by', 'update_by', 'key', 'name', 'create_time', 'update_time']:
|
||||
setattr(wf_new, f.name, getattr(wf, f.name, None))
|
||||
wf_new.id = idWorker.get_id()
|
||||
wf_new.key = vdata['key']
|
||||
wf_new.name = vdata['name']
|
||||
wf_new.create_by = request.user
|
||||
wf_new.save()
|
||||
stas_dict = {}
|
||||
for s in State.objects.filter(workflow=wf):
|
||||
sta = State()
|
||||
sta.id = idWorker.get_id()
|
||||
sta.workflow = wf_new
|
||||
for f in State._meta.fields:
|
||||
if f.name not in ['workflow', 'create_time', 'update_time', 'id']:
|
||||
setattr(sta, f.name, getattr(s, f.name))
|
||||
sta.save()
|
||||
stas_dict[s.id] = sta # 保存一下, 后续备用
|
||||
for c in CustomField.objects.filter(workflow=wf):
|
||||
cf = CustomField()
|
||||
cf.id = idWorker.get_id()
|
||||
cf.workflow = wf_new
|
||||
for f in CustomField._meta.fields:
|
||||
if f.name not in ['workflow', 'create_time', 'update_time', 'id']:
|
||||
setattr(sta, f.name, getattr(s, f.name))
|
||||
cf.save()
|
||||
for t in Transition.objects.filter(workflow=wf):
|
||||
tr = Transition()
|
||||
tr.id = idWorker.get_id()
|
||||
tr.workflow = wf_new
|
||||
for f in Transition._meta.fields:
|
||||
if f.name not in ['workflow', 'create_time', 'update_time', 'id']:
|
||||
setattr(tr, f.name, getattr(t, f.name))
|
||||
tr.source_state = stas_dict[t.source_state.id]
|
||||
tr.destination_state = stas_dict[t.destination_state.id]
|
||||
ce = tr.condition_expression
|
||||
for i in ce:
|
||||
i['target_state'] = stas_dict[i['target_state']].id
|
||||
tr.condition_expression = ce
|
||||
tr.save()
|
||||
return Response()
|
||||
|
||||
class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, CustomGenericViewSet):
|
||||
perms_map = {'get': '*', 'post': 'workflow.update',
|
||||
|
|
Loading…
Reference in New Issue