from rest_framework.response import Response from rest_framework import serializers from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin from apps.wf.serializers import CustomFieldSerializer, StateSerializer, TicketCreateSerializer, TicketSerializer, TransitionSerializer, WorkflowSerializer from django.shortcuts import render from rest_framework.viewsets import GenericViewSet, ModelViewSet from rest_framework.decorators import action, api_view from apps.wf.models import CustomField, Ticket, Workflow, State, Transition from apps.system.mixins import CreateUpdateCustomMixin, CreateUpdateModelAMixin, OptimizationMixin from apps.wf.services import WfService from rest_framework.exceptions import APIException # Create your views here. class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet): perms_map = {'get': '*', 'post': 'workflow_create', 'put': 'workflow_update', 'delete': 'workflow_delete'} queryset = Workflow.objects.all() serializer_class = WorkflowSerializer search_fields = ['name', 'description'] filterset_fields = [] ordering_fields = ['create_time'] ordering = ['-create_time'] @action(methods=['get'], detail=True, perms_map={'get':'workflow_update'}, pagination_class=None, serializer_class=StateSerializer) def states(self, request, pk=None): """ 工作流下的状态节点 """ wf = self.get_object() serializer = self.serializer_class(instance=WfService.get_worlflow_states(wf), many=True) return Response(serializer.data) @action(methods=['get'], detail=True, perms_map={'get':'workflow_update'}, pagination_class=None, serializer_class=TransitionSerializer) def transitions(self, request, pk=None): """ 工作流下的流转规则 """ wf = self.get_object() serializer = self.serializer_class(instance=WfService.get_workflow_transitions(wf), many=True) return Response(serializer.data) @action(methods=['get'], detail=True, perms_map={'get':'workflow_update'}, pagination_class=None, serializer_class=CustomFieldSerializer) def customfields(self, request, pk=None): """ 工作流下的自定义字段 """ wf = self.get_object() serializer = self.serializer_class(instance=CustomField.objects.filter(workflow=wf), many=True) return Response(serializer.data) @action(methods=['get'], detail=True, perms_map={'get':'workflow_init'}) 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['transitions'] = TransitionSerializer(instance=transitions, many=True).data field_list = CustomFieldSerializer(instance=WfService.get_workflow_custom_fields(wf), many=True).data ret['field_list'] = field_list return Response(ret) class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet): perms_map = {'*':'*'} queryset = State.objects.all() serializer_class = StateSerializer search_fields = ['name'] filterset_fields = ['workflow'] ordering = ['sort'] class TransitionViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet): perms_map = {'*':'*'} queryset = Transition.objects.all() serializer_class = TransitionSerializer search_fields = ['name'] filterset_fields = ['workflow'] ordering = ['id'] class CustomFieldViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet): perms_map = {'*':'*'} queryset = CustomField.objects.all() serializer_class = CustomFieldSerializer search_fields = ['field_name'] filterset_fields = ['workflow', 'field_type'] ordering = ['sort'] class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin, ListModelMixin, RetrieveModelMixin, GenericViewSet): perms_map = {'*':'*'} queryset = Ticket.objects.all() serializer_class = TicketSerializer search_fields = ['title'] filterset_fields = ['workflow', 'state'] ordering = ['-create_time'] def get_serializer_class(self): if self.action == 'create': return TicketCreateSerializer return super().get_serializer_class() def create(self, request, *args, **kwargs): """ 新建工单 """ serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) start_state = WfService.get_workflow_start_state(serializer.data['workflow']) transition = Transition.objects.get(pk=serializer.data['transition']) ticket_data = serializer.data['ticket_data'] if transition.field_require_check: for key, value in start_state.state_fields.items(): #校验必填项 if value == 2: if key not in ticket_data or not ticket_data[key]: raise APIException('字段{}必填'.format(key)) ticket = serializer.save() next_state = WfService.get_next_state_id_by_transition_and_ticket_info(ticket=ticket, transition=transition) participant_info = WfService.get_ticket_state_participant_info(state=next_state, ticket=ticket, ticket_data=ticket.ticket_data) destination_participant_type = participant_info.get('destination_participant_type', 0) destination_participant = participant_info.get('destination_participant', '') multi_all_person = participant_info.get('multi_all_person', '{}') # 多人需要全部处理情况 sn = WfService.get_ticket_sn(ticket.workflow) if next_state.type == State.STATE_TYPE_END: act_state = Ticket.TICKET_ACT_STATE_FINISH elif next_state.type == State.STATE_TYPE_START: pass @action(methods=['get'], detail=True, perms_map={'get':'*'}) def flowsteps(self, request, pk=None): """ 工单流转step, 用于显示当前状态的step图(线性结构) """ ticket = self.get_object() steps = WfService.get_ticket_steps(ticket) return Response(StateSerializer(instance=steps, many=True).data) @action(methods=['get'], detail=True, perms_map={'get':'*'}) def transitions(self, request, pk=None): """ 获取工单可执行的操作 """ ticket = self.get_object() transitions = WfService.get_ticket_transitions(ticket) return Response(TransitionSerializer(instance=transitions, many=True).data)