From 46a1fcf50a746125254f7aa630f317dff2c0a4a3 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 22 Dec 2022 16:58:31 +0800 Subject: [PATCH] =?UTF-8?q?workflow=20clone=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wf/serializers.py | 6 +++++ apps/wf/views.py | 54 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/apps/wf/serializers.py b/apps/wf/serializers.py index f2221234..58c5cfbc 100755 --- a/apps/wf/serializers.py +++ b/apps/wf/serializers.py @@ -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 diff --git a/apps/wf/views.py b/apps/wf/views.py index b83ebe2c..8d2ff8dc 100755 --- a/apps/wf/views.py +++ b/apps/wf/views.py @@ -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',