diff --git a/apps/wf/urls.py b/apps/wf/urls.py index e5851648..d4f128b9 100755 --- a/apps/wf/urls.py +++ b/apps/wf/urls.py @@ -1,5 +1,5 @@ from apps.wf.views import CustomFieldViewSet, FromCodeListView, StateViewSet, TicketFlowViewSet, \ - TicketViewSet, TransitionViewSet, WorkflowViewSet + TicketViewSet, TransitionViewSet, WorkflowKeyInitView, WorkflowViewSet from django.urls import path, include from rest_framework.routers import DefaultRouter @@ -16,4 +16,5 @@ router.register('ticketflow', TicketFlowViewSet, basename='wf_ticketflow') urlpatterns = [ path(API_BASE_URL + 'participant_from_code', FromCodeListView.as_view()), path(API_BASE_URL, include(router.urls)), + path(API_BASE_URL + 'workflow//init_key/', WorkflowKeyInitView.as_view()) ] diff --git a/apps/wf/views.py b/apps/wf/views.py index b56ad88b..b7dbcbbe 100755 --- a/apps/wf/views.py +++ b/apps/wf/views.py @@ -17,13 +17,14 @@ from rest_framework.decorators import action from apps.wf.models import CustomField, Ticket, Workflow, State, Transition, TicketFlow from apps.utils.mixins import CreateUpdateCustomMixin, CreateUpdateModelAMixin from apps.wf.services import WfService -from rest_framework.exceptions import ParseError +from rest_framework.exceptions import ParseError, NotFound from rest_framework import status from django.db.models import Count from .scripts import GetParticipants - # Create your views here. + + class FromCodeListView(APIView): def get(self, request, format=None): """ @@ -32,6 +33,34 @@ class FromCodeListView(APIView): return Response(GetParticipants.all_funcs) +class WorkflowKeyInitView(APIView): + perms_map = {'get': '*'} + + def get(self, request, key=None): + """ + 新建工单初始化-通过key + + 新建工单初始化 + """ + ret = {} + try: + wf = Workflow.objects.get(key=key) + except Exception: + raise NotFound('获取工作流失败') + start_state = WfService.get_workflow_start_state(wf) + transitions = WfService.get_state_transitions(start_state) + ret['workflow'] = wf.id + ret['transitions'] = TransitionSerializer(instance=transitions, many=True).data + field_list = CustomFieldSerializer(instance=WfService.get_workflow_custom_fields(wf), many=True).data + for i in field_list: + if i['field_key'] in start_state.state_fields: + i['field_attribute'] = start_state.state_fields[i['field_key']] + else: + i['field_attribute'] = State.STATE_FIELD_READONLY + ret['field_list'] = field_list + return Response(ret) + + class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet): perms_map = {'get': '*', 'post': 'workflow:create', 'put': 'workflow:update', 'delete': 'workflow:delete'} @@ -42,9 +71,6 @@ class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet): ordering_fields = ['create_time'] ordering = ['-create_time'] - def get_object(self): - return super().get_object() - @action(methods=['get'], detail=True, perms_map={'get': 'workflow:update'}, pagination_class=None, serializer_class=StateSerializer) def states(self, request, pk=None): @@ -76,16 +102,18 @@ class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet): workflow=wf, is_deleted=False).order_by('sort'), many=True) return Response(serializer.data) - @action(methods=['get'], detail=True, perms_map={'get': 'workflow:init'}) + @action(methods=['get'], detail=True, perms_map={'get': '*'}) def init(self, request, pk=None): """ + 新建工单初始化 + 新建工单初始化 """ ret = {} wf = self.get_object() start_state = WfService.get_workflow_start_state(wf) transitions = WfService.get_state_transitions(start_state) - ret['workflow'] = pk + ret['workflow'] = wf.id ret['transitions'] = TransitionSerializer(instance=transitions, many=True).data field_list = CustomFieldSerializer(instance=WfService.get_workflow_custom_fields(wf), many=True).data for i in field_list: @@ -96,6 +124,7 @@ class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet): ret['field_list'] = field_list return Response(ret) + class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet): perms_map = {'get': '*', 'post': 'workflow:update', 'put': 'workflow:update', 'delete': 'workflow:update'}