260 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			260 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| 
 | |
| 
 | |
| from rest_framework.views import APIView
 | |
| from rest_framework.permissions import IsAdminUser
 | |
| from rest_framework.response import Response
 | |
| from rest_framework.serializers import Serializer
 | |
| from rest_framework.decorators import action
 | |
| from apps.develop.serializers import CleanDataSerializer, GenerateVoiceSerializer, SendSmsSerializer, \
 | |
|     TestTaskSerializer, TestAlgoSerializer
 | |
| from apps.develop.tasks import backup_database, backup_media, reload_web_git, reload_server_git, reload_server_only
 | |
| from rest_framework.exceptions import APIException
 | |
| from apps.ecm.service import create_remind, notify_event
 | |
| from apps.system.tasks import show
 | |
| from apps.third.clients import dhClient
 | |
| from apps.utils.sms import send_sms
 | |
| from apps.utils.speech import generate_voice
 | |
| 
 | |
| from apps.utils.viewsets import CustomGenericViewSet
 | |
| from apps.utils.wx import wxClient
 | |
| # Create your views here.
 | |
| 
 | |
| 
 | |
| class ReloadServerGit(APIView):
 | |
|     authentication_classes = []
 | |
|     permission_classes = []
 | |
| 
 | |
|     def post(self, request):
 | |
|         """
 | |
|         拉取后端代码并重启服务
 | |
| 
 | |
|         拉取后端代码并重启服务
 | |
|         """
 | |
|         reload_server_git.delay()
 | |
|         return Response()
 | |
|         # if completed.returncode == 0:
 | |
|         #     return Response()
 | |
|         # else:
 | |
|         #     from server.settings import myLogger
 | |
|         #     myLogger.error(completed)
 | |
|         #     raise ParseError(completed.stderr)
 | |
| 
 | |
| 
 | |
| class ReloadClientGit(APIView):
 | |
|     authentication_classes = []
 | |
|     permission_classes = []
 | |
| 
 | |
|     def post(self, request):
 | |
|         """
 | |
|         拉取前端代码并打包
 | |
| 
 | |
|         拉取前端代码并打包
 | |
|         """
 | |
|         reload_web_git.delay()
 | |
|         return Response()
 | |
|         # completed = reload_web_git()
 | |
|         # if completed.returncode == 0:
 | |
|         #     return Response()
 | |
|         # else:
 | |
|         #     raise APIException(completed.stdout)
 | |
| 
 | |
| 
 | |
| class ReloadServerOnly(APIView):
 | |
|     permission_classes = [IsAdminUser]
 | |
| 
 | |
|     def post(self, request):
 | |
|         """
 | |
|         仅重启服务
 | |
| 
 | |
|         仅重启服务
 | |
|         """
 | |
|         completed = reload_server_only()
 | |
|         if completed.returncode == 0:
 | |
|             return Response()
 | |
|         else:
 | |
|             raise APIException(completed.stdout)
 | |
| 
 | |
| 
 | |
| class BackupDatabase(APIView):
 | |
|     permission_classes = [IsAdminUser]
 | |
| 
 | |
|     def post(self, request):
 | |
|         """
 | |
|         备份数据库到指定位置
 | |
| 
 | |
|         备份数据库到指定位置
 | |
|         """
 | |
|         err_str = backup_database()
 | |
|         if err_str:
 | |
|             raise APIException(err_str)
 | |
|         return Response()
 | |
| 
 | |
| 
 | |
| class BackupMedia(APIView):
 | |
|     permission_classes = [IsAdminUser]
 | |
| 
 | |
|     def post(self, request):
 | |
|         """
 | |
|         备份资源到指定位置
 | |
| 
 | |
|         备份资源到指定位置
 | |
|         """
 | |
|         err_str = backup_media()
 | |
|         if err_str:
 | |
|             raise APIException(err_str)
 | |
|         return Response()
 | |
| 
 | |
| 
 | |
| class TestViewSet(CustomGenericViewSet):
 | |
|     authentication_classes = ()
 | |
|     permission_classes = ()
 | |
| 
 | |
