EquipmentManager.py 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157
  1. import re
  2. import time
  3. import traceback
  4. import threading
  5. import logging
  6. import requests
  7. import simplejson as json
  8. from django.utils import timezone
  9. from Model.models import Device_User, Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel
  10. from django.db.models import Q
  11. from Object.ResponseObject import ResponseObject
  12. from Object.TokenObject import TokenObject
  13. from Service.CommonService import CommonService
  14. from Service.ModelService import ModelService
  15. from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY, BASE_DIR
  16. from Object.ETkObject import ETkObject
  17. import oss2
  18. from django.http import JsonResponse
  19. from Object.RedisObject import RedisObject
  20. from Controller.DetectController import DetectControllerView
  21. # 查询用户设备
  22. def queryUserEquipmentInterface(request):
  23. request.encoding = 'utf-8'
  24. response = ResponseObject()
  25. if request.method == 'POST':
  26. request_dict = request.POST
  27. elif request.method == 'GET':
  28. request_dict = request.GET
  29. else:
  30. return response.json(444)
  31. token = request_dict.get('token', None)
  32. tko = TokenObject(token)
  33. response.lang = tko.lang
  34. if tko.code != 0:
  35. return response.json(tko.code)
  36. userID = tko.userID
  37. if not userID:
  38. return response.json(309)
  39. dvqs = Device_Info.objects.filter(userID_id=userID)
  40. dvdict = CommonService.qs_to_dict(dvqs)
  41. uid_list = Device_Info.objects.filter(userID_id=userID, isShare=False). \
  42. values_list('UID', flat=True)
  43. ubqs = UID_Bucket.objects.filter(uid__in=uid_list). \
  44. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  45. res = []
  46. nowTime = int(time.time())
  47. for p in dvdict['datas']:
  48. p['fields']['vod'] = []
  49. for dm in ubqs:
  50. if p['fields']['UID'] == dm['uid']:
  51. if dm['endTime'] > nowTime:
  52. p['fields']['vod'].append(dm)
  53. # dm['valid'] = 1
  54. # else:
  55. # dm['valid'] = 0
  56. # p['fields']['primaryUserID'] = ''
  57. res.append(p)
  58. return response.json(0, {'datas': res})
  59. def addNewUserEquipmentInterface(request):
  60. request.encoding = 'utf-8'
  61. response = ResponseObject()
  62. if request.method == 'POST':
  63. request_dict = request.POST
  64. elif request.method == 'GET':
  65. request_dict = request.GET
  66. else:
  67. return response.json(444)
  68. token = request_dict.get('token', None)
  69. deviceContent = request_dict.get('content', None)
  70. if not deviceContent:
  71. return response.json(444, 'content')
  72. tko = TokenObject(token)
  73. response.lang = tko.lang
  74. if tko.code != 0:
  75. return response.json(tko.code)
  76. userID = tko.userID
  77. try:
  78. deviceData = json.loads(deviceContent)
  79. UID = deviceData.get('UID', None)
  80. if not UID:
  81. return response.json(444, 'content')
  82. dValid = Device_Info.objects.filter(userID_id=userID, UID=UID)
  83. if dValid:
  84. return response.json(174)
  85. else:
  86. # redisObj = RedisObject(db=8)
  87. # redisObj.del_data(key='uid_qs_' + userID)
  88. UID = deviceData.get('UID', '')
  89. re_uid = re.compile(r'^[A-Za-z0-9]{20}$')
  90. if re_uid.match(UID):
  91. userDevice = Device_Info(id=CommonService.getUserID(getUser=False), userID_id=userID,
  92. **deviceData)
  93. userDevice.save()
  94. if UID == '98UXAA8BRPA35VAL111A':
  95. asy = threading.Thread(target=ModelService.add_log,
  96. args=(CommonService.get_ip_address(request), userID, 'addV0'))
  97. asy.start()
  98. # is_bind = Device_Info.objects.filter(UID=UID, isShare=False)
  99. # # 判断是否有已绑定用户
  100. # if not is_bind.exists():
  101. # userDevice = Device_Info(id=CommonService.getUserID(getUser=False), userID_id=userID,
  102. # **deviceData)
  103. # userDevice.save()
  104. # else:
  105. # # 分享添加
  106. # if 'isShare' in deviceData:
  107. # deviceData['isShare'] = True
  108. # else:
  109. # deviceData['isShare'] = True
  110. # bind_userID = is_bind[0].userID_id
  111. # userDevice = Device_Info(id=CommonService.getUserID(getUser=False),
  112. # userID_id=userID,
  113. # primaryUserID=bind_userID,
  114. # primaryMaster=ModelService.get_user_name(bind_userID),
  115. # **deviceData)
  116. # userDevice.save()
  117. else:
  118. return response.json(444, 'UID')
  119. except Exception as e:
  120. errorInfo = traceback.format_exc()
  121. print('添加设备错误: %s ' % errorInfo)
  122. return response.json(178, repr(e))
  123. else:
  124. sqlDict = CommonService.qs_to_dict([userDevice])
  125. return response.json(0, sqlDict)
  126. def delUserEquipmentInterface(request):
  127. '''
  128. 删除用户设备
  129. :param request:
  130. :return:
  131. '''
  132. response = ResponseObject()
  133. request.encoding = 'utf-8'
  134. if request.method == 'POST':
  135. request_dict = request.POST
  136. elif request.method == 'GET':
  137. request_dict = request.GET
  138. else:
  139. return response.json(444)
  140. token = request_dict.get('token', None)
  141. id = request_dict.get('id', None)
  142. if not id:
  143. return response.json(444, 'id')
  144. tko = TokenObject(token)
  145. response.lang = tko.lang
  146. if tko.code != 0:
  147. return response.json(tko.code)
  148. userID = tko.userID
  149. # 主用户删除设备全部删除
  150. try:
  151. dv_qs = Device_Info.objects.filter(userID_id=userID, id=id)
  152. # redisObj = RedisObject(db=8)
  153. # redisObj.del_data(key='uid_qs_' + userID)
  154. if dv_qs.exists():
  155. uid = dv_qs[0].UID
  156. asy = threading.Thread(target=ModelService.add_log, args=(CommonService.get_ip_address(request), userID, 'deleteV1'))
  157. asy.start()
  158. print('删除')
  159. UID_Preview.objects.filter(uid=uid).delete()
  160. dv_qs.delete()
  161. asy = threading.Thread(target=ModelService.del_eq_info, args=(userID, uid))
  162. asy.start()
  163. except Exception as e:
  164. errorInfo = traceback.format_exc()
  165. print('删除数据库记录错误: %s' % errorInfo)
  166. return response.json(176, repr(e))
  167. else:
  168. return response.json(0)
  169. def modifyUserEquipmentInterface(request):
  170. '''
  171. 修改用户设备
  172. :param request:
  173. :return:
  174. '''
  175. response = ResponseObject()
  176. if request.method == 'POST':
  177. request.encoding = 'utf-8'
  178. request_dict = request.POST
  179. elif request.method == 'GET':
  180. request.encoding = 'utf-8'
  181. request_dict = request.GET
  182. else:
  183. return response.json(444)
  184. token = request_dict.get('token', None)
  185. deviceContent = request_dict.get('content', None)
  186. id = request_dict.get('id', None)
  187. if not deviceContent or not id:
  188. return response.json(444, 'content,id')
  189. tko = TokenObject(token)
  190. response.lang = tko.lang
  191. if tko.code != 0:
  192. return response.json(tko.code)
  193. userID = tko.userID
  194. if userID is None:
  195. return response.json(309)
  196. try:
  197. deviceData = json.loads(deviceContent)
  198. if deviceData.__contains__('userID_id'):
  199. asy = threading.Thread(target=ModelService.update_log,
  200. args=(CommonService.get_ip_address(request), userID, 'modifyV0', deviceData, id))
  201. asy.start()
  202. return response.json(10, '110')
  203. if deviceData.__contains__('UID'):
  204. del deviceData['UID']
  205. dev_info_qs = Device_Info.objects.filter(userID_id=userID, id=id)
  206. dev_info_qs.update(**deviceData)
  207. except Exception as e:
  208. return response.json(177, repr(e))
  209. else:
  210. qs = Device_Info.objects.filter(userID_id=userID, id=id)
  211. res = CommonService.qs_to_dict(qs)
  212. if qs.exists():
  213. uid = qs[0].UID
  214. if uid == '98UXAA8BRPA35VAL111A':
  215. asy = threading.Thread(target=ModelService.update_log,
  216. args=(CommonService.get_ip_address(request), userID, 'modifyV0', deviceContent, id))
  217. asy.start()
  218. nickname = qs[0].NickName
  219. # 增加设备影子信息修改昵称 start
  220. us_qs = UidSetModel.objects.filter(uid=uid)
  221. if us_qs.exists():
  222. us_qs.update(nickname=nickname)
  223. else:
  224. ChannelIndex = qs[0].ChannelIndex
  225. nowTime = int(time.time())
  226. uid_set_create_dict = {
  227. 'uid': uid,
  228. 'addTime': nowTime,
  229. 'updTime': nowTime,
  230. 'ip': CommonService.get_ip_address(request),
  231. 'channel': ChannelIndex,
  232. 'nickname': nickname,
  233. }
  234. UidSetModel.objects.create(**uid_set_create_dict)
  235. Device_Info.objects.filter(UID=uid).update(NickName=nickname)
  236. # redisObj = RedisObject(db=8)
  237. # redisObj.del_data(key='uid_qs_' + userID)
  238. return response.json(0, res)
  239. def showAllUserEquipmentInterface(request, *callback_args, **callback_kwargs):
  240. request.encoding = 'utf-8'
  241. response = ResponseObject()
  242. if request.method == 'POST':
  243. fieldDict = request.POST
  244. elif request.method == 'GET':
  245. fieldDict = request.GET
  246. else:
  247. return response.json(444)
  248. token = request.POST.get('token', None)
  249. type = request.POST.get('type', None)
  250. tko = TokenObject(token)
  251. response.lang = tko.lang
  252. if tko.code != 0:
  253. return response.json(tko.code)
  254. userID = tko.userID
  255. if not userID:
  256. return response.json(309)
  257. own_perm = ModelService.check_perm(userID=userID, permID=30)
  258. if not own_perm:
  259. return response.json(404)
  260. if type == 'PC':
  261. page = int(fieldDict['page'])
  262. line = int(fieldDict['line'])
  263. qs = Device_Info.objects.all()
  264. count = qs.count()
  265. res = qs[(page - 1) * line:page * line]
  266. sqlDict = CommonService.qs_to_dict(query_set=res)
  267. sqlDict['count'] = count
  268. return response.json(0, sqlDict)
  269. else:
  270. qs = Device_Info.objects.all()
  271. res = CommonService.qs_to_dict(qs)
  272. return response.json(0, res)
  273. def findEquipmentInfoInterface(request, *callback_args, **callback_kwargs):
  274. request.encoding = 'utf-8'
  275. response = ResponseObject()
  276. if request.method == 'GET':
  277. fieldDict = request.GET
  278. elif request.method == 'POST':
  279. fieldDict = request.POST
  280. else:
  281. return response.json(444)
  282. deviceContent = fieldDict.get('content', None)
  283. token = fieldDict.get('token', None)
  284. tko = TokenObject(token)
  285. response.lang = tko.lang
  286. if tko.code != 0:
  287. return response.json(tko.code)
  288. if deviceContent:
  289. try:
  290. searchCondition = json.loads(deviceContent)
  291. except Exception as e:
  292. print(repr(e))
  293. return response.json(10, repr(e))
  294. else:
  295. kwargs = CommonService.get_kwargs(data=searchCondition)
  296. qs = Device_Info.objects.filter(**kwargs)
  297. page = int(fieldDict['page'])
  298. line = int(fieldDict['line'])
  299. count = qs.count()
  300. res = qs[(page - 1) * line:page * line]
  301. send_dict = CommonService.qs_to_dict(query_set=res)
  302. for k, v in enumerate(send_dict["datas"]):
  303. for val in res:
  304. if v['pk'] == val.id:
  305. send_dict["datas"][k]['fields']['username'] = \
  306. ModelService.get_user_mark(send_dict["datas"][k]['fields']['userID'])
  307. send_dict["datas"][k]['fields']['primaryusername'] = \
  308. ModelService.get_user_mark(send_dict["datas"][k]['fields']['primaryUserID'])
  309. send_dict['count'] = count
  310. return response.json(0, send_dict)
  311. else:
  312. qs = Device_Info.objects.all()
  313. page = int(fieldDict['page'])
  314. line = int(fieldDict['line'])
  315. count = qs.count()
  316. res = qs[(page - 1) * line:page * line]
  317. send_dict = CommonService.qs_to_dict(query_set=res)
  318. for k, v in enumerate(send_dict["datas"]):
  319. for val in res:
  320. if v['pk'] == val.id:
  321. username = ModelService.get_user_name(send_dict["datas"][k]['fields']['userID'])
  322. send_dict["datas"][k]['fields']['username'] = username
  323. send_dict["datas"][k]['fields']['primaryusername'] = \
  324. ModelService.get_user_mark(send_dict["datas"][k]['fields']['primaryUserID'])
  325. send_dict['count'] = count
  326. return response.json(0, send_dict)
  327. # 添加设备字段
  328. def addInterface(request):
  329. request.encoding = 'utf-8'
  330. response = ResponseObject()
  331. if request.method == 'POST':
  332. request_dict = request.POST
  333. elif request.method == 'GET':
  334. request_dict = request.GET
  335. else:
  336. return response.json(444)
  337. token = request_dict.get('token', None)
  338. UID = request_dict.get('UID', None)
  339. NickName = request_dict.get('NickName', None)
  340. View_Account = request_dict.get('View_Account', None)
  341. View_Password = request_dict.get('View_Password', '')
  342. Type = request_dict.get('Type', None)
  343. ChannelIndex = request_dict.get('ChannelIndex', None)
  344. version = request_dict.get('version', '')
  345. isCheckMainUser = request_dict.get('isCheckMainUser', None)
  346. isMainUserExists = False
  347. if all([UID, NickName, View_Account, Type, ChannelIndex]):
  348. tko = TokenObject(token)
  349. response.lang = tko.lang
  350. if tko.code == 0:
  351. userID = tko.userID
  352. re_uid = re.compile(r'^[A-Za-z0-9]{20}$')
  353. if re_uid.match(UID):
  354. is_exist = Device_Info.objects.filter(UID=UID, userID_id=userID)
  355. if is_exist:
  356. # 判断设备是否已存在
  357. if is_exist[0].isExist == 1:
  358. return response.json(174)
  359. else:
  360. is_exist.delete()
  361. if UID == '98UXAA8BRPA35VAL111A':
  362. asy = threading.Thread(target=ModelService.add_log,
  363. args=(CommonService.get_ip_address(request), userID, 'addV1'))
  364. asy.start()
  365. return response.json(10, 'illegal uid: {uid}'.format(uid=UID))
  366. pass
  367. pk = CommonService.getUserID(getUser=False)
  368. userName = Device_User.objects.get(userID=userID).username
  369. main_exist = Device_Info.objects.filter(UID=UID)
  370. main_exist = main_exist.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID', 'vodPrimaryMaster')
  371. vodPrimaryUserID = userID
  372. vodPrimaryMaster = userName
  373. if main_exist.exists():
  374. vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
  375. vodPrimaryMaster = main_exist[0]['vodPrimaryMaster']
  376. is_bind = Device_Info.objects.filter(UID=UID, isShare=False).values('userID__userID', 'vodPrimaryUserID')
  377. # 判断是否有已绑定用户
  378. isvodPrimaryUserID = ''
  379. for forbind in is_bind:
  380. if forbind['vodPrimaryUserID'] != '':
  381. isvodPrimaryUserID = forbind['vodPrimaryUserID']
  382. # 判断是否有已绑定用户
  383. if is_bind and isCheckMainUser == '1' and isvodPrimaryUserID != userID and isvodPrimaryUserID != '':
  384. res = {
  385. 'id': pk,
  386. 'userID': userID,
  387. 'NickName': NickName,
  388. 'UID': UID,
  389. 'View_Account': View_Account,
  390. 'View_Password': View_Password,
  391. 'ChannelIndex': ChannelIndex,
  392. 'Type': Type,
  393. 'isShare': False,
  394. 'primaryUserID': '',
  395. 'primaryMaster': '',
  396. 'vodPrimaryUserID': vodPrimaryUserID,
  397. 'vodPrimaryMaster': vodPrimaryMaster,
  398. 'data_joined': '',
  399. 'version': version,
  400. 'isVod': 0,
  401. 'isExist': 1,
  402. 'userID__userEmail': ''
  403. }
  404. res['vod'] = [
  405. {
  406. "status": 1,
  407. "channel": ChannelIndex,
  408. "endTime": '',
  409. "bucket__content": '',
  410. "uid": UID
  411. }
  412. ]
  413. res['isMainUserExists'] = 1
  414. return response.json(0, res)
  415. try:
  416. # 判断是否有用户绑定
  417. nowTime = int(time.time())
  418. us_qs = UidSetModel.objects.filter(uid=UID)
  419. if not us_qs.exists():
  420. uid_set_create_dict = {
  421. 'uid': UID,
  422. 'addTime': nowTime,
  423. 'updTime': nowTime,
  424. 'ip': CommonService.get_ip_address(request),
  425. 'channel': ChannelIndex,
  426. 'nickname': NickName,
  427. 'version': version,
  428. }
  429. UidSetModel.objects.create(**uid_set_create_dict)
  430. else:
  431. us_qs.update(nickname=NickName)
  432. userDevice = Device_Info(id=pk, userID_id=userID, UID=UID,
  433. NickName=NickName, View_Account=View_Account,
  434. View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex,
  435. version=version, vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
  436. userDevice.save()
  437. Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
  438. vodPrimaryMaster=vodPrimaryMaster)
  439. # redisObj = RedisObject(db=8)
  440. # redisObj.del_data(key='uid_qs_' + userID)
  441. except Exception as e:
  442. return response.json(10, repr(e))
  443. else:
  444. dvqs = Device_Info.objects.filter(id=pk).values('id', 'userID', 'NickName', 'UID',
  445. 'View_Account',
  446. 'View_Password', 'ChannelIndex', 'Type',
  447. 'isShare',
  448. 'primaryUserID', 'primaryMaster', 'vodPrimaryUserID', 'vodPrimaryMaster', 'userID__userEmail',
  449. 'data_joined', 'version',
  450. 'isVod', 'isExist', 'isCameraOpenCloud')
  451. dvql = CommonService.qs_to_list(dvqs)
  452. ubqs = UID_Bucket.objects.filter(uid=UID). \
  453. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  454. res = dvql[0]
  455. res['vod'] = list(ubqs)
  456. if isMainUserExists:
  457. res['isMainUserExists'] = 1
  458. return response.json(0, res)
  459. else:
  460. return response.json(444, {'param': 'UID'})
  461. else:
  462. return response.json(tko.code)
  463. else:
  464. return response.json(444, {'param': 'UID,NickName,View_Account,View_Password,Type,ChannelIndex,version'})
  465. # 添加设备字段
  466. def judgeInterface(request):
  467. request.encoding = 'utf-8'
  468. response = ResponseObject()
  469. if request.method == 'POST':
  470. request_dict = request.POST
  471. elif request.method == 'GET':
  472. request_dict = request.GET
  473. else:
  474. return response.json(444)
  475. token = request_dict.get('token', None)
  476. uid = request_dict.get('uid', None)
  477. if all([uid, token]):
  478. tko = TokenObject(token)
  479. response.lang = tko.lang
  480. if tko.code == 0:
  481. re_uid = re.compile(r'^[A-Za-z0-9]{20}$')
  482. if re_uid.match(uid):
  483. is_bind = Device_Info.objects.filter(UID=uid, isShare=False)
  484. # 判断是否有已绑定用户
  485. if is_bind:
  486. qs = is_bind.values('userID__NickName', 'NickName')
  487. nickname = qs[0]['NickName']
  488. us_qs = UidSetModel.objects.filter(uid=uid).values('nickname')
  489. if us_qs.exists():
  490. nickname = us_qs[0]['NickName']
  491. res = {
  492. 'bind_user': qs[0]['userID__NickName'],
  493. 'bind_device_name': nickname,
  494. }
  495. return response.json(15, res=res)
  496. else:
  497. return response.json(0, 'no bind user')
  498. else:
  499. return response.json(444, {'param': 'UID'})
  500. else:
  501. return response.json(tko.code)
  502. else:
  503. return response.json(444, {'param': 'UID,NickName,View_Account,View_Password,Type,ChannelIndex'})
  504. # 管理员添加
  505. def admin_addInterface(request):
  506. request.encoding = 'utf-8'
  507. response = ResponseObject()
  508. if request.method == 'POST':
  509. request_dict = request.POST
  510. elif request.method == 'GET':
  511. request_dict = request.GET
  512. else:
  513. return response.json(444)
  514. token = request_dict.get('token', None)
  515. deviceContent = request_dict.get('content', None)
  516. ipdizhi = request_dict.get('ipdizhi', None)
  517. username = request_dict.get('username', None)
  518. if not username:
  519. return response.json(444, 'username')
  520. if not deviceContent:
  521. return response.json(444, 'content')
  522. tko = TokenObject(token)
  523. response.lang = tko.lang
  524. if tko.code != 0:
  525. return response.json(tko.code)
  526. userID = tko.userID
  527. own_perm = ModelService.check_perm(userID, 40)
  528. # 权限判断
  529. if own_perm is not True:
  530. return response.json(404)
  531. # 查询id
  532. user = Device_User.objects.filter(Q(username=username) | Q(phone=username) | Q(userEmail=username))
  533. if user.exists():
  534. user_dict = CommonService.qs_to_dict(user)
  535. userID = user_dict.get('datas')[0].get('pk')
  536. else:
  537. return response.json(104)
  538. print(deviceContent)
  539. try:
  540. deviceData = json.loads(deviceContent)
  541. UID = deviceData.get('UID', None)
  542. if not UID:
  543. return response.json(444, 'content')
  544. dValid = Device_Info.objects.filter(userID_id=userID, UID=UID)
  545. if dValid:
  546. return response.json(174)
  547. else:
  548. UID = deviceData.get('UID', '')
  549. re_uid = re.compile(r'^[A-Za-z0-9]{20}$')
  550. # redisObj = RedisObject(db=8)
  551. # redisObj.del_data(key='uid_qs_' + userID)
  552. if re_uid.match(UID):
  553. userDevice = Device_Info(id=CommonService.getUserID(getUser=False), userID_id=userID,
  554. **deviceData)
  555. userDevice.save()
  556. file_path = '/'.join((BASE_DIR, 'static/test.log'))
  557. file = open(file_path, 'a+')
  558. file.write(ipdizhi + "; username:" + username + "; time:" + time.strftime("%Y-%m-%d %H:%M:%S",
  559. time.localtime()))
  560. file.write('\n')
  561. file.flush()
  562. file.close()
  563. # is_bind = Device_Info.objects.filter(UID=UID, isShare=False)
  564. # # 判断是否有已绑定用户
  565. # if not is_bind.exists():
  566. # userDevice = Device_Info(id=CommonService.getUserID(getUser=False), userID_id=userID,
  567. # **deviceData)
  568. # userDevice.save()
  569. # else:
  570. # # 分享添加
  571. # if 'isShare' in deviceData:
  572. # deviceData['isShare'] = True
  573. # else:
  574. # deviceData['isShare'] = True
  575. # bind_userID = is_bind[0].userID_id
  576. # userDevice = Device_Info(id=CommonService.getUserID(getUser=False),
  577. # userID_id=userID,
  578. # primaryUserID=bind_userID,
  579. # primaryMaster=ModelService.get_user_name(bind_userID),
  580. # **deviceData)
  581. # userDevice.save()
  582. else:
  583. return response.json(444, 'UID')
  584. except Exception as e:
  585. errorInfo = traceback.format_exc()
  586. print('添加设备错误: %s ' % errorInfo)
  587. return response.json(178, repr(e))
  588. else:
  589. sqlDict = CommonService.qs_to_dict([userDevice])
  590. return response.json(0, sqlDict)
  591. # 超级管理员修改设备
  592. def admin_modifyInterface(request):
  593. response = ResponseObject()
  594. if request.method == 'POST':
  595. request.encoding = 'utf-8'
  596. request_dict = request.POST
  597. elif request.method == 'GET':
  598. request.encoding = 'utf-8'
  599. request_dict = request.GET
  600. else:
  601. return response.json(444)
  602. token = request_dict.get('token', None)
  603. deviceContent = request_dict.get('content', None)
  604. username = request_dict.get('username', None)
  605. if not username:
  606. return response.json(444, 'username')
  607. id = request_dict.get('id', None)
  608. print(deviceContent)
  609. if not deviceContent or not id:
  610. return response.json(444, 'content,id')
  611. tko = TokenObject(token)
  612. response.lang = tko.lang
  613. if tko.code != 0:
  614. return response.json(tko.code)
  615. userID = tko.userID
  616. if userID is None:
  617. return response.json(309)
  618. own_perm = ModelService.check_perm(userID, 50)
  619. # 权限判断
  620. if own_perm is not True:
  621. return response.json(404)
  622. deviceData = json.loads(deviceContent)
  623. print(deviceData['UID'])
  624. # redisObj = RedisObject(db=8)
  625. # redisObj.del_data(key='uid_qs_' + userID)
  626. dValid = Device_Info.objects.filter(userID_id=userID, UID=deviceData['UID'])
  627. if dValid.exists():
  628. dValid_dict = CommonService.qs_to_dict(dValid)
  629. print(dValid_dict.get('datas')[0].get('pk'))
  630. if dValid_dict.get('datas')[0].get('pk') == id:
  631. print('可以编辑')
  632. else:
  633. return response.json(174)
  634. # 查询id
  635. user = Device_User.objects.filter(Q(username=username) | Q(phone=username) | Q(userEmail=username))
  636. if user.exists():
  637. user_dict = CommonService.qs_to_dict(user)
  638. userID = user_dict.get('datas')[0].get('pk')
  639. try:
  640. # 更改的时间
  641. update_time = timezone.localtime(timezone.now())
  642. Device_Info.objects.filter(userID_id=userID, id=id).update(update_time=update_time, **deviceData)
  643. except Exception as e:
  644. return response.json(177, repr(e))
  645. else:
  646. qs = Device_Info.objects.filter(userID_id=userID, id=id)
  647. res = CommonService.qs_to_dict(qs)
  648. return response.json(0, res)
  649. else:
  650. # 查询id
  651. user = Device_User.objects.filter(Q(username=username) | Q(phone=username) | Q(userEmail=username))
  652. if user.exists():
  653. user_dict = CommonService.qs_to_dict(user)
  654. userID = user_dict.get('datas')[0].get('pk')
  655. try:
  656. # 更改的时间
  657. update_time = timezone.localtime(timezone.now())
  658. Device_Info.objects.filter(userID_id=userID, id=id).update(update_time=update_time, **deviceData)
  659. except Exception as e:
  660. return response.json(177, repr(e))
  661. else:
  662. qs = Device_Info.objects.filter(userID_id=userID, id=id)
  663. res = CommonService.qs_to_dict(qs)
  664. return response.json(0, res)
  665. # 新删除设备
  666. def deleteInterface(request):
  667. '''
  668. 删除用户设备
  669. :param request:
  670. :return:
  671. '''
  672. response = ResponseObject()
  673. request.encoding = 'utf-8'
  674. if request.method == 'POST':
  675. request_dict = request.POST
  676. elif request.method == 'GET':
  677. request_dict = request.GET
  678. else:
  679. return response.json(444)
  680. token = request_dict.get('token', None)
  681. id = request_dict.get('id', None)
  682. if not id:
  683. return response.json(444, 'id')
  684. tko = TokenObject(token)
  685. response.lang = tko.lang
  686. if tko.code != 0:
  687. return response.json(tko.code)
  688. userID = tko.userID
  689. # 主用户删除设备全部删除
  690. if not userID:
  691. return response.json(309)
  692. try:
  693. dv_qs = Device_Info.objects.filter(userID_id=userID, id=id)
  694. if dv_qs.exists():
  695. uid = dv_qs[0].UID
  696. asy = threading.Thread(target=ModelService.delete_log,
  697. args=(CommonService.get_ip_address(request), userID, 'deleteV2', uid))
  698. asy.start()
  699. if dv_qs[0].isShare:
  700. dv_qs.delete()
  701. else:
  702. # a.主用户删除设备
  703. dv_qs.delete()
  704. # 删除设备影子信息uid_set 外键关联删除设备推送配置信息 uid_push
  705. up_qs = UidPushModel.objects.filter(uid_set__uid=uid)
  706. DetectControllerView().do_delete_redis(uid)
  707. if up_qs.count() > 1:
  708. UidPushModel.objects.filter(uid_set__uid=uid, userID_id=userID).delete()
  709. redisObj = RedisObject(db=6, SERVER_HOST='push.dvema.com')
  710. ykey = '{uid}_redis_qs'.format(uid=uid)
  711. if ykey:
  712. redisObj.del_data(key=ykey)
  713. else:
  714. up_qs.delete()
  715. # b.分享获得用户假删除
  716. ud_dv_qs = Device_Info.objects.filter(UID=uid, isShare=True, primaryUserID=userID)
  717. if ud_dv_qs.exists():
  718. ud_dv_qs.update(isExist=0)
  719. # 异步删除推送消息
  720. asy = threading.Thread(target=ModelService.del_eq_info, args=(userID, uid))
  721. asy.start()
  722. # redisObj = RedisObject(db=8)
  723. # redisObj.del_data(key='uid_qs_' + userID)
  724. else:
  725. return response.json(14)
  726. except Exception as e:
  727. errorInfo = traceback.format_exc()
  728. print('删除数据库记录错误: %s' % errorInfo)
  729. return response.json(176, repr(e))
  730. else:
  731. return response.json(0)
  732. # 新查询设备字段
  733. def queryInterface(request):
  734. request.encoding = 'utf-8'
  735. response = ResponseObject()
  736. if request.method == 'POST':
  737. request_dict = request.POST
  738. elif request.method == 'GET':
  739. request_dict = request.GET
  740. else:
  741. return response.json(444)
  742. token = request_dict.get('token', None)
  743. page = request_dict.get('page', None)
  744. line = request_dict.get('line', None)
  745. NickName = request_dict.get('NickName', None)
  746. uid = request_dict.get('uid', None)
  747. page = int(page)
  748. line = int(line)
  749. tko = TokenObject(token)
  750. response.lang = tko.lang
  751. if page <= 0:
  752. return response.json(0)
  753. if tko.code == 0:
  754. userID = tko.userID
  755. dvqs = Device_Info.objects.filter(userID_id=userID)
  756. # # 已重置的设备
  757. # dvqs = dvqs.filter(~Q(isExist=2))
  758. if NickName:
  759. dvqs = dvqs.filter(NickName__icontains=NickName)
  760. if uid:
  761. dvqs = dvqs.filter(UID=uid)
  762. # count = dvqs.count()
  763. dvql = dvqs[(page - 1) * line:page * line].values('id', 'userID', 'NickName', 'UID', 'View_Account',
  764. 'View_Password', 'ChannelIndex', 'Type', 'isShare',
  765. 'primaryUserID', 'primaryMaster', 'data_joined', 'version', 'vodPrimaryUserID', 'vodPrimaryMaster', 'userID__userEmail',
  766. 'isVod', 'isExist', 'NotificationMode', 'isCameraOpenCloud')
  767. dvls = CommonService.qs_to_list(dvql)
  768. uid_list = []
  769. for dvl in dvls:
  770. if dvl['primaryUserID'] and dvl['id'] == dvl['primaryUserID']:
  771. dvl['isPrimaryUser'] = 1
  772. else:
  773. dvl['isPrimaryUser'] = 0
  774. uid_list.append(dvl['UID'])
  775. # if dvl['isShare'] is False:
  776. # uid_list.append(dvl['UID'])
  777. ubqs = UID_Bucket.objects.filter(uid__in=uid_list). \
  778. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  779. upqs = UID_Preview.objects.filter(uid__in=uid_list).order_by('channel').values('id', 'uid', 'channel')
  780. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  781. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  782. nowTime = int(time.time())
  783. data = []
  784. # 设备拓展信息表
  785. us_qs = UidSetModel.objects.filter(uid__in=uid_list).\
  786. values('uid', 'version', 'nickname', 'detect_interval')
  787. uv_dict = {}
  788. for us in us_qs:
  789. uv_dict[us['uid']] = {'version': us['version'],
  790. 'nickname': us['nickname'],
  791. 'detect_interval': us['detect_interval']}
  792. for p in dvls:
  793. p['vod'] = []
  794. for dm in ubqs:
  795. if p['UID'] == dm['uid']:
  796. if dm['endTime'] > nowTime:
  797. p['vod'].append(dm)
  798. p['preview'] = []
  799. for up in upqs:
  800. if p['UID'] == up['uid']:
  801. obj = 'uid_preview/{uid}/channel_{channel}.png'.\
  802. format(uid=up['uid'], channel=up['channel'])
  803. img_sign = bucket.sign_url('GET', obj, 300)
  804. p['preview'].append(img_sign)
  805. p_uid = p['UID']
  806. if p_uid in uv_dict:
  807. # 设备版本号
  808. p['uid_version'] = uv_dict[p_uid]['version']
  809. p['detect_interval'] = uv_dict[p_uid]['detect_interval']
  810. # 设备昵称 调用影子信息昵称,先阶段不可
  811. if uv_dict[p_uid]['nickname']:
  812. p['NickName'] = uv_dict[p_uid]['nickname']
  813. else:
  814. # 设备版本号
  815. p['uid_version'] = ''
  816. data.append(p)
  817. return response.json(0, data)
  818. else:
  819. return response.json(tko.code)
  820. def uid_status(request):
  821. request.encoding = 'utf-8'
  822. response = ResponseObject()
  823. if request.method == 'POST':
  824. request_dict = request.POST
  825. elif request.method == 'GET':
  826. request_dict = request.GET
  827. else:
  828. return response.json(444)
  829. token = request_dict.get('token', None)
  830. uid = request_dict.get('uid', None)
  831. tko = TokenObject(token)
  832. response.lang = tko.lang
  833. if tko.code != 0:
  834. return response.json(tko.code)
  835. userID = tko.userID
  836. # 调试
  837. logger = logging.getLogger('django')
  838. debugOne = int(time.time())
  839. # 判断用户是否绑定设备
  840. qs = UidSetModel.objects.filter(uid=uid).values('uid', 'detect_status', 'detect_interval', 'version', 'ucode',
  841. 'p2p_region', 'tz', 'video_code', 'channel', 'cloud_vod', 'id',
  842. 'detect_group', 'is_alexa', 'region_alexa')
  843. # 调试
  844. debugOnes = int(time.time())
  845. logger.error('————————debugOne_sec:', debugOnes - debugOne)
  846. # 判断uid配置表信息是否存在
  847. if qs.exists():
  848. # 获取uid推送是否添加过
  849. us_id = qs[0]['id']
  850. # 调试
  851. debugTwo = int(time.time())
  852. if UidPushModel.objects.filter(uid_set_id=us_id, userID_id=userID).exists():
  853. detect_status = qs[0]['detect_status']
  854. else:
  855. detect_status = 0
  856. data = {
  857. 'push_status': detect_status, # 推送状态
  858. 'push_interval': qs[0]['detect_interval'], # 推送间隔
  859. 'ucode': qs[0]['ucode'],
  860. 'version': qs[0]['version'],
  861. 'p2p_region': qs[0]['p2p_region'],
  862. 'tz': qs[0]['tz'],
  863. 'video_code': qs[0]['video_code'],
  864. 'channel': qs[0]['channel'],
  865. 'cloud_vod': qs[0]['cloud_vod'],
  866. 'detect_group': qs[0]['detect_group'], # 推送组
  867. 'is_alexa': qs[0]['is_alexa'], # 推送组
  868. 'region_alexa': qs[0]['region_alexa'], # 推送组
  869. }
  870. # 调试
  871. debugTwos = int(time.time())
  872. logger.error('————————debugTwo_sec:', debugTwos - debugTwo)
  873. # 调试
  874. debugThere = int(time.time())
  875. # 查询云存储相关信息
  876. ubqs = UID_Bucket.objects.filter(uid=uid). \
  877. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  878. # 调试
  879. debugTheres = int(time.time())
  880. logger.error('————————debugTheres_sec:', debugTheres - debugThere)
  881. nowTime = int(time.time())
  882. if ubqs.exists():
  883. if ubqs[0]['endTime'] > nowTime:
  884. data['vod'] = list(ubqs)
  885. return response.json(0, data)
  886. else:
  887. return response.json(0)
  888. def uid_status_test(request):
  889. request.encoding = 'utf-8'
  890. response = ResponseObject()
  891. if request.method == 'POST':
  892. request_dict = request.POST
  893. elif request.method == 'GET':
  894. request_dict = request.GET
  895. else:
  896. return response.json(444)
  897. token = request_dict.get('token', None)
  898. uid = request_dict.get('uid', None)
  899. tko = TokenObject(token)
  900. response.lang = tko.lang
  901. if tko.code != 0:
  902. return response.json(tko.code)
  903. userID = tko.userID
  904. # 判断用户是否绑定设备
  905. print(100000000000)
  906. qs = UidSetModel.objects.filter(uid=uid).values('uid', 'detect_status', 'detect_interval', 'version', 'ucode',
  907. 'p2p_region', 'tz', 'video_code', 'channel', 'cloud_vod', 'id',
  908. 'detect_group', 'is_alexa', 'region_alexa')
  909. # 判断uid配置表信息是否存在
  910. if qs.exists():
  911. # 获取uid推送是否添加过
  912. print(1111111111111)
  913. us_id = qs[0]['id']
  914. if UidPushModel.objects.filter(uid_set_id=us_id, userID_id=userID).exists():
  915. detect_status = qs[0]['detect_status']
  916. else:
  917. detect_status = 0
  918. data = {
  919. 'push_status': detect_status, # 推送状态
  920. 'push_interval': qs[0]['detect_interval'], # 推送间隔
  921. 'ucode': qs[0]['ucode'],
  922. 'version': qs[0]['version'],
  923. 'p2p_region': qs[0]['p2p_region'],
  924. 'tz': qs[0]['tz'],
  925. 'video_code': qs[0]['video_code'],
  926. 'channel': qs[0]['channel'],
  927. 'cloud_vod': qs[0]['cloud_vod'],
  928. 'detect_group': qs[0]['detect_group'], # 推送组
  929. 'is_alexa': qs[0]['is_alexa'], # 推送组
  930. 'region_alexa': qs[0]['region_alexa'], # 推送组
  931. }
  932. print(22222222222)
  933. # 查询云存储相关信息
  934. ubqs = UID_Bucket.objects.filter(uid=uid). \
  935. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  936. nowTime = int(time.time())
  937. if ubqs.exists():
  938. if ubqs[0]['endTime'] > nowTime:
  939. data['vod'] = list(ubqs)
  940. print(3333333333333)
  941. return response.json(0, data)
  942. else:
  943. return response.json(0)
  944. def update_uid_set(request):
  945. request.encoding = 'utf-8'
  946. response = ResponseObject()
  947. if request.method == 'POST':
  948. request_dict = request.POST
  949. elif request.method == 'GET':
  950. request_dict = request.GET
  951. else:
  952. return response.json(444)
  953. token = request_dict.get('token', None)
  954. uid = request_dict.get('uid', None)
  955. version = request_dict.get('version', '')
  956. ucode = request_dict.get('ucode', '')
  957. tko = TokenObject(token)
  958. response.lang = tko.lang
  959. if tko.code == 0:
  960. userID = tko.userID
  961. nowTime = int(time.time())
  962. dvqs = Device_Info.objects.filter(userID_id=userID)
  963. # redisObj = RedisObject(db=8)
  964. # redisObj.del_data(key='uid_qs_' + userID)
  965. if dvqs.exists():
  966. us_qs = UidSetModel.objects.filter(uid=uid)
  967. if us_qs.exists():
  968. uid_set_update_dict = {
  969. 'updTime': nowTime,
  970. 'version': version,
  971. 'ucode': ucode,
  972. }
  973. us_qs.update(**uid_set_update_dict)
  974. else:
  975. uid_set_create_dict = {
  976. 'uid': uid,
  977. 'addTime': nowTime,
  978. 'updTime': nowTime,
  979. 'version': version,
  980. 'ucode': ucode,
  981. }
  982. UidSetModel.objects.create(**uid_set_create_dict)
  983. return response.json(0)
  984. else:
  985. return response.json(14)
  986. else:
  987. return response.json(tko.code)
  988. # 测试环境
  989. # test.shadow.dvema.com
  990. # 生产环境
  991. # shadow.dvema.com
  992. # http://test.dvema.com/deviceShadow/update?etk=JVJWbFpFU0VOV1FsbEVTMFpOU2xKWFFURXhNVUU9Xz0=&ucode=1234&version=1324&p2p_region=CN
  993. # 设备影子更新
  994. def update_device_shadow(request):
  995. request.encoding = 'utf-8'
  996. response = ResponseObject()
  997. if request.method == 'POST':
  998. request_dict = request.POST
  999. elif request.method == 'GET':
  1000. request_dict = request.GET
  1001. else:
  1002. return response.json(444)
  1003. etk = request_dict.get('etk', None)
  1004. eto = ETkObject(etk)
  1005. uid = eto.uid
  1006. if uid:
  1007. # 重置按钮
  1008. is_reset = request_dict.get('is_reset', None)
  1009. # 传1则重置设备信息
  1010. if is_reset == '1':
  1011. UidSetModel.objects.filter(uid=uid).delete()
  1012. # 重置设备,判断设备为已删除
  1013. nowTime = int(time.time())
  1014. uid_bucket = UID_Bucket.objects.filter(uid=uid, endTime__gte=nowTime).values('id', 'has_unused').order_by('addTime')
  1015. if not uid_bucket.exists():
  1016. di_qs = Device_Info.objects.filter(UID=uid)
  1017. di_qs.update(isExist=2)
  1018. # 清除redis缓存
  1019. # data = di_qs.values()
  1020. # redisObj = RedisObject(db=8)
  1021. # for di in data:
  1022. # key = 'uid_qs_' + di['userID_id']
  1023. # redis_value = redisObj.get_data(key=key)
  1024. # if redis_value is not False:
  1025. # redisObj.del_data(key)
  1026. ucode = request_dict.get('ucode', None)
  1027. version = request_dict.get('version', None)
  1028. p2p_region = request_dict.get('p2p_region', None)
  1029. tz = request_dict.get('tz', None)
  1030. video_code = request_dict.get('video_code', None)
  1031. ip = CommonService.get_ip_address(request)
  1032. channel = request_dict.get('channel', None)
  1033. cloud_vod = request_dict.get('cloud_vod', None)
  1034. push_status = request_dict.get('push_status', None)
  1035. pwd = request_dict.get('pwd', None)
  1036. resetTime = request_dict.get('resetTime', None)
  1037. is_alexa = request_dict.get('is_alexa', None)
  1038. us_qs = UidSetModel.objects.filter(uid=uid)
  1039. # 更新
  1040. nowTime = int(time.time())
  1041. print('-------')
  1042. print(resetTime)
  1043. print('-------')
  1044. qs_dict = {
  1045. 'updTime': nowTime,
  1046. 'ip': ip
  1047. }
  1048. if channel:
  1049. qs_dict['channel'] = channel
  1050. if p2p_region:
  1051. qs_dict['p2p_region'] = p2p_region
  1052. if ucode:
  1053. qs_dict['ucode'] = ucode
  1054. if version:
  1055. qs_dict['version'] = version
  1056. if tz:
  1057. qs_dict['tz'] = tz
  1058. if video_code:
  1059. qs_dict['video_code'] = video_code
  1060. if cloud_vod:
  1061. qs_dict['cloud_vod'] = cloud_vod
  1062. if push_status:
  1063. qs_dict['detect_status'] = push_status
  1064. if pwd:
  1065. qs_dict['pwd'] = pwd
  1066. if is_alexa:
  1067. qs_dict['is_alexa'] = is_alexa
  1068. if us_qs.exists():
  1069. us_qs.update(**qs_dict)
  1070. # 如果推送状态开启,返回推送url
  1071. return JsonResponse(status=200, data={'code': 0, 'msg': 'success', 'data': {}})
  1072. # 新增
  1073. else:
  1074. qs_dict['uid'] = uid
  1075. qs_dict['addTime'] = nowTime
  1076. UidSetModel.objects.create(**qs_dict)
  1077. # 如果推送状态开启,返回推送url
  1078. return JsonResponse(status=200, data={'code': 0, 'msg': 'success', 'data': {}})
  1079. else:
  1080. return JsonResponse(status=200, data={'code': 403, 'msg': 'error etk'})