shareUserPermission.py 19 KB

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