shareUserPermission.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  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, UidSetModel, UidPushModel, GatewayPush
  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, Max
  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. if sharedAll in ('1', '0'):
  156. sharedAll = bool(int(sharedAll))
  157. elif sharedAll in ('true', 'false'):
  158. if sharedAll == 'true':
  159. sharedAll = 1
  160. else:
  161. sharedAll = 0
  162. response = ResponseObject()
  163. if not GuestID:
  164. return response.json(444, 'GuestID')
  165. tko = TokenObject(token)
  166. response.lang = tko.lang
  167. if tko.code != 0:
  168. return response.json(tko.code)
  169. MasterID = tko.userID
  170. if sharedAll and MasterID != None:
  171. return self.shareUserSQL(MasterID, GuestID, True, response, args, kwargs)
  172. if content != None and MasterID != None:
  173. return self.shareUserSQL(MasterID, GuestID, False, response, args, content=content)
  174. else:
  175. return response.json(444, 'sharedAll or content')
  176. def shareUserSQL(self, MasterID, GuestID, sharedAll, response, *args, **kwargs):
  177. Guest = Device_User.objects.filter(userID=GuestID).order_by('-data_joined')
  178. Master = Device_Info.objects.filter(userID_id=MasterID).order_by('-data_joined')
  179. if not Master or not Guest:
  180. return response.json(104)
  181. querysetList = []
  182. uid_push_list = []
  183. now_time = int(time.time())
  184. dictLen = 0
  185. if sharedAll:
  186. # 获取当前用户下最大 sort_order
  187. sort_order = Device_Info.objects.filter(userID_id=GuestID).aggregate(
  188. Max('sort_order'))['sort_order__max'] or 0
  189. for equipment in Master:
  190. eqDict = equipment.model_to_dict(exclude=['id', 'data_joined', 'primaryUserID'])
  191. shareEquipment = Device_Info.objects.filter(userID_id=GuestID, primaryUserID= \
  192. MasterID, UID=eqDict.get('UID', None)).order_by('-data_joined')
  193. if shareEquipment:
  194. dictLen += 1
  195. continue
  196. else:
  197. sort_order += 1
  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. # 排序到最前
  206. eqDict['sort_order'] = sort_order
  207. querysetList.append(Device_Info(**eqDict))
  208. else:
  209. content = kwargs.get('content', None)
  210. if content != None:
  211. contentDict = json.loads(content)
  212. uidlist = UID = contentDict.get('UID', None)
  213. # 获取当前用户下最大 sort_order
  214. sort_order = Device_Info.objects.filter(userID_id=GuestID).aggregate(
  215. Max('sort_order'))['sort_order__max'] or 0
  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. sort_order += 1
  226. uid_push_list.append(eqDict.get('UID', None))
  227. puserId = eqDict.pop('userID')
  228. eqDict['primaryUserID'] = puserId
  229. eqDict['primaryMaster'] = ModelService.get_user_name(puserId)
  230. eqDict['isShare'] = True
  231. eqDict['userID_id'] = GuestID
  232. eqDict['id'] = CommonService.getUserID(getUser=False)
  233. # 排序到最前
  234. eqDict['sort_order'] = sort_order
  235. querysetList.append(Device_Info(**eqDict))
  236. else:
  237. continue
  238. if len(querysetList) == 0:
  239. return response.json(174, {'error_UID': UID})
  240. else:
  241. try:
  242. Device_Info.objects.bulk_create(querysetList)
  243. uid_set_qs = UidSetModel.objects.filter(uid__in=uid_push_list).values('id')
  244. for uid_set in uid_set_qs:
  245. uid_set_id = uid_set['id']
  246. uid_push_qs = UidPushModel.objects.filter(userID=GuestID).values_list('appBundleId', 'app_type',
  247. 'push_type', 'token_val',
  248. 'jg_token_val', 'm_code',
  249. 'lang', 'tz')
  250. if uid_push_qs.exists():
  251. for item in set(list(uid_push_qs)):
  252. UidPushModel.objects.create(userID_id=GuestID, appBundleId=item[0], app_type=item[1],
  253. push_type=item[2], token_val=item[3], jg_token_val=item[4],
  254. m_code=item[5], lang=item[6], tz=item[7], addTime=now_time,
  255. updTime=now_time, uid_set_id=uid_set_id)
  256. else:
  257. gateway_push_qs = GatewayPush.objects.filter(user_id=GuestID, logout=False).values(
  258. 'app_bundle_id', 'm_code', 'app_type', 'push_type', 'token_val', 'lang', 'jg_token_val',
  259. 'tz')
  260. for item in gateway_push_qs:
  261. UidPushModel.objects.create(userID_id=GuestID, appBundleId=item['app_bundle_id'],
  262. app_type=item['app_type'], addTime=now_time,
  263. push_type=item['push_type'], updTime=now_time,
  264. token_val=item['token_val'], uid_set_id=uid_set_id,
  265. jg_token_val=item['jg_token_val'], lang=item['lang'],
  266. m_code=item['m_code'], tz=item['tz'])
  267. except Exception as e:
  268. errorInfo = traceback.format_exc()
  269. print('添加数据库记录错误: %s' % errorInfo)
  270. return response.json(500, {"details": repr(e)})
  271. else:
  272. if dictLen > 0:
  273. res = {'Shared': dictLen, 'Sharing': len(querysetList), 'errormsg': 'some had share'}
  274. else:
  275. if sharedAll:
  276. res = {'Sharing': len(querysetList)}
  277. else:
  278. if len(UID) > 0:
  279. res = {'error_UID': UID, 'Sharing': len(querysetList)}
  280. else:
  281. res = {'Sharing': len(querysetList)}
  282. return response.json(0, res)
  283. class unsharedUserEquipmentView(View):
  284. @method_decorator(csrf_exempt)
  285. def dispatch(self, *args, **kwargs):
  286. return super(unsharedUserEquipmentView, self).dispatch(*args, **kwargs)
  287. def post(self, request, *args, **kwargs):
  288. request.encoding = 'utf-8'
  289. queryset = request.POST
  290. return self.unsharedUserEquipment(queryset, args, kwargs)
  291. def get(self, request, *args, **kwargs):
  292. request.encoding = 'gb2312'
  293. queryset = request.GET
  294. return self.unsharedUserEquipment(queryset, args, kwargs)
  295. def unsharedUserEquipment(self, queryset, *args, **kwargs):
  296. token = queryset.get('token', None)
  297. GuestID = queryset.get('guestID', None)
  298. content = queryset.get('content', None)
  299. unsharedAll = queryset.get('unsharedAll', False)
  300. response = ResponseObject()
  301. if unsharedAll in ('1', '0'):
  302. unsharedAll = bool(int(unsharedAll))
  303. elif unsharedAll in ('true', 'false'):
  304. if unsharedAll == 'true':
  305. unsharedAll = 1
  306. else:
  307. unsharedAll = 0
  308. if token != None and GuestID != None and len(GuestID) > 0:
  309. tko = TokenObject(token)
  310. response.lang = tko.lang
  311. if tko.code == 0:
  312. MasterID = tko.userID
  313. if unsharedAll and MasterID != None:
  314. return self.unsharedUserEquipmentSQL(MasterID, GuestID, True, response, args, kwargs)
  315. else:
  316. if content != None and MasterID != None:
  317. return self.unsharedUserEquipmentSQL(MasterID, GuestID, False, response, args, content=content)
  318. else:
  319. return response.json(444, 'content or unsharedAll')
  320. else:
  321. return response.json(tko.code)
  322. else:
  323. return response.json(800)
  324. def unsharedUserEquipmentSQL(self, MasterID, GuestID, unsharedAll, response, *args, **kwargs):
  325. if unsharedAll:
  326. ec = Device_Info.objects.filter(userID_id=GuestID, primaryUserID=MasterID).delete()
  327. return response.json(0, {'removeCount': ec[0]})
  328. else:
  329. content = kwargs.get('content', None)
  330. if content != None:
  331. removeCount = 0
  332. errorRemove = []
  333. errorUID = []
  334. contentDict = json.loads(content)
  335. uidlist = contentDict.get('UID', None)
  336. for index in range(len(uidlist)):
  337. uid = uidlist[index]
  338. try:
  339. equipment = Device_Info.objects.filter(userID_id=GuestID, primaryUserID=MasterID, UID=uid)
  340. if equipment:
  341. equipmentCount = equipment.delete()
  342. else:
  343. errorUID.append(uid)
  344. continue
  345. except Exception as e:
  346. errorInfo = traceback.format_exc()
  347. print('查询数据库错误: %s' % errorInfo)
  348. errorRemove.append(uid)
  349. continue
  350. else:
  351. removeCount += equipmentCount[0]
  352. if len(errorRemove) > 0:
  353. return response.json(176, {'removeCount': removeCount, 'error_UID': errorRemove})
  354. else:
  355. if len(errorUID) > 0:
  356. return response.json(173, {'removeCount': removeCount, 'error_UID': errorUID})
  357. else:
  358. return response.json(0, {'removeCount': removeCount})