UidSetController.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
  5. @AUTHOR: ASJRD019
  6. @NAME: AnsjerFormal
  7. @software: PyCharm
  8. @DATE: 2019/5/27 15:50
  9. @Version: python3.6
  10. @MODIFY DECORD:ansjer dev
  11. @file: AliPayObject.py
  12. @Contact: pzb3076@163.com
  13. """
  14. import threading
  15. import time
  16. import traceback
  17. import requests
  18. from django.db.models import Count
  19. from Object.RedisObject import RedisObject
  20. import simplejson as json
  21. from django.utils.decorators import method_decorator
  22. from django.views.decorators.csrf import csrf_exempt
  23. from django.views.generic.base import View
  24. from Model.models import UidSetModel, Device_User, Device_Info, UidPushModel, Equipment_Info, UID_Preview, UID_Bucket, \
  25. VodHlsModel, Order_Model, OssCrdModel, UidUserModel, UidChannelSetModel, User_Brand, ExperienceContextModel, \
  26. StsCrdModel, Unused_Uid_Meal, UIDMainUser
  27. from Object.ResponseObject import ResponseObject
  28. from Object.TokenObject import TokenObject
  29. from Service.CommonService import CommonService
  30. from Service.ModelService import ModelService
  31. from django.db import transaction
  32. '''
  33. # 管理员获取信息
  34. http://192.168.136.39:8000/uidset/adminQuery?token=local&page=1&line=10
  35. 管理员删除信息
  36. http://192.168.136.39:8000/uidset/adminDelete?token=local&id=2
  37. 管理员添加信息
  38. http://192.168.136.39:8000/uidset/adminAdd?token=local&uid=JW3684H8BSHG9TTM111A
  39. 管理员编辑信息
  40. http://192.168.136.39:8000/uidset/adminUpdate?token=local&id=6&content={"uid":"9999"}
  41. '''
  42. # 设备信息添加
  43. class UidSetView(View):
  44. @method_decorator(csrf_exempt)
  45. def dispatch(self, *args, **kwargs):
  46. return super(UidSetView, self).dispatch(*args, **kwargs)
  47. def get(self, request, *args, **kwargs):
  48. request.encoding = 'utf-8'
  49. operation = kwargs.get('operation')
  50. return self.validation(request.GET, request, operation)
  51. def post(self, request, *args, **kwargs):
  52. request.encoding = 'utf-8'
  53. operation = kwargs.get('operation')
  54. return self.validation(request.POST, request, operation)
  55. def validation(self, request_dict, request, operation):
  56. response = ResponseObject()
  57. if operation is None:
  58. return response.json(444, 'error path')
  59. token = request_dict.get('token', None)
  60. # 设备主键uid
  61. tko = TokenObject(token)
  62. response.lang = tko.lang
  63. if tko.code != 0:
  64. return response.json(tko.code)
  65. userID = tko.userID
  66. if operation == 'queryAll':
  67. return self.do_queryAll(request_dict, userID, response)
  68. elif operation == 'adminQueryAll':
  69. return self.do_admin_queryAll(request_dict, userID, response)
  70. elif operation == 'adminDelete':
  71. return self.do_admin_delete(request_dict, userID, response)
  72. elif operation == 'adminQuery':
  73. return self.do_admin_query(request_dict, userID, response)
  74. elif operation == 'adminAdd':
  75. return self.do_admin_add(request_dict, userID, response)
  76. elif operation == 'adminUpdate':
  77. return self.do_admin_update(request_dict, userID, response)
  78. elif operation == 'update':
  79. return self.do_update(request_dict, response)
  80. elif operation == 'updateSet':
  81. return self.do_update_set(request, request_dict, response)
  82. elif operation == 'updateChannel':
  83. return self.do_update_channel_set(request_dict, response)
  84. elif operation == 'setVoicePrompt':
  85. return self.do_set_voice(userID, request_dict, response)
  86. elif operation == 'vod_reset':
  87. return self.vod_reset(request_dict, response)
  88. # elif operation == 'test':
  89. # return self.do_test(response)
  90. else:
  91. return response.json(444, 'error path')
  92. def do_queryAll(self, request_dict, userID, response):
  93. uid_list = Device_Info.objects.filter(userID_id=userID).values_list('UID', flat=True)
  94. uid_set_qs = UidSetModel.objects.filter(uid__in=uid_list).values('uid', 'detect_status', 'detect_interval',
  95. 'version', 'ucode', 'p2p_region', 'tz',
  96. 'video_code', 'channel', 'cloud_vod')
  97. if uid_set_qs.exists():
  98. return response.json(0, list(uid_set_qs))
  99. else:
  100. return response.json(0)
  101. def do_admin_queryAll(self, request_dict, userID, response):
  102. uid = request_dict.get('uid', None)
  103. user_search = UidPushModel.objects.filter(uid_set__uid=uid).values(
  104. 'userID__username', 'userID__userEmail', 'userID__phone', 'userID__is_active',
  105. 'userID__NickName', 'uid_set__video_code', 'uid_set__version', 'uid_set__ucode',
  106. 'uid_set__tz', 'uid_set__p2p_region', 'uid_set__nickname', 'uid_set__detect_status',
  107. 'uid_set__detect_interval', 'uid_set__cloud_vod', 'uid_set__channel', 'updTime',
  108. 'tz', 'token_val', 'push_type', 'm_code',
  109. 'lang', 'app_type', 'uid_set__uid', 'userID__data_joined', 'appBundleId'
  110. )
  111. qs_list = CommonService.qs_to_list(user_search)
  112. return response.json(0, qs_list)
  113. # 管理员删除
  114. def do_admin_delete(self, request_dict, userID, response):
  115. own_perm = ModelService.check_perm(userID, 10)
  116. if own_perm is True:
  117. uid = request_dict.getlist('uid', None)
  118. id_list = request_dict.get('id_list', None)
  119. # redisObj = RedisObject(db=8)
  120. # redisObj.del_data(key='uid_qs_' + userID)
  121. # 删除回滚
  122. with transaction.atomic(): # 上下文格式,可以在python代码的任何位置使用
  123. val = 1
  124. if 'UidSetModel' in id_list:
  125. del_uid = UidSetModel.objects.filter(uid__in=uid)
  126. if del_uid.exists():
  127. del_uid.delete()
  128. print ('删除UidSetModel')
  129. else:
  130. val = 1
  131. print('UidSetModel表没有数据')
  132. if 'Equipment_Info' in id_list:
  133. del_uid = Equipment_Info.objects.filter(devUid__in=uid)
  134. if del_uid.exists():
  135. del_uid.delete()
  136. # print('删除Equipment_Info')
  137. else:
  138. val = val+1
  139. print('Equipment_Info表没有数据')
  140. if 'UID_Preview' in id_list:
  141. del_uid = UID_Preview.objects.filter(uid__in=uid)
  142. if del_uid.exists():
  143. del_uid.delete()
  144. # print ('删除UID_Preview')
  145. else:
  146. val = val + 1
  147. print('UID_Preview表没有数据')
  148. if 'UID_Bucket' in id_list:
  149. del_uid = UID_Bucket.objects.filter(uid__in=uid)
  150. if del_uid.exists():
  151. del_uid.delete()
  152. # print ('删除UID_Bucket')
  153. else:
  154. val = val + 1
  155. print('UID_Bucket表没有数据')
  156. if 'VodHlsModel' in id_list:
  157. del_uid = VodHlsModel.objects.filter(uid__in=uid)
  158. if del_uid.exists():
  159. # del_uid.delete()
  160. print ('删除VodHlsModel')
  161. else:
  162. val = val + 1
  163. print('VodHlsModel表没有数据')
  164. if 'Order_Model' in id_list:
  165. del_uid = Order_Model.objects.filter(UID__in=uid)
  166. if del_uid.exists():
  167. del_uid.delete()
  168. # print ('删除Order_Model')
  169. else:
  170. val = val + 1
  171. print('Order_Model表没有数据')
  172. if 'Device_Info' in id_list:
  173. del_uid = Device_Info.objects.filter(UID__in=uid)
  174. if del_uid.exists():
  175. del_uid.delete()
  176. # print ('删除Device_Info')
  177. else:
  178. val = val + 1
  179. print('Order_Model表没有数据')
  180. if 'OssCrdModel' in id_list:
  181. del_uid = OssCrdModel.objects.filter(uid__in=uid)
  182. if del_uid.exists():
  183. del_uid.delete()
  184. # print ('删除OssCrdModel')
  185. else:
  186. val = val + 1
  187. print('OssCrdModel表没有数据')
  188. if 'UidUserModel' in id_list:
  189. del_uid = UidUserModel.objects.filter(UID__in=uid)
  190. if del_uid.exists():
  191. del_uid.delete()
  192. # print ('删除UidUserModel')
  193. else:
  194. val = val + 1
  195. print('UidUserModel表没有数据')
  196. # 有后台管理 设备配置表UidSetModel ---uid --本身,
  197. # 有后台管理 设备关联用户推送表Equipment_Info --devUid --独立没有儿子的,
  198. # 有后台管理 设备预览图表UID_Preview ---uid---孤立,
  199. # 有后台管理 设备关联套餐表UID_Bucket ---uid---孤立,
  200. # 有后台管理 云存回放信息表VodHlsModel ---uid---孤立,
  201. # 有后台管理 订单信息表Order_Model --UID----独立没有儿子的,
  202. # 有后台管理 用户设备信息表(最多信息量的表)Device_Info ---UID---孤立,
  203. # 设备证书OssCrdModel ---uid---孤立
  204. # 有后台管理 设备ap表 UidUserModel
  205. # 设备绑定UidPushModel---关联表---设备配置表UidSetModel---配置表的详情有显示
  206. # raise DatabaseError #测试用,检测是否能捕捉错误
  207. if val == 9:
  208. return response.json(173)
  209. else:
  210. return response.json(0)
  211. else:
  212. return response.json(404)
  213. # 管理员查询接口
  214. def do_admin_query(self, request_dict, userID, response):
  215. own_perm = ModelService.check_perm(userID, 20)
  216. if own_perm is True:
  217. page = request_dict.get('page', None)
  218. line = request_dict.get('line', None)
  219. page = int(page)
  220. line = int(line)
  221. deviceContent = request_dict.get('content', None)
  222. if deviceContent:
  223. try:
  224. searchCondition = json.loads(deviceContent)
  225. except Exception as e:
  226. return response.json(10, repr(e))
  227. else:
  228. kwargs = CommonService.get_kwargs(data=searchCondition)
  229. omqs = UidSetModel.objects.filter(**kwargs).order_by('-id')
  230. if not omqs.exists():
  231. return response.json(0, [])
  232. count = omqs.count()
  233. order_ql = omqs[(page - 1) * line:page * line]
  234. uidset_json = CommonService.qs_to_dict(order_ql)
  235. uidset_json['count'] = count
  236. return response.json(0, uidset_json)
  237. else:
  238. omqs = UidSetModel.objects.all().order_by('-id')
  239. if not omqs.exists():
  240. return response.json(0, [])
  241. count = omqs.count()
  242. order_ql = omqs[(page - 1) * line:page * line]
  243. uidset_json = CommonService.qs_to_dict(order_ql)
  244. uidset_json['count'] = count
  245. return response.json(0, uidset_json)
  246. else:
  247. return response.json(404)
  248. # 管理员的添加
  249. def do_admin_add(self, request_dict, userID, response):
  250. own_perm = ModelService.check_perm(userID=userID, permID=40)
  251. if own_perm is not True:
  252. return response.json(404)
  253. uid = request_dict.get('uid', None)
  254. timestamp = int(time.time())
  255. param_flag = CommonService.get_param_flag(
  256. data=[uid])
  257. if param_flag is not True:
  258. return response.json(444)
  259. try:
  260. uidset = UidSetModel(
  261. uid=uid,
  262. addTime=timestamp,
  263. updTime=timestamp)
  264. uidset.save()
  265. return response.json(0)
  266. except Exception:
  267. errorInfo = traceback.format_exc()
  268. print(errorInfo)
  269. return response.json(500, {'details': errorInfo})
  270. # 管理员的编辑
  271. def do_admin_update(self, request_dict, userID, response):
  272. own_perm = ModelService.check_perm(userID=userID, permID=50)
  273. if own_perm is not True:
  274. return response.json(404)
  275. deviceContent = request_dict.get('content', None)
  276. id = request_dict.get('id', None)
  277. if not deviceContent or not id:
  278. return response.json(444, 'content,id')
  279. try:
  280. timestamp = int(time.time())
  281. deviceData = json.loads(deviceContent)
  282. uid_set = UidSetModel.objects.filter(id=id)
  283. if uid_set.exists():
  284. uid_set.update(updTime=timestamp, **deviceData)
  285. return response.json(0)
  286. else:
  287. return response.json(173)
  288. except Exception:
  289. errorInfo = traceback.format_exc()
  290. print(errorInfo)
  291. return response.json(500, {'details': errorInfo})
  292. def do_update(self, request_dict, response):
  293. uid = request_dict.get('uid', None)
  294. region_alexa = request_dict.get('region_alexa', None)
  295. is_alexa = request_dict.get('is_alexa', None)
  296. try:
  297. timestamp = int(time.time())
  298. uid_set = UidSetModel.objects.filter(uid=uid)
  299. if uid_set.exists():
  300. if region_alexa is None:
  301. uid_set.update(updTime=timestamp, is_alexa=is_alexa)
  302. else:
  303. if is_alexa is None:
  304. uid_set.update(updTime=timestamp, region_alexa=region_alexa)
  305. else:
  306. uid_set.update(updTime=timestamp, region_alexa=region_alexa, is_alexa=is_alexa)
  307. return response.json(0)
  308. else:
  309. return response.json(173)
  310. except Exception:
  311. errorInfo = traceback.format_exc()
  312. return response.json(500, {'details': errorInfo})
  313. def do_update_set(self, request, request_dict, response):
  314. uid = request_dict.get('uid', None)
  315. deviceContent = request_dict.get('content', None)
  316. token = request_dict.get('token', None)
  317. # print(deviceContent)
  318. if not deviceContent or not uid:
  319. return response.json(444, 'content,uid')
  320. tko = TokenObject(token)
  321. response.lang = tko.lang
  322. if tko.code != 0:
  323. return response.json(tko.code)
  324. userID = tko.userID
  325. if userID is None:
  326. return response.json(309)
  327. try:
  328. # redisObj = RedisObject(db=8)
  329. # redisObj.del_data(key='uid_qs_' + userID)
  330. deviceData = json.loads(deviceContent)
  331. uid_set_qs = UidSetModel.objects.filter(uid=uid)
  332. if not uid_set_qs.exists():
  333. # 由于uid_set表和device_info表设备数量不一致,所以添加以下逻辑把device_info表中的相关信息保存到uid_set表
  334. di_qs = Device_Info.objects.filter(UID=uid, userID=userID)
  335. if di_qs.exists():
  336. di = di_qs[0]
  337. nowTime = int(time.time())
  338. uid_set_create_dict = {
  339. 'uid': di.UID,
  340. 'addTime': nowTime,
  341. 'updTime': nowTime,
  342. 'ip': CommonService.get_ip_address(request),
  343. 'channel': di.ChannelIndex,
  344. 'nickname': di.NickName,
  345. }
  346. for k, v in deviceData.items():
  347. uid_set_create_dict[k] = v
  348. UidSetModel.objects.create(**uid_set_create_dict)
  349. else:
  350. return response.json(177)
  351. else:
  352. uid_set_qs.update(**deviceData)
  353. print('update success')
  354. except Exception as e:
  355. return response.json(177, repr(e))
  356. else:
  357. return response.json(0)
  358. def do_update_channel_set(self, request_dict, response):
  359. uid = request_dict.get('uid', None)
  360. channel = request_dict.get('channel', None)
  361. channelContent = request_dict.get('content', None)
  362. token = request_dict.get('token', None)
  363. print(channelContent)
  364. if not channelContent or not uid or not channel:
  365. return response.json(444, 'content,uid, channel')
  366. tko = TokenObject(token)
  367. response.lang = tko.lang
  368. if tko.code != 0:
  369. return response.json(tko.code)
  370. userID = tko.userID
  371. if userID is None:
  372. return response.json(309)
  373. channel = int(channel)
  374. if channel < 1:
  375. return response.json(444, 'channel')
  376. try:
  377. deviceData = json.loads(channelContent)
  378. uid_channel_set_qs = UidChannelSetModel.objects.filter(uid__uid=uid, channel=channel)
  379. uidObject = UidSetModel.objects.filter(uid=uid)
  380. if not uid_channel_set_qs.exists():
  381. ucs = {
  382. 'channel': channel,
  383. 'uid': uidObject[0]
  384. }
  385. keys = deviceData.keys()
  386. for key in keys:
  387. ucs[key] = deviceData[key]
  388. UidChannelSetModel.objects.create(**ucs)
  389. else:
  390. uid_channel_set_qs.update(**deviceData)
  391. if uidObject[0].is_alexa == 1 and 'channel_name' in deviceData.keys():
  392. # 请求Alexa服务器更新事件网关
  393. data_list = [{'userID': userID, 'UID': uid, 'uid_nick': deviceData['channel_name'], 'password': ''}]
  394. data_list = json.dumps(data_list)
  395. data = {'data_list': data_list}
  396. url = 'https://www.zositech.xyz/deviceStatus/addOrUpdateV2'
  397. requests.post(url, data=data, timeout=2)
  398. except Exception as e:
  399. return response.json(177, repr(e))
  400. else:
  401. return response.json(0)
  402. def do_set_voice(self, userID, request_dict, response):
  403. uid = request_dict.get('uid', None)
  404. channel = request_dict.get('channel', None)
  405. enter_voice = request_dict.get('enter_voice', None)
  406. leave_voice = request_dict.get('leave_voice', None)
  407. voice_status = request_dict.get('voice_status', None)
  408. intelligent_mute = request_dict.get('intelligent_mute', None)
  409. start_x = request_dict.get('start_x', None)
  410. start_y = request_dict.get('start_y', None)
  411. end_x = request_dict.get('end_x', None)
  412. end_y = request_dict.get('end_y', None)
  413. start_time = request_dict.get('start_time', None)
  414. end_time = request_dict.get('end_time', None)
  415. repeat_day = request_dict.get('repeat_day', None)
  416. direction = request_dict.get('direction', None)
  417. if uid and channel:
  418. channel = int(channel)
  419. if channel < 1:
  420. return response.json(444, 'channel')
  421. try:
  422. ucs = {}
  423. if enter_voice:
  424. ucs['voice_prompt_enter'] = enter_voice
  425. if leave_voice:
  426. ucs['voice_prompt_leave'] = leave_voice
  427. if voice_status:
  428. ucs['voice_prompt_status'] = voice_status
  429. if intelligent_mute:
  430. ucs['voice_prompt_intelligent_mute'] = intelligent_mute
  431. if start_x:
  432. ucs['voice_start_x'] = start_x
  433. if start_y:
  434. ucs['voice_start_y'] = start_y
  435. if end_x:
  436. ucs['voice_end_x'] = end_x
  437. if end_y:
  438. ucs['voice_end_y'] = end_y
  439. if start_time:
  440. ucs['voice_start_time'] = start_time
  441. if end_time:
  442. ucs['voice_end_time'] = end_time
  443. if repeat_day:
  444. ucs['voice_repeat_day'] = repeat_day
  445. if direction:
  446. ucs['voice_direction'] = direction
  447. uid_channel_set_qs = UidChannelSetModel.objects.filter(uid__uid=uid, channel=channel)
  448. if not uid_channel_set_qs.exists():
  449. uidObject = UidSetModel.objects.filter(uid=uid)
  450. ucs['channel'] = channel
  451. ucs['uid'] = uidObject[0]
  452. UidChannelSetModel.objects.create(**ucs)
  453. else:
  454. uid_channel_set_qs.update(**ucs)
  455. except Exception as e:
  456. return response.json(177, repr(e))
  457. else:
  458. return response.json(0)
  459. # 重置设备云存
  460. def vod_reset(self, request_dict, response):
  461. uid = request_dict.get('uid', None)
  462. if uid:
  463. try:
  464. with transaction.atomic():
  465. # 删除和更新设备云存相关数据
  466. UID_Bucket.objects.filter(uid=uid).delete()
  467. Unused_Uid_Meal.objects.filter(uid=uid).delete()
  468. Order_Model.objects.filter(UID=uid).delete()
  469. StsCrdModel.objects.filter(uid=uid).delete()
  470. VodHlsModel.objects.filter(uid=uid).delete()
  471. ExperienceContextModel.objects.filter(uid=uid).delete()
  472. # UIDMainUser.objects.filter(UID=uid).delete()
  473. Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
  474. except Exception as e:
  475. print(e)
  476. return response.json(500, repr(e))
  477. else:
  478. return response.json(0)
  479. # def do_test(self, response):
  480. # di_qs = Device_Info.objects.values('Type').annotate(c=Count('UID', distinct=True)).order_by()
  481. # for di in di_qs:
  482. # print(di)
  483. #
  484. # # 设备总数量
  485. # count = Device_Info.objects.values('UID').distinct().count()
  486. # print('设备总数量:' + str(count))
  487. #
  488. # # 设备型号统计
  489. # print('设备型号统计:')
  490. # us_qs = UidSetModel.objects.values('deviceModel').annotate(c=Count('id')).order_by()
  491. # for us in us_qs:
  492. # print(us)
  493. #
  494. # # 手机品牌类型统计
  495. # print('手机品牌类型统计:')
  496. # ub_qs = User_Brand.objects.values('deviceSupplier').annotate(c=Count('id')).order_by()
  497. # for ub in ub_qs:
  498. # print(ub)
  499. #
  500. # # 手机型号统计
  501. # print('手机型号统计:')
  502. # ub_qs = User_Brand.objects.values('deviceSupplier', 'deviceModel').annotate(c=Count('id')).order_by()
  503. # for ub in ub_qs:
  504. # print(ub)
  505. #
  506. # # 区域统计
  507. # print('区域统计:')
  508. # di_qs = Device_Info.objects.values('area').annotate(c=Count('UID', distinct=True)).order_by()
  509. # for di in di_qs:
  510. # print(di)
  511. #
  512. # # 区域设备类型统计
  513. # print('区域设备类型统计:')
  514. # di_qs = Device_Info.objects.values('area', 'Type').annotate(c=Count('UID', distinct=True)).order_by()
  515. # for di in di_qs:
  516. # print(di)
  517. # return response.json(0)