|     @action(methods=['post'], detail=False, serializer_class=SendSmsSerializer)
 | |
|     def send_sms(self, request, pk=None):
 | |
|         """发送短信测试
 | |
| 
 | |
|         发送短信测试
 | |
|         """
 | |
|         serializer = SendSmsSerializer(data=request.data)
 | |
|         serializer.is_valid(raise_exception=True)
 | |
|         vdata = serializer.validated_data
 | |
|         res = send_sms(**vdata)
 | |
|         return Response(res)
 | |
| 
 | |
|     @action(methods=['post'], detail=False, serializer_class=GenerateVoiceSerializer)
 | |
|     def generate_voice(self, request, pk=None):
 | |
|         """文字转语音测试
 | |
| 
 | |
|         文字转语音测试
 | |
|         """
 | |
|         serializer = GenerateVoiceSerializer(data=request.data)
 | |
|         serializer.is_valid(raise_exception=True)
 | |
|         vdata = serializer.validated_data
 | |
|         res = generate_voice(**vdata)
 | |
|         return Response(res)
 | |
| 
 | |
|     @action(methods=['post'], detail=False, serializer_class=TestTaskSerializer)
 | |
|     def task(self, request, pk=None):
 | |
|         """任务派发测试
 | |
| 
 | |
|         任务派发测试
 | |
|         """
 | |
|         serializer = TestTaskSerializer(data=request.data)
 | |
|         serializer.is_valid(raise_exception=True)
 | |
|         vdata = serializer.validated_data
 | |
|         ret = {}
 | |
|         task = show.delay(*vdata.get('args', []), **vdata.get('kwargs', {}))
 | |
|         ret['task_id'] = task.task_id
 | |
|         # from celery.app.control import Control
 | |
|         # from server.celery import app
 | |
|         # celery_control = Control(app=app)
 | |
|         # # 关闭作业监控任务
 | |
|         # res = celery_control.revoke(task.task_id, terminate=True)
 | |
|         return Response(ret)
 | |
| 
 | |
|     @action(methods=['post'], detail=False, serializer_class=Serializer)
 | |
|     def remind_event(self, request, pk=None):
 | |
|         """测试事件推送
 | |
| 
 | |
|         测试事件推送
 | |
|         """
 | |
|         from apps.ecm.models import Event
 | |
|         event = Event.objects.get(id='1562718567894487040')
 | |
|         create_remind(event, params={'area': '生产车间', 'employee': '访客石非凡', 'event': '未带安全帽'})
 | |
|         return Response()
 | |
| 
 | |
|     @action(methods=['post'], detail=False, serializer_class=TestAlgoSerializer)
 | |
|     def test_algo(self, request, pk=None):
 | |
|         """测试算法1
 | |
| 
 | |
|         测试算法1
 | |
|         """
 | |
|         from apps.ai.main import ai_analyse
 | |
|         face_img = dhClient.get_full_pic(path=request.data['face_img'])
 | |
|         global_img = dhClient.get_full_pic(path=request.data['global_img'])
 | |
|         ret = ai_analyse(codes=['helmet'],
 | |
|                          face_img=face_img,
 | |
|                          global_img=global_img)
 | |
|         return Response({'result':ret.keys(), 'face_img': face_img, 'global_img': global_img})
 | |
| 
 | |
|     @action(methods=['post'], detail=False, serializer_class=Serializer)
 | |
|     def test_algo_full(self, request, pk=None):
 | |
|         """测试算法2
 | |
| 
 | |
|         测试算法2
 | |
|         """
 | |
|         from apps.ecm.service import dispatch_dahua_event
 | |
|         data = {'id': 1661506561753, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$23', 'deviceCode': '1000038', 'alarmCode': '30789599-b82b-45ba-9d3d-2de2bc1f1d00', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_2088390_2096301.jpg', 'nodeType': 2, 'alarmDate': '1661506557', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_2088390_2096301.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': [
 | |
|             '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_2096301_2173187.jpg'], 'groupName': '全体人员', 'similarity': 96, 'sex': 1, 'cardType': 1, 'name': '石非凡', 'devPersonId': '46', 'id': '371324199803243658', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_1825520_2088390.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 23, 'szSerialUUID': '', 'channelName': '窑头平台进料口', 'beginTime': 1661506557, 'endTime': 1661506557, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 23, 'orgCode': '001001001', 'channelName': '窑头平台进料口', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None}
 | |
