shareUserPermission.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import time
  4. from django.core import serializers
  5. import traceback, simplejson as json
  6. from django.views.generic.base import View
  7. from django.views.decorators.csrf import csrf_exempt
  8. from django.utils.decorators import method_decorator
  9. from Model.models import Device_User, Device_Info, Role, UserExModel, DeviceUserPermissions, DeviceSharePermission, \
  10. UidSetModel, UidPushModel, GatewayPush
  11. from Service.CommonService import CommonService
  12. from Object.ResponseObject import ResponseObject
  13. from Object.TokenObject import TokenObject
  14. from django.db.models import Q
  15. from Service.ModelService import ModelService
  16. from Object.RedisObject import RedisObject
  17. class searchUserView(View):
  18. @method_decorator(csrf_exempt)
  19. def dispatch(self, *args, **kwargs):
  20. return super(searchUserView, self).dispatch(*args, **kwargs)
  21. def post(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. fieldDict = request.POST
  24. return self.validations(fieldDict, args, kwargs)
  25. def get(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. fieldDict = request.GET
  28. return self.validations(fieldDict, args, kwargs)
  29. def searchUserSQL(self, fieldDict, response, *args, **kwargs):
  30. if 'username' in fieldDict.keys():
  31. username = fieldDict.get('username', None)
  32. User = Device_User.objects.filter(
  33. Q(username=username) | Q(phone=username) | Q(userEmail=username)).order_by('-data_joined')
  34. elif 'userEmail' in fieldDict.keys():
  35. email = fieldDict.get('userEmail', None)
  36. User = Device_User.objects.filter(Q(userEmail=email) | Q(username=email)).order_by('-data_joined')
  37. elif 'userID' in fieldDict.keys():
  38. userID = fieldDict.get('userID', None)
  39. User = Device_User.objects.filter(userID=userID).order_by('-data_joined')
  40. elif 'roleName' in fieldDict.keys():
  41. roleName = fieldDict.get('roleName', None)
  42. User = Device_User.objects.filter(role__roleName__contains=roleName).order_by('-data_joined')
  43. else:
  44. User = Device_User.objects.filter(**fieldDict).order_by('-data_joined')
  45. if User.exists():
  46. ddUser = User[0].device_info_set.all()
  47. sqlJSON = serializers.serialize('json', User)
  48. sqlList = json.loads(sqlJSON)
  49. if ddUser:
  50. sqlJSON1 = serializers.serialize('json', ddUser)
  51. sqlList1 = json.loads(sqlJSON1)
  52. device_Info_dict = {}
  53. device_Info_list = []
  54. for eachJson1 in sqlList1:
  55. device_Info_dict['primaryUserID'] = eachJson1['fields']['primaryUserID']
  56. device_Info_dict['Type'] = eachJson1['fields']['Type']
  57. device_Info_dict['UID'] = eachJson1['fields']['UID']
  58. device_Info_dict['pk'] = eachJson1['pk']
  59. device_Info_dict['NickName'] = eachJson1['fields']['NickName']
  60. device_Info_dict['View_Password'] = eachJson1['fields']['View_Password']
  61. device_Info_dict['View_Account'] = eachJson1['fields']['View_Account']
  62. device_Info_dict['Online'] = eachJson1['fields']['Online']
  63. device_Info_dict['EventNotification'] = eachJson1['fields']['EventNotification']
  64. device_Info_dict['ChannelIndex'] = eachJson1['fields']['ChannelIndex']
  65. device_Info_dict['EventNotification'] = eachJson1['fields']['EventNotification']
  66. device_Info_dict['NotificationMode'] = eachJson1['fields']['NotificationMode']
  67. device_Info_list.append(device_Info_dict)
  68. device_Info_dict = {}
  69. sqlList[0]['device_info'] = device_Info_list
  70. else:
  71. sqlList[0]['device_info'] = []
  72. if sqlList[0]['fields']['username'] is None:
  73. sqlList[0]['fields']['username'] = ''
  74. if sqlList[0]['fields']['userEmail'] is None:
  75. sqlList[0]['fields']['userEmail'] = ''
  76. sqlDict = dict(zip(["datas"], [sqlList]))
  77. return response.json(0, sqlDict)
  78. else:
  79. return response.json(104)
  80. def searchUserPCSQL(self, fieldDict, response):
  81. try:
  82. page = int(fieldDict['page'])
  83. line = int(fieldDict['line'])
  84. fieldDict.pop('page')
  85. fieldDict.pop('line')
  86. fieldDict.pop('type')
  87. if len(fieldDict) > 0:
  88. searchCondition = CommonService.get_kwargs(data=fieldDict)
  89. qs = Device_User.objects.filter(**searchCondition).order_by('-data_joined')
  90. else:
  91. qs = Device_User.objects.all().order_by('-data_joined')
  92. except Exception as e:
  93. errorInfo = traceback.format_exc()
  94. print('查询数据库错误: %s' % errorInfo)
  95. return response.json(500, {"details": repr(e)})
  96. else:
  97. if qs:
  98. device_user_count = qs.count()
  99. device_user_res = qs[(page - 1) * line:page * line]
  100. sqlDict = CommonService.qs_to_dict(device_user_res)
  101. redisObj = RedisObject()
  102. for k, v in enumerate(sqlDict["datas"]):
  103. for val in device_user_res:
  104. if v['pk'] == val.userID:
  105. dvqs = val.device_info_set.all()
  106. device_info_list = CommonService.qs_to_dict(dvqs)
  107. # device_user关联到device_info
  108. sqlDict["datas"][k]['device_info'] = device_info_list
  109. if len(v['fields']['role']) > 0:
  110. role_query_set = Role.objects.get(rid=v['fields']['role'][0])
  111. sqlDict["datas"][k]['fields']['role'].append(role_query_set.roleName)
  112. if redisObj.get_data(key=v['pk']):
  113. sqlDict["datas"][k]['fields']['online'] = True
  114. else:
  115. sqlDict["datas"][k]['fields']['online'] = False
  116. ue = UserExModel.objects.filter(userID=v['pk'])
  117. if ue.exists():
  118. sqlDict["datas"][k]['fields']['appBundleId'] = ue[0].appBundleId
  119. else:
  120. sqlDict["datas"][k]['fields']['appBundleId'] = ''
  121. sqlDict['count'] = device_user_count
  122. return response.json(0, sqlDict)
  123. else:
  124. return response.json(0, {"datas": ""})
  125. def validations(self, fieldDict, *args, **kwargs):
  126. token = fieldDict.get('token', None)
  127. response = ResponseObject()
  128. tko = TokenObject(token)
  129. response.lang = tko.lang
  130. if tko.code != 0:
  131. return response.json(tko.code)
  132. fieldDict = fieldDict.dict()
  133. fieldDict.pop('token')
  134. type = fieldDict.get('type', None)
  135. if type == 'PC':
  136. return self.searchUserPCSQL(fieldDict, response)
  137. else:
  138. return self.searchUserSQL(fieldDict, response, args, kwargs)
  139. class shareUserEquipmentView(View):
  140. @method_decorator(csrf_exempt)
  141. def dispatch(self, *args, **kwargs):
  142. return super(shareUserEquipmentView, self).dispatch(*args, **kwargs)
  143. def post(self, request, *args, **kwargs):
  144. request.encoding = 'utf-8'
  145. queryDict = request.POST
  146. return self.shareUser(queryDict, args, kwargs)
  147. def get(self, request, *args, **kwargs):
  148. request.encoding = 'gb2312'
  149. queryDict = request.GET
  150. return self.shareUser(queryDict, args, kwargs)
  151. def shareUser(self, queryDict, *args, **kwargs):
  152. token = queryDict.get('token', None)
  153. GuestID = queryDict.get('guestID', None)
  154. content = queryDict.get('content', None)
  155. sharedAll = queryDict.get('sharedAll', False)
  156. permission_ids = queryDict.get('permissionIds', None)
  157. if sharedAll in ('1', '0'):
  158. sharedAll = bool(int(sharedAll))
  159. elif sharedAll in ('true', 'false'):
  160. if sharedAll == 'true':
  161. sharedAll = 1
  162. else:
  163. sharedAll = 0
  164. response = ResponseObject()
  165. if not GuestID:
  166. return response.json(444, 'GuestID')
  167. tko = TokenObject(token)
  168. response.lang = tko.lang
  169. if tko.code != 0:
  170. return response.json(tko.code)
  171. MasterID = tko.userID
  172. if sharedAll and MasterID != None:
  173. return self.shareUserSQL(MasterID, GuestID, True, permission_ids, response, args, kwargs)
  174. if content != None and MasterID != None:
  175. return self.shareUserSQL(MasterID, GuestID, False, permission_ids, response, args, content=content)
  176. else:
  177. return response.json(444, 'sharedAll or content')
  178. def shareUserSQL(self, MasterID, GuestID, sharedAll, permission_ids, response, *args, **kwargs):
  179. Guest = Device_User.objects.filter(userID=GuestID).order_by('-data_joined')
  180. Master = Device_Info.objects.filter(userID_id=MasterID).order_by('-data_joined')
  181. if not Master or not Guest:
  182. return response.json(104)
  183. querysetList = []
  184. permission_list = []
  185. uid_push_list = []
  186. p_ids = [int(val) for val in permission_ids.split(',')] if permission_ids else []
  187. now_time = int(time.time())
  188. dictLen = 0
  189. if sharedAll:
  190. for equipment in Master:
  191. eqDict = equipment.model_to_dict(exclude=['id', 'data_joined', 'primaryUserID'])
  192. shareEquipment = Device_Info.objects.filter(userID_id=GuestID, primaryUserID= \
  193. MasterID, UID=eqDict.get('UID', None)).order_by('-data_joined')
  194. if shareEquipment:
  195. dictLen += 1
  196. continue
  197. else:
  198. uid_push_list.append(eqDict.get('UID', None))
  199. puserId = eqDict.pop('userID')
  200. eqDict['primaryUserID'] = puserId
  201. eqDict['primaryMaster'] = ModelService.get_user_name(puserId)
  202. eqDict['isShare'] = True
  203. eqDict['userID_id'] = GuestID
  204. eqDict['id'] = CommonService.getUserID(getUser=False)
  205. querysetList.append(Device_Info(**eqDict))
  206. for permission_id in p_ids:
  207. permission_list.append(DeviceUserPermissions(permission_id=permission_id, user_id=GuestID,
  208. uid=eqDict.get('UID', None),
  209. created_time=now_time))
  210. else:
  211. content = kwargs.get('content', None)
  212. if content != None:
  213. contentDict = json.loads(content)
  214. uidlist = UID = contentDict.get('UID', None)
  215. print(uidlist)
  216. for equipment in Master:
  217. eqDict = equipment.model_to_dict(exclude=['id', 'data_joined', 'primaryUserID'])
  218. if eqDict['UID'] in uidlist:
  219. UID.remove(eqDict['UID'])
  220. shareEquipment = Device_Info.objects.filter(userID_id=GuestID, primaryUserID= \
  221. MasterID, UID=eqDict.get('UID', None)).order_by('-data_joined')
  222. if shareEquipment:
  223. dictLen += 1
  224. else:
  225. uid_push_list.append(eqDict.get('UID', None))
  226. puserId = eqDict.pop('userID')
  227. eqDict['primaryUserID'] = puserId
  228. eqDict['primaryMaster'] = ModelService.get_user_name(puserId)
  229. eqDict['isShare'] = True
  230. eqDict['userID_id'] = GuestID
  231. eqDict['id'] = CommonService.getUserID(getUser=False)
  232. querysetList.append(Device_Info(**eqDict))
  233. for permission_id in p_ids:
  234. permission_list.append(DeviceUserPermissions(permission_id=permission_id,
  235. user_id=GuestID,
  236. uid=eqDict.get('UID', None),
  237. created_time=now_time))
  238. else:
  239. continue
  240. if len(querysetList) == 0:
  241. return response.json(174, {'error_UID': UID})
  242. else:
  243. try:
  244. Device_Info.objects.bulk_create(querysetList)
  245. DeviceUserPermissions.objects.bulk_create(permission_list)
  246. uid_set_qs = UidSetModel.objects.filter(uid=uid_push_list).values('id')
  247. for uid_set in uid_set_qs:
  248. uid_set_id = uid_set['id']
  249. now_time = int(time.time())
  250. uid_push_qs = UidPushModel.objects.filter(userID=GuestID).values_list('appBundleId', 'app_type',
  251. 'push_type', 'token_val',
  252. 'jg_token_val', 'm_code',
  253. 'lang', 'tz')
  254. if uid_push_qs.exists():
  255. for item in set(list(uid_push_qs)):
  256. UidPushModel.objects.create(userID_id=GuestID, appBundleId=item[0], app_type=item[1],
  257. push_type=item[2], token_val=item[3], jg_token_val=item[4],
  258. m_code=item[5], lang=item[6], tz=item[7], addTime=now_time,
  259. updTime=now_time, uid_set_id=uid_set_id)
  260. else:
  261. gateway_push_qs = GatewayPush.objects.filter(user_id=GuestID, logout=False).values(
  262. 'app_app_id', 'm_code', 'app_type', 'push_type', 'token_val', 'lang', 'jg_token_val',
  263. 'tz')
  264. for item in gateway_push_qs:
  265. UidPushModel.objects.create(userID_id=GuestID, appBundleId=item['app_app_id'],
  266. app_type=item['app_type'], addTime=now_time,
  267. push_type=item['push_type'], updTime=now_time,
  268. token_val=item['token_val'], uid_set_id=uid_set_id,
  269. jg_token_val=item['jg_token_val'], lang=item['lang'],
  270. m_code=item['m_code'], tz=item['tz'])
  271. except Exception as e:
  272. errorInfo = traceback.format_exc()
  273. print('添加数据库记录错误: %s' % errorInfo)
  274. return response.json(500, {"details": repr(e)})
  275. else:
  276. if dictLen > 0:
  277. res = {'Shared': dictLen, 'Sharing': len(querysetList), 'errormsg': 'some had share'}
  278. else:
  279. if sharedAll:
  280. res = {'Sharing': len(querysetList)}
  281. else:
  282. if len(UID) > 0:
  283. res = {'error_UID': UID, 'Sharing': len(querysetList)}
  284. else:
  285. res = {'Sharing': len(querysetList)}
  286. # redisObj = RedisObject(db=8)
  287. # redisObj.del_data(key='uid_qs_' + GuestID)
  288. return response.json(0, res)
  289. class unsharedUserEquipmentView(View):
  290. @method_decorator(csrf_exempt)
  291. def dispatch(self, *args, **kwargs):
  292. return super(unsharedUserEquipmentView, self).dispatch(*args, **kwargs)
  293. def post(self, request, *args, **kwargs):
  294. request.encoding = 'utf-8'
  295. queryset = request.POST
  296. return self.unsharedUserEquipment(queryset, args, kwargs)
  297. def get(self, request, *args, **kwargs):
  298. request.encoding = 'gb2312'
  299. queryset = request.GET
  300. return self.unsharedUserEquipment(queryset, args, kwargs)
  301. def unsharedUserEquipment(self, queryset, *args, **kwargs):
  302. token = queryset.get('token', None)
  303. GuestID = queryset.get('guestID', None)
  304. content = queryset.get('content', None)
  305. unsharedAll = queryset.get('unsharedAll', False)
  306. response = ResponseObject()
  307. if unsharedAll in ('1', '0'):
  308. unsharedAll = bool(int(unsharedAll))
  309. elif unsharedAll in ('true', 'false'):
  310. if unsharedAll == 'true':
  311. unsharedAll = 1
  312. else:
  313. unsharedAll = 0
  314. if token != None and GuestID != None and len(GuestID) > 0:
  315. tko = TokenObject(token)
  316. response.lang = tko.lang
  317. if tko.code == 0:
  318. MasterID = tko.userID
  319. if unsharedAll and MasterID != None:
  320. return self.unsharedUserEquipmentSQL(MasterID, GuestID, True, response, args, kwargs)
  321. else:
  322. if content != None and MasterID != None:
  323. return self.unsharedUserEquipmentSQL(MasterID, GuestID, False, response, args, content=content)
  324. else:
  325. return response.json(444, 'content or unsharedAll')
  326. else:
  327. return response.json(tko.code)
  328. else:
  329. return response.json(800)
  330. def unsharedUserEquipmentSQL(self, MasterID, GuestID, unsharedAll, response, *args, **kwargs):
  331. if unsharedAll:
  332. ec = Device_Info.objects.filter(userID_id=GuestID, primaryUserID=MasterID).delete()
  333. return response.json(0, {'removeCount': ec[0]})
  334. else:
  335. content = kwargs.get('content', None)
  336. if content != None:
  337. removeCount = 0
  338. errorRemove = []
  339. errorUID = []
  340. contentDict = json.loads(content)
  341. uidlist = contentDict.get('UID', None)
  342. for index in range(len(uidlist)):
  343. uid = uidlist[index]
  344. try:
  345. equipment = Device_Info.objects.filter(userID_id=GuestID, primaryUserID=MasterID, UID=uid)
  346. if equipment:
  347. equipmentCount = equipment.delete()
  348. else:
  349. errorUID.append(uid)
  350. continue
  351. DeviceUserPermissions.objects.filter(user_id=GuestID, uid=uid).delete()
  352. except Exception as e:
  353. errorInfo = traceback.format_exc()
  354. print('查询数据库错误: %s' % errorInfo)
  355. errorRemove.append(uid)
  356. continue
  357. else:
  358. removeCount += equipmentCount[0]
  359. if len(errorRemove) > 0:
  360. return response.json(176, {'removeCount': removeCount, 'error_UID': errorRemove})
  361. else:
  362. if len(errorUID) > 0:
  363. return response.json(173, {'removeCount': removeCount, 'error_UID': errorUID})
  364. else:
  365. return response.json(0, {'removeCount': removeCount})
  366. class SharePermissionsView(View):
  367. @method_decorator(csrf_exempt)
  368. def dispatch(self, *args, **kwargs):
  369. return super(SharePermissionsView, self).dispatch(*args, **kwargs)
  370. def get(self, request, *args, **kwargs):
  371. request.encoding = 'utf-8'
  372. operation = kwargs.get('operation')
  373. return self.validation(request, request.GET, operation)
  374. def post(self, request, *args, **kwargs):
  375. request.encoding = 'utf-8'
  376. operation = kwargs.get('operation')
  377. return self.validation(request, request.POST, operation)
  378. def validation(self, request, request_dict, operation):
  379. lang = request_dict.get('lang', 'en')
  380. response = ResponseObject(lang)
  381. if operation == 'get-permission-list': # 获取分享权限列表
  382. return self.get_permission_list(request_dict, response)
  383. else:
  384. token = request_dict.get('token', None)
  385. # 设备主键uid
  386. tko = TokenObject(token)
  387. if tko.code != 0:
  388. return response.json(tko.code)
  389. user_id = tko.userID
  390. if operation == 'edit-user-permission': # 获取用户设备分享权限
  391. return self.edit_user_permission(user_id, request_dict, response)
  392. else:
  393. return response.json(404)
  394. @staticmethod
  395. def get_permission_list(request_dict, response):
  396. permission_qs = DeviceSharePermission.objects.filter(share_type=2).values('id', 'code').order_by('sort')
  397. return response.json(0, list(permission_qs))
  398. @staticmethod
  399. def edit_user_permission(user_id, request_dict, response):
  400. uid = request_dict.get('uid', None)
  401. permission_ids = request_dict.get('permissionIds', None)
  402. if not all([uid, permission_ids]):
  403. return response.json(444)
  404. permission_ids_list = [int(val) for val in permission_ids.split(',')] if permission_ids else []
  405. now_time = int(time.time())
  406. DeviceUserPermissions.objects.filter(user_id=user_id, uid=uid).delete()
  407. for permission_id in permission_ids_list:
  408. DeviceUserPermissions.objects.create(permission_id=permission_id, user_id=user_id, uid=uid,
  409. created_time=now_time)
  410. return response.json(0)