LogManagementController.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import boto3
  4. import botocore
  5. import requests
  6. from django.db.models import Q
  7. from django.views.generic.base import View
  8. from Object.IPWeatherObject import IPQuery
  9. from Object.ResponseObject import ResponseObject
  10. from Object.TokenObject import TokenObject
  11. from Service.CommonService import CommonService
  12. from Model.models import Device_Info, RequestRecordModel, iotdeviceInfoModel, Access_Log, DeviceLogModel, LogModel, \
  13. AppLogModel, AppScannedSerial, StsFrequency, DeviceDomainRegionModel, IPAddr, CountryModel, RegionModel, \
  14. AbnormalEvent, DeviceTypeModel, AbnormalEventCode
  15. from Ansjer.config import REGION_NAME, ACCESS_KEY_ID, SECRET_ACCESS_KEY, LOG_BUCKET
  16. class LogManagementView(View):
  17. def get(self, request, *args, **kwargs):
  18. request.encoding = 'utf-8'
  19. operation = kwargs.get('operation')
  20. return self.validation(request.GET, request, operation)
  21. def post(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation')
  24. return self.validation(request.POST, request, operation)
  25. def validation(self, request_dict, request, operation):
  26. language = request_dict.get('language', 'en')
  27. response = ResponseObject(language, 'pc')
  28. if operation == '??':
  29. return 0
  30. else:
  31. tko = TokenObject(
  32. request.META.get('HTTP_AUTHORIZATION'),
  33. returntpye='pc')
  34. # if tko.code != 0:
  35. # return response.json(tko.code)
  36. response.lang = tko.lang
  37. userID = tko.userID
  38. if operation == 'getRequestList':
  39. return self.getRequestList(request_dict, response)
  40. elif operation == 'getDeviceIotInfoList':
  41. return self.getDeviceIotInfoList(request_dict, response)
  42. elif operation == 'requestPublishMqtt':
  43. return self.requestPublishMqtt(request_dict, response)
  44. elif operation == 'getAccessLogList':
  45. return self.getAccessLogList(request_dict, response)
  46. elif operation == 'getDeviceLogList':
  47. return self.getDeviceLogList(request_dict, response)
  48. # 操作日志
  49. elif operation == 'getOperationLogList':
  50. return self.getOperationLogList(request_dict, response)
  51. elif operation == 'getAppLogList': # 获取app日志
  52. return self.getAppLogList(request_dict, response)
  53. elif operation == 'getScanLog': # 获取扫码日志
  54. return self.getScanLog(request_dict, response)
  55. elif operation == 'getAlarmLog': # 获取警报日志
  56. return self.getAlarmLog(request_dict, response)
  57. elif operation == 'getDomainLog': # 获取域名日志
  58. return self.getDomainLog(request_dict, response)
  59. elif operation == 'getDomainScanLog': # 获取域名扫码日志
  60. return self.getDomainScanLog(request_dict, response)
  61. elif operation == 'getDeviceAbnormalEvent': # 获取设备异常事件
  62. return self.getDeviceAbnormalEvent(request_dict, response)
  63. elif operation == 'getAbnormalEventValue': # 获取设备异常事件编码/内容
  64. return self.getAbnormalEventValue(response)
  65. else:
  66. return response.json(414)
  67. def getRequestList(self, request_dict, response):
  68. pageNo = request_dict.get('pageNo', None)
  69. pageSize = request_dict.get('pageSize', None)
  70. method = request_dict.get('method', None)
  71. url = request_dict.get('url', None)
  72. parameter = request_dict.get('parameter', None)
  73. status_code = request_dict.get('status_code', None)
  74. reason_phrase = request_dict.get('reason_phrase', None)
  75. if not all([pageNo, pageSize]):
  76. return response.json(444)
  77. page = int(pageNo)
  78. line = int(pageSize)
  79. try:
  80. request_qs = RequestRecordModel.objects.all()
  81. if method:
  82. request_qs = request_qs.filter(method=method)
  83. if url:
  84. request_qs = request_qs.filter(url__contains=url)
  85. if parameter:
  86. request_qs = request_qs.filter(parameter__contains=parameter)
  87. if status_code:
  88. request_qs = request_qs.filter(status_code=status_code)
  89. if reason_phrase:
  90. request_qs = request_qs.filter(reason_phrase=reason_phrase)
  91. count = request_qs.count()
  92. request_qs = request_qs[(page - 1) * line:page * line]
  93. qs_list = []
  94. for requsetobj in request_qs:
  95. qs_list.append({
  96. 'id': requsetobj.id,
  97. 'method': requsetobj.method,
  98. 'url': requsetobj.url,
  99. 'parameter': requsetobj.parameter,
  100. # 时间保留小数点后两位
  101. 'execute_time': round(requsetobj.execute_time, 2),
  102. 'status_code': requsetobj.status_code,
  103. 'reason_phrase': requsetobj.reason_phrase,
  104. 'add_time': requsetobj.add_time.strftime("%Y-%m-%d %H:%M:%S"),
  105. })
  106. return response.json(
  107. 0, {'list': qs_list, 'total': count})
  108. except Exception as e:
  109. print(e)
  110. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  111. def getDeviceIotInfoList(self, request_dict, response):
  112. serial_number = request_dict.get('serial_number', None)
  113. uid = request_dict.get('uid', None)
  114. pageNo = request_dict.get('pageNo', None)
  115. pageSize = request_dict.get('pageSize', None)
  116. if not all([pageNo, pageSize]):
  117. return response.json(444)
  118. page = int(pageNo)
  119. line = int(pageSize)
  120. try:
  121. if serial_number or uid:
  122. if serial_number:
  123. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  124. serial_number__contains=serial_number)
  125. if uid:
  126. iot_device_info_qs = iotdeviceInfoModel.objects.filter(
  127. uid__contains=uid)
  128. if not iot_device_info_qs.exists():
  129. return response.json(0)
  130. total = len(iot_device_info_qs)
  131. iot_device_info_qs = iot_device_info_qs.values(
  132. 'serial_number',
  133. 'uid',
  134. 'thing_name',
  135. 'thing_groups',
  136. 'add_time',
  137. 'update_time')[(page - 1) * line:page * line]
  138. else:
  139. total = iotdeviceInfoModel.objects.filter().count()
  140. iot_device_info_qs = iotdeviceInfoModel.objects.filter().values(
  141. 'serial_number',
  142. 'uid',
  143. 'thing_name',
  144. 'thing_groups',
  145. 'add_time',
  146. 'update_time')[(page - 1) * line:page * line]
  147. iot_device_info_list = CommonService.qs_to_list(iot_device_info_qs)
  148. # 获取序列号的uid
  149. for iot_device_info in iot_device_info_list:
  150. if not iot_device_info['uid']:
  151. device_info_qs = Device_Info.objects.filter(
  152. serial_number__contains=iot_device_info['serial_number']).values('UID')
  153. if device_info_qs.exists():
  154. iot_device_info['uid'] = device_info_qs[0]['UID']
  155. return response.json(
  156. 0, {'list': iot_device_info_list, 'total': total})
  157. except Exception as e:
  158. print(e)
  159. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  160. # 通用发布MQTT通知
  161. @staticmethod
  162. def requestPublishMqtt(request_dict, response):
  163. msg = request_dict.get('msg', None)
  164. thing_name = request_dict.get('thing_name', None)
  165. topic_name = request_dict.get('topic_name', None)
  166. if not all([msg, thing_name, topic_name]):
  167. return response.json(444)
  168. try:
  169. msg = eval(msg)
  170. identification_code = thing_name[thing_name.rindex('_') + 1:]
  171. if not CommonService.req_publish_mqtt_msg(identification_code, topic_name, msg):
  172. return response.json(10044)
  173. return response.json(0)
  174. except Exception as e:
  175. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  176. def getAccessLogList(self, request_dict, response):
  177. user = request_dict.get('user', None)
  178. operation = request_dict.get('operation', None)
  179. status = request_dict.get('status', None)
  180. pageNo = request_dict.get('pageNo', None)
  181. pageSize = request_dict.get('pageSize', None)
  182. if not all([pageNo, pageSize]):
  183. return response.json(444)
  184. page = int(pageNo)
  185. line = int(pageSize)
  186. try:
  187. if user or operation or status:
  188. if user:
  189. access_log_qs = Access_Log.objects.filter(
  190. user__contains=user)
  191. if operation:
  192. access_log_qs = Access_Log.objects.filter(
  193. operation__contains=operation)
  194. if status:
  195. access_log_qs = Access_Log.objects.filter(status=status)
  196. if not access_log_qs.exists():
  197. return response.json(0)
  198. total = access_log_qs.count()
  199. access_log_qs = access_log_qs.order_by('-time').values(
  200. 'user', 'operation', 'ip', 'status', 'content', 'time')[(page - 1) * line:page * line]
  201. else:
  202. total = Access_Log.objects.count()
  203. access_log_qs = Access_Log.objects.filter().order_by('-time').values('user',
  204. 'operation', 'ip', 'status',
  205. 'content', 'time')[
  206. (page - 1) * line:page * line]
  207. access_log_list = CommonService.qs_to_list(access_log_qs)
  208. return response.json(0, {'list': access_log_list, 'total': total})
  209. except Exception as e:
  210. print(e)
  211. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  212. def getDeviceLogList(self, request_dict, response):
  213. uid = request_dict.get('uid', None)
  214. serial_number = request_dict.get('serial_number', None)
  215. pageNo = request_dict.get('pageNo', None)
  216. pageSize = request_dict.get('pageSize', None)
  217. if not all([pageNo, pageSize]):
  218. return response.json(444)
  219. page = int(pageNo)
  220. line = int(pageSize)
  221. try:
  222. if uid or serial_number:
  223. if uid:
  224. device_log_qs = DeviceLogModel.objects.filter(
  225. uid=uid)
  226. if serial_number:
  227. device_log_qs = DeviceLogModel.objects.filter(
  228. serial_number=serial_number)
  229. if not device_log_qs.exists():
  230. return response.json(0)
  231. total = device_log_qs.count()
  232. device_log_qs = device_log_qs.order_by(
  233. '-add_time').values()[(page - 1) * line:page * line]
  234. else:
  235. total = DeviceLogModel.objects.count()
  236. device_log_qs = DeviceLogModel.objects.filter().order_by(
  237. '-add_time').values()[(page - 1) * line:page * line]
  238. device_log_list = CommonService.qs_to_list(device_log_qs)
  239. # 添加下载链接
  240. aws_s3_client = boto3.client(
  241. 's3',
  242. region_name=REGION_NAME,
  243. aws_access_key_id=ACCESS_KEY_ID,
  244. aws_secret_access_key=SECRET_ACCESS_KEY,
  245. config=botocore.client.Config(signature_version='s3v4'),
  246. )
  247. for device_log in device_log_list:
  248. obj = device_log['serial_number'] if device_log['serial_number'] else device_log['uid']
  249. obj = 'device_log/' + obj + \
  250. '/{}'.format(device_log['filename'])
  251. download_url = aws_s3_client.generate_presigned_url(
  252. ClientMethod='get_object',
  253. Params={
  254. 'Bucket': LOG_BUCKET,
  255. 'Key': obj
  256. },
  257. ExpiresIn=3600
  258. )
  259. device_log['download_url'] = download_url
  260. return response.json(0, {'list': device_log_list, 'total': total})
  261. except Exception as e:
  262. print(e)
  263. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  264. def getOperationLogList(self, request_dict, response):
  265. operation = request_dict.get('operation', None)
  266. url = request_dict.get('url', None)
  267. pageNo = request_dict.get('pageNo', None)
  268. pageSize = request_dict.get('pageSize', None)
  269. if not all([pageNo, pageSize]):
  270. return response.json(444)
  271. page = int(pageNo)
  272. line = int(pageSize)
  273. try:
  274. log_qs = LogModel.objects.all()
  275. if operation:
  276. log_qs = log_qs.filter(operation__contains=operation)
  277. if url:
  278. log_qs = log_qs.filter(url__contains=url)
  279. count = log_qs.count()
  280. log_qs = log_qs.values(
  281. 'operation', 'url', 'content', 'ip', 'time')[
  282. (page - 1) * line:page * line]
  283. log_list = list(log_qs)
  284. return response.json(
  285. 0, {'list': log_list, 'total': count})
  286. except Exception as e:
  287. print(e)
  288. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  289. def getAppLogList(self, request_dict, response):
  290. """
  291. 获取App日志信息
  292. @param request_dict:请求参数
  293. @param response:响应对象
  294. @request_dict userID:用户ID
  295. @request_dict uid:uid
  296. @return:
  297. """
  298. userName = request_dict.get('userName', None)
  299. uid = request_dict.get('uid', None)
  300. pageNo = request_dict.get('pageNo', None)
  301. pageSize = request_dict.get('pageSize', None)
  302. if not all([pageNo, pageSize]):
  303. return response.json(444)
  304. page = int(pageNo)
  305. line = int(pageSize)
  306. try:
  307. app_log_qs = AppLogModel.objects.all()
  308. if userName:
  309. app_log_qs = app_log_qs.filter(user__username=userName)
  310. elif uid:
  311. app_log_qs = app_log_qs.filter(uid=uid)
  312. count = app_log_qs.count()
  313. log_qs = app_log_qs.values(
  314. 'user__username', 'uid', 'average_delay', 'status', 'filename', 'add_time', 'user_id').order_by(
  315. '-add_time')[(page - 1) * line:page * line]
  316. app_log_list = CommonService.qs_to_list(log_qs)
  317. # 添加下载链接
  318. aws_s3_client = boto3.client(
  319. 's3',
  320. region_name=REGION_NAME,
  321. aws_access_key_id=ACCESS_KEY_ID,
  322. aws_secret_access_key=SECRET_ACCESS_KEY,
  323. config=botocore.client.Config(signature_version='s3v4'),
  324. )
  325. for app_log in app_log_list:
  326. filename = app_log['filename']
  327. if not filename.endswith('.txt'):
  328. filename += ".txt"
  329. obj = 'app_log/' + app_log['user_id'] + '/{}'.format(filename)
  330. appLog_url = aws_s3_client.generate_presigned_url(
  331. ClientMethod='get_object',
  332. Params={
  333. 'Bucket': LOG_BUCKET,
  334. 'Key': obj
  335. },
  336. ExpiresIn=3600
  337. )
  338. app_log['appLog_url'] = appLog_url
  339. return response.json(0, {'list': app_log_list, 'total': count})
  340. except Exception as e:
  341. print(e)
  342. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  343. def getScanLog(self, request_dict, response):
  344. serial = request_dict.get('serial', None)
  345. ip = request_dict.get('ip', None)
  346. pageNo = request_dict.get('pageNo', None)
  347. pageSize = request_dict.get('pageSize', None)
  348. if not all([pageNo, pageSize]):
  349. return response.json(444)
  350. page = int(pageNo)
  351. line = int(pageSize)
  352. try:
  353. scan_log_qs = AppScannedSerial.objects.all()
  354. if serial:
  355. scan_log_qs = scan_log_qs.filter(serial__contains=serial)
  356. if ip:
  357. scan_log_qs = scan_log_qs.filter(ip__contains=ip)
  358. count = scan_log_qs.count()
  359. scan_log_qs = scan_log_qs.order_by('-add_time').values(
  360. 'serial', 'ip', 'add_time', 'update_time')[
  361. (page - 1) * line:page * line]
  362. scan_log_list = list(scan_log_qs)
  363. return response.json(
  364. 0, {'list': scan_log_list, 'total': count})
  365. except Exception as e:
  366. print(e)
  367. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  368. def getAlarmLog(self, request_dict, response):
  369. page_no = request_dict.get('pageNo', None)
  370. page_size = request_dict.get('pageSize', None)
  371. uid = request_dict.get('uid', None)
  372. if not all([page_no, page_size]):
  373. return response.json(444)
  374. page = int(page_no)
  375. line = int(page_size)
  376. try:
  377. alarm_log_qs = StsFrequency.objects.all()
  378. if uid:
  379. alarm_log_qs = alarm_log_qs.filter(uid=uid)
  380. count = alarm_log_qs.count()
  381. alarm_log_qs = alarm_log_qs.order_by('-updateTime').values('id', 'uid', 'frequency', 'updateTime',
  382. 'addTime')[(page - 1) * line:page * line]
  383. return response.json(0, {'list': list(alarm_log_qs), 'total': count})
  384. except Exception as e:
  385. print(e)
  386. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  387. @staticmethod
  388. def getDomainLog(request_dict, response):
  389. page_no = request_dict.get('pageNo', None)
  390. page_size = request_dict.get('pageSize', None)
  391. serial_number = request_dict.get('serialNumber', None)
  392. if not all([page_no, page_size]):
  393. return response.json(444)
  394. page = int(page_no)
  395. line = int(page_size)
  396. try:
  397. device_domain_qs = DeviceDomainRegionModel.objects.filter(~Q(country_code=''))
  398. if serial_number:
  399. device_domain_qs = device_domain_qs.filter(serial_number__contains=serial_number)
  400. count = device_domain_qs.count()
  401. device_domain_qs = device_domain_qs.order_by('-update_time').values()[(page - 1) * line:page * line]
  402. device_domain_list = []
  403. for device_domain in device_domain_qs:
  404. ip = device_domain['ip']
  405. region_id = device_domain['region_id']
  406. country_code = device_domain['country_code']
  407. ip_addr_qs = IPAddr.objects.filter(ip=ip, is_geoip2=False).values('region')
  408. if ip_addr_qs.exists():
  409. region = ip_addr_qs[0]['region']
  410. else:
  411. ip_qs = IPQuery(ip)
  412. region = ip_qs.region
  413. # 港澳台返回美洲域名
  414. if country_code == 'CN' and region in ['香港', '澳门', '台湾']:
  415. country_code = region
  416. # 查询域名数据
  417. region_qs = RegionModel.objects.filter(id=region_id).values('api', 'name')
  418. api = 'https://www.dvema.com/'
  419. region_name = '美洲'
  420. if region_qs.exists():
  421. api = region_qs[0]['api']
  422. region_name = region_qs[0]['name']
  423. api_region = region_name + '域名'
  424. device_domain_list.append({
  425. 'id': device_domain['id'],
  426. 'serial_number': device_domain['serial_number'],
  427. 'ip': ip,
  428. 'region_id': region_id,
  429. 'country_code': country_code,
  430. 'api': api,
  431. 'api_region': api_region,
  432. 'add_time': device_domain['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  433. 'update_time': device_domain['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  434. })
  435. return response.json(0, {'list': device_domain_list, 'total': count})
  436. except Exception as e:
  437. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  438. @staticmethod
  439. def getDomainScanLog(request_dict, response):
  440. serial_number = request_dict.get('serialNumber', None)
  441. if not all([serial_number]):
  442. return response.json(444)
  443. try:
  444. scan_log_qs = AppScannedSerial.objects.filter(serial__contains=serial_number).values('ip', 'add_time',
  445. 'update_time')
  446. device_domain_qs = DeviceDomainRegionModel.objects.filter(serial_number__contains=serial_number).values()
  447. res = {}
  448. if scan_log_qs.exists() and device_domain_qs.exists():
  449. device_domain = device_domain_qs[0]
  450. domain_ip = device_domain['ip']
  451. region_id = device_domain['region_id']
  452. country_code = device_domain['country_code']
  453. ip_addr_qs = IPAddr.objects.filter(ip=domain_ip, is_geoip2=False).values('region')
  454. if ip_addr_qs.exists():
  455. region = ip_addr_qs[0]['region']
  456. else:
  457. ip_qs = IPQuery(domain_ip)
  458. region = ip_qs.region
  459. # 港澳台返回美洲域名
  460. if country_code == 'CN' and region in ['香港', '澳门', '台湾']:
  461. country_code = region
  462. # 查询域名数据
  463. region_qs = RegionModel.objects.filter(id=region_id).values('api', 'name')
  464. api = 'https://www.dvema.com/'
  465. region_name = '美洲'
  466. if region_qs.exists():
  467. api = region_qs[0]['api']
  468. region_name = region_qs[0]['name']
  469. api_region = region_name + '域名'
  470. res = {
  471. 'serial_number': device_domain['serial_number'],
  472. 'domain_ip': domain_ip,
  473. 'scan_ip': device_domain_qs[0]['ip'],
  474. 'region_id': region_id,
  475. 'country_code': country_code,
  476. 'api': api,
  477. 'api_region': api_region,
  478. 'domain_add_time': device_domain['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  479. 'domain_update_time': device_domain['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  480. 'scan_add_time': device_domain_qs[0]['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
  481. 'scan_update_time': device_domain_qs[0]['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
  482. }
  483. return response.json(0, res)
  484. except Exception as e:
  485. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  486. @staticmethod
  487. def getDeviceAbnormalEvent(request_dict, response):
  488. uid = request_dict.get('uid', None)
  489. device_type = request_dict.get('deviceType', None)
  490. version = request_dict.get('version', None)
  491. event_type = request_dict.get('eventType', None)
  492. report_type = request_dict.get('reportType', None)
  493. event_time_range = request_dict.getlist('eventTimeRange[]', None)
  494. page_no = request_dict.get('pageNo', None)
  495. page_size = request_dict.get('pageSize', None)
  496. is_page = False
  497. if all([page_no, page_size]):
  498. is_page = True
  499. page = int(page_no)
  500. line = int(page_size)
  501. try:
  502. query = Q()
  503. if uid:
  504. query &= Q(uid=uid)
  505. if device_type:
  506. # 处理多个deviceType参数
  507. device_types = [int(t.strip()) for t in device_type.split(',') if t.strip().isdigit()]
  508. query &= Q(device_type__in=device_types)
  509. if version:
  510. query &= Q(version=version)
  511. if report_type:
  512. query &= Q(report_type=int(report_type))
  513. if event_time_range:
  514. start_time, end_time = int(
  515. event_time_range[0][:-3]), int(event_time_range[1][:-3])
  516. query &= Q(event_time__gte=start_time, event_time__lte=end_time)
  517. if event_type:
  518. # 通过event查询对应的event_code
  519. event_codes_from_event = AbnormalEventCode.objects.filter(
  520. event_type__in=event_type.split(',')
  521. ).values_list('event_code', flat=True)
  522. if event_codes_from_event.exists():
  523. query &= Q(event_code__in=event_codes_from_event)
  524. abnormal_events = AbnormalEvent.objects.filter(query)
  525. count = abnormal_events.count()
  526. event_list = abnormal_events.order_by('-event_time').values(
  527. 'id', 'uid', 'device_type', 'version', 'event_code',
  528. 'content', 'report_type', 'event_time', 'created_time'
  529. )
  530. # 分页
  531. if is_page:
  532. event_list = event_list[(page - 1) * line:page * line]
  533. # 查询device_type对应的name,事件编码对应的事件
  534. for event in event_list:
  535. device_type = DeviceTypeModel.objects.filter(type=event['device_type']).first()
  536. if device_type:
  537. event['device_type'] = device_type.name
  538. else:
  539. event['device_type'] = ''
  540. abnormal_event_code = AbnormalEventCode.objects.filter(event_code=event['event_code']).first()
  541. if abnormal_event_code:
  542. event['event'] = abnormal_event_code.event
  543. event['event_type'] = abnormal_event_code.event_type
  544. else:
  545. event['event'] = ''
  546. return response.json(0, {'list': list(event_list), 'total': count})
  547. except Exception as e:
  548. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  549. @staticmethod
  550. def getAbnormalEventValue(response):
  551. try:
  552. event_types = AbnormalEventCode.objects.values_list('event_type', flat=True)
  553. # 使用Python的set去重
  554. seen = set()
  555. unique_event_types = [x for x in event_types if x not in seen and not seen.add(x)]
  556. return response.json(0, {'list': unique_event_types})
  557. except Exception as e:
  558. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))