diff --git a/apps/third/dahua.py b/apps/third/dahua.py index 8cb50973..026d90cf 100644 --- a/apps/third/dahua.py +++ b/apps/third/dahua.py @@ -8,6 +8,7 @@ import uuid import requests from django.conf import settings from rest_framework.exceptions import APIException, ParseError +from requests.exceptions import RequestException from apps.third.errors import DH_REQUEST_ERROR from apps.third.models import Tlog @@ -84,7 +85,7 @@ class DhClient: return 'fail', err_detail # self.handle_log(result='success', response=ret) # 成功的日志就不记录了 return 'success', ret['data'] if 'data' in ret else None - except Exception: + except RequestException: self.handle_log(result='error', response=None) if raise_exception: raise APIException(**DH_REQUEST_ERROR) diff --git a/apps/third/speaker.py b/apps/third/speaker.py index eb8f4f3b..fac4c075 100644 --- a/apps/third/speaker.py +++ b/apps/third/speaker.py @@ -7,6 +7,7 @@ import logging import requests from rest_framework.exceptions import APIException, ParseError from django.conf import settings +from requests.exceptions import RequestException from apps.third.errors import SP_REQUEST_ERROR from apps.third.models import Tlog @@ -61,27 +62,29 @@ class SpClient: files = {'file': open(settings.BASE_DIR + file_path_rela, 'rb')} if params: url = url.format(**params) - r = getattr(requests, method)('{}{}'.format(settings.SP_BASE_URL, url), - headers=self.headers, params=params, json=json, - timeout=timeout, files=files, verify=False) - # if settings.DEBUG: - # print_roundtrip(r) - ret = r.text - if 300 > r.status_code >= 200: - ret = r.json() - if 'code' in ret and ret['code'] not in ['0', '100', '00000', '1000', 0, 100, 1000]: - detail = '音响错误:{}'.format(str(ret.get('msg', ''))) - err_detail = dict(detail=detail, code='sp_'+str(ret['code'])) - self.handle_log(result='fail', response=ret) - if raise_exception: - raise ParseError(**err_detail) - return 'fail', err_detail - # self.handle_log(result='success', response=ret) - return 'success', ret - self.handle_log(result='error', response=ret) - if raise_exception: - raise APIException(**SP_REQUEST_ERROR) - return 'error', SP_REQUEST_ERROR + try: + r = getattr(requests, method)('{}{}'.format(settings.SP_BASE_URL, url), + headers=self.headers, params=params, json=json, + timeout=timeout, files=files, verify=False) + # if settings.DEBUG: + # print_roundtrip(r) + ret = r.text + if 300 > r.status_code >= 200: + ret = r.json() + if 'code' in ret and ret['code'] not in ['0', '100', '00000', '1000', 0, 100, 1000]: + detail = '音响错误:{}'.format(str(ret.get('msg', ''))) + err_detail = dict(detail=detail, code='sp_'+str(ret['code'])) + self.handle_log(result='fail', response=ret) + if raise_exception: + raise ParseError(**err_detail) + return 'fail', err_detail + # self.handle_log(result='success', response=ret) + return 'success', ret + except RequestException: + self.handle_log(result='error', response=ret) + if raise_exception: + raise APIException(**SP_REQUEST_ERROR) + return 'error', SP_REQUEST_ERROR def speak(self, path: str, sns: list, v_num: int): """播放报警声 diff --git a/apps/third/xunxi.py b/apps/third/xunxi.py index 11147d4a..20679611 100644 --- a/apps/third/xunxi.py +++ b/apps/third/xunxi.py @@ -6,6 +6,7 @@ import uuid import requests from django.conf import settings from rest_framework.exceptions import APIException, ParseError +from requests.exceptions import RequestException from apps.third.errors import XX_REQUEST_ERROR from apps.third.models import Tlog @@ -72,7 +73,7 @@ class XxClient: raise ParseError(**err_detail) return 'fail', err_detail return 'success', ret['data'] - except Exception: + except RequestException: self.handle_log(result='error', response=None) if raise_exception: raise APIException(**XX_REQUEST_ERROR) 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',