UserDeviceShareController.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : UserDeviceShareController.py
  4. @Time : 2023/1/7 15:05
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import logging
  10. import time
  11. from django.db import transaction
  12. from django.db.models import Q
  13. from django.views import View
  14. from Model.models import DeviceSharePermission, DeviceChannelUserSet, DeviceChannelUserPermission, UidChannelSetModel, \
  15. Device_Info
  16. from Object.ResponseObject import ResponseObject
  17. from Object.TokenObject import TokenObject
  18. from Service.UserDeviceService import UserDeviceService
  19. LOGGER = logging.getLogger('info')
  20. class UserDeviceShareView(View):
  21. def get(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation')
  24. return self.validation(request.GET, request, operation)
  25. def post(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. operation = kwargs.get('operation')
  28. return self.validation(request.POST, request, operation)
  29. def validation(self, request_dict, request, operation):
  30. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  31. lang = request_dict.get('lang', token.lang)
  32. response = ResponseObject(lang)
  33. if token.code != 0:
  34. return response.json(token.code)
  35. if operation == 'user-permissions':
  36. return self.get_user_share_permission(request_dict, response)
  37. elif operation == 'permissions-save':
  38. return self.user_channel_permission_save(request_dict, response)
  39. elif operation == 'permissions-test':
  40. return self.synch_share_device_permission(response)
  41. else:
  42. return response.json(404)
  43. @classmethod
  44. def get_user_share_permission(cls, request_dict, response):
  45. """
  46. 获取用户分享权限
  47. @param request_dict: 设备uid
  48. @param response: 响应对象
  49. @return: permission List
  50. """
  51. try:
  52. uid = request_dict.get('uid', None)
  53. user_id = request_dict.get('userId', None)
  54. channel_count = request_dict.get('channelCount', None)
  55. if not all([user_id, uid, channel_count]):
  56. return response(444, 'uid, userId and channelCount is required')
  57. user_permission_qs = DeviceChannelUserSet.objects.filter(user_id=user_id, uid=uid) \
  58. .values('id', 'channels')
  59. if not user_permission_qs.exists():
  60. return response.json(0, {})
  61. up_id = user_permission_qs[0]['id']
  62. channel_permission_qs = DeviceChannelUserPermission.objects.filter(channel_user_id=up_id) \
  63. .values('permission_id', 'channel_user_id')
  64. if not channel_permission_qs.exists():
  65. return response.json(0, {})
  66. channel_list = list(range(1, int(channel_count) + 1))
  67. share_channel_list = user_permission_qs[0]['channels'].split(',')
  68. c_list = []
  69. for channel in channel_list:
  70. is_select = 1 if str(channel) in share_channel_list else 0
  71. c_list.append({'channelIndex': channel, 'isSelect': is_select})
  72. p_list = []
  73. permission_qs = DeviceSharePermission.objects.all()
  74. share_permission_list = [item['permission_id'] for item in channel_permission_qs]
  75. for item in permission_qs:
  76. is_select = 1 if item.id in share_permission_list else 0
  77. p_list.append({'permissionId': item.id, 'code': item.code, 'isSelect': is_select})
  78. data = {'channels': c_list, 'permissions': p_list}
  79. return response.json(0, data)
  80. except Exception as e:
  81. LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  82. return response.json(500, repr(e))
  83. @classmethod
  84. def user_channel_permission_save(cls, request_dict, response):
  85. """
  86. 主用户分享设备时设置通道权限保存
  87. """
  88. try:
  89. uid = request_dict.get('uid', None)
  90. channels = request_dict.get('channels', None) # 通道集合,多个','隔开
  91. user_id = request_dict.get('userId', None)
  92. permission_ids = request_dict.get('permissionIds', None) # 权限集合,多个','隔开
  93. if not all([user_id, uid, channels, permission_ids]):
  94. return response.json(444)
  95. p_ids = []
  96. device_user_set = DeviceChannelUserSet.objects.filter(user_id=user_id, uid=uid)
  97. now_time = int(time.time())
  98. with transaction.atomic():
  99. is_delete = False
  100. if not device_user_set.exists():
  101. device_set = {'uid': uid, 'user_id': user_id, 'channels': channels,
  102. 'created_time': now_time, 'updated_time': now_time}
  103. device_user_set = DeviceChannelUserSet.objects.create(**device_set)
  104. channel_user_id = device_user_set.id
  105. else:
  106. DeviceChannelUserSet.objects.update(channels=channels, updated_time=now_time)
  107. channel_user_id = device_user_set.first().id
  108. is_delete = True
  109. if ',' in permission_ids:
  110. p_ids = [int(val) for val in permission_ids.split(',')]
  111. if is_delete:
  112. DeviceChannelUserPermission.objects.filter(
  113. channel_user_id=channel_user_id).delete()
  114. if not p_ids:
  115. channel_permission = {'permission_id': int(permission_ids),
  116. 'channel_user_id': channel_user_id,
  117. 'created_time': now_time}
  118. DeviceChannelUserPermission.objects.create(**channel_permission)
  119. else:
  120. channel_permission_list = []
  121. for item in p_ids:
  122. channel_permission_list.append(DeviceChannelUserPermission(
  123. permission_id=int(item),
  124. channel_user_id=channel_user_id,
  125. created_time=now_time))
  126. DeviceChannelUserPermission.objects.bulk_create(channel_permission_list)
  127. return response.json(0)
  128. except Exception as e:
  129. LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  130. return response.json(500, repr(e))
  131. @staticmethod
  132. def qrcode_share_channel_permission_save(user_id, uid):
  133. """
  134. 二维码分享保存通道权限
  135. @param user_id: 用户id
  136. @param uid: 用户设备ID
  137. @return: True | False
  138. """
  139. try:
  140. if not all([user_id, uid]):
  141. return False
  142. with transaction.atomic():
  143. ds_qs = DeviceChannelUserSet.objects.filter(user_id=user_id, uid=uid)
  144. if ds_qs.exists():
  145. return True
  146. UserDeviceService.update_device_channel(uid)
  147. channel_qs = UidChannelSetModel.objects.filter(uid__uid=uid).values('channel')
  148. if not channel_qs.exists():
  149. return False
  150. channel_list = [str(val['channel']) for val in channel_qs]
  151. channel_str = ','.join(channel_list)
  152. now_time = int(time.time())
  153. device_set = {'uid': uid, 'user_id': user_id, 'channels': channel_str,
  154. 'created_time': now_time, 'updated_time': now_time}
  155. device_user_set = DeviceChannelUserSet.objects.create(**device_set)
  156. channel_permission_qs = DeviceSharePermission.objects \
  157. .all().values('id', 'code').order_by('sort')
  158. user_set_id = device_user_set.id
  159. channel_permission_list = []
  160. for item in channel_permission_qs:
  161. channel_permission_list.append(DeviceChannelUserPermission(
  162. permission_id=item['id'],
  163. channel_user_id=user_set_id,
  164. created_time=now_time))
  165. DeviceChannelUserPermission.objects.bulk_create(channel_permission_list)
  166. return True
  167. except Exception as e:
  168. LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  169. return False
  170. @staticmethod
  171. def synch_share_device_permission(response):
  172. """
  173. 同步分析设备权限
  174. @param response: 响应结果
  175. """
  176. device_info_qs = Device_Info.objects \
  177. .filter(~Q(Type__in=[1, 2, 3, 4, 10001]), ~Q(primaryUserID=''), isShare=1) \
  178. .values('userID_id', 'UID').order_by('-data_joined')
  179. if not device_info_qs.exists():
  180. return response.json(0)
  181. for item in device_info_qs:
  182. UserDeviceShareView.qrcode_share_channel_permission_save(item['userID_id'], item['UID'])
  183. return response.json(0)