|         dispatch_dahua_event(data=data)
 | |
|         return Response()
 | |
| 
 | |
|     @action(methods=['post'], detail=False, serializer_class=Serializer)
 | |
|     def send_wx_msg(self, request, pk=None):
 | |
|         """微信模板消息发送测试
 | |
| 
 | |
|         微信模板消息发送测试
 | |
|         """
 | |
|         data = {
 | |
|             "touser": "ocAnm5vab6QGOnf2dqpuUZGJ0xyw",
 | |
|             "template_id": "wczl-hB_bs8CpxwO8_KZuogSTPFXqhBxf8C5HjKl2M4",
 | |
|             "url": "http://weixin.qq.com/download",
 | |
|             #    "miniprogram":{
 | |
|             #      "appid":"xiaochengxuappid12345",
 | |
|             #      "pagepath":"index?foo=bar"
 | |
|             #    },
 | |
|             "client_msg_id": "MSG_000001",
 | |
|             "data": {
 | |
|                 "first": {
 | |
|                    "value": "恭喜你购买成功!",
 | |
|                    "color": "#173177"
 | |
|                 },
 | |
|             }
 | |
|         }
 | |
|         # url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token'+wxClient.token
 | |
|         # print(url)
 | |
|         # rt = requests.post(url=url, json=data).text
 | |
|         res = wxClient.send_tem_msg(data=data)
 | |
|         return Response(res)
 | |
| 
 | |
|     @action(methods=['post'], detail=False, serializer_class=CleanDataSerializer)
 | |
|     def clean_data(self, request, pk=None):
 | |
|         """清空数据
 | |
| 
 | |
|         清空数据
 | |
|         """
 | |
|         datas = request.data['datas']
 | |
|         from apps.wf.models import Ticket
 | |
|         from apps.hrm.models import Employee
 | |
|         from apps.system.models import User, Dept
 | |
|         if 'visit' in datas:
 | |
|             # 访客
 | |
|             from apps.vm.models import Visit, Visitor
 | |
|             Visit.objects.get_queryset(all=True).delete(soft=False)
 | |
|             Visitor.objects.get_queryset(all=True).delete(soft=False)
 | |
| 
 | |
|             Ticket.objects.get_queryset(all=True).filter(workflow__key='visit').delete(soft=False)
 | |
| 
 | |
|             Employee.objects.get_queryset(all=True).filter(type='visitor').delete(soft=False)
 | |
| 
 | |
|             User.objects.get_queryset(all=True).filter(type='visitor').delete(soft=False)
 | |
|         if 'rpm' in datas:
 | |
|             from apps.rpm.models import Rparty
 | |
|             Rparty.objects.get_queryset(all=True).delete(soft=False)
 | |
|             Ticket.objects.get_queryset(all=True).filter(workflow__key='rpj').delete(soft=False)
 | |
|             Employee.objects.get_queryset(all=True).filter(type='remployee').delete(soft=False)
 | |
|             User.objects.get_queryset(all=True).filter(type='remployee').delete(soft=False)
 | |
|             Dept.objects.get_queryset(all=True).filter(type='rparty').delete(soft=False)
 | |
|         if 'event' in datas:
 | |
|             from apps.ecm.models import Event
 | |
|             Event.objects.all().delete()
 | |
|         if 'opm' in datas:
 | |
|             from apps.opm.models import Operation
 | |
|             Operation.objects.all().delete()
 | |
|             Ticket.objects.get_queryset(all=True).filter(workflow__key__contains='opl_').delete(soft=False)
 | |
|         if 'ptask' in datas:
 | |
|             from django_celery_results.models import TaskResult
 | |
|             TaskResult.objects.filter(task_name__in=['apps.vm.tasks.close_visit_by_leave_time',
 | |
|                                                      'apps.rpm.tasks.close_rpj_by_leave_time']).delete()
 | |
|         return Response()
 |