UserDeviceShareController.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  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. import boto3
  12. import botocore
  13. from botocore import client
  14. from django.db import transaction
  15. from django.db.models import Q
  16. from django.views import View
  17. from Model.models import DeviceSharePermission, DeviceChannelUserSet, DeviceChannelUserPermission, UidChannelSetModel, \
  18. Device_Info
  19. from Object.ResponseObject import ResponseObject
  20. from Object.TokenObject import TokenObject
  21. from Service.UserDeviceService import UserDeviceService
  22. from Ansjer.config import CONFIG_CN, CONFIG_INFO, CONFIG_TEST, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
  23. AWS_SES_ACCESS_REGION, AWS_IOT_SES_ACCESS_CHINA_REGION
  24. from Model.models import DeviceWallpaper
  25. from Object.AWS.AmazonS3Util import AmazonS3Util
  26. LOGGER = logging.getLogger('info')
  27. class UserDeviceShareView(View):
  28. def get(self, request, *args, **kwargs):
  29. request.encoding = 'utf-8'
  30. operation = kwargs.get('operation')
  31. return self.validation(request.GET, request, operation)
  32. def post(self, request, *args, **kwargs):
  33. request.encoding = 'utf-8'
  34. operation = kwargs.get('operation')
  35. return self.validation(request.POST, request, operation)
  36. def validation(self, request_dict, request, operation):
  37. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  38. lang = request_dict.get('lang', token.lang)
  39. response = ResponseObject(lang)
  40. LOGGER.info(f"test:{token.token}")
  41. if token.code != 0:
  42. LOGGER.info(f"token.code:{token.code}")
  43. return response.json(token.code)
  44. if operation == 'user-permissions':
  45. return self.get_user_share_permission(request_dict, response)
  46. elif operation == 'permissions-save':
  47. return self.user_channel_permission_save(request_dict, response)
  48. elif operation == 'permissions-test':
  49. return self.synch_share_device_permission(response)
  50. elif operation == 'getWallpaperList':
  51. return self.get_wallpaper_list(request_dict, response)
  52. elif operation == 'getUploadWallpaper':
  53. return self.get_upload_wallpaper(request_dict, response)
  54. elif operation == 'notifyUploadWallpaper':
  55. return self.notify_upload_wallpaper(request_dict, response)
  56. elif operation == 'delWallpaper':
  57. return self.del_wallpaper(request_dict, response)
  58. elif operation == 'selectWallpaper':
  59. return self.select_wallpaper(request_dict, response)
  60. else:
  61. return response.json(404)
  62. @classmethod
  63. def get_user_share_permission(cls, request_dict, response):
  64. """
  65. 获取用户分享权限
  66. @param request_dict: 设备uid
  67. @param response: 响应对象
  68. @return: permission List
  69. """
  70. try:
  71. uid = request_dict.get('uid', None)
  72. user_id = request_dict.get('userId', None)
  73. channel_count = request_dict.get('channelCount', None)
  74. if not all([user_id, uid, channel_count]):
  75. return response(444, 'uid, userId and channelCount is required')
  76. user_permission_qs = DeviceChannelUserSet.objects.filter(user_id=user_id, uid=uid) \
  77. .values('id', 'channels')
  78. if not user_permission_qs.exists():
  79. return response.json(0, {})
  80. up_id = user_permission_qs[0]['id']
  81. channel_permission_qs = DeviceChannelUserPermission.objects.filter(channel_user_id=up_id) \
  82. .values('permission_id', 'channel_user_id')
  83. if not channel_permission_qs.exists():
  84. return response.json(0, {})
  85. channel_list = list(range(1, int(channel_count) + 1))
  86. share_channel_list = user_permission_qs[0]['channels'].split(',')
  87. c_list = []
  88. for channel in channel_list:
  89. is_select = 1 if str(channel) in share_channel_list else 0
  90. c_list.append({'channelIndex': channel, 'isSelect': is_select})
  91. p_list = []
  92. permission_qs = DeviceSharePermission.objects.all()
  93. share_permission_list = [item['permission_id'] for item in channel_permission_qs]
  94. for item in permission_qs:
  95. is_select = 1 if item.id in share_permission_list else 0
  96. p_list.append({'permissionId': item.id, 'code': item.code, 'isSelect': is_select})
  97. data = {'channels': c_list, 'permissions': p_list}
  98. return response.json(0, data)
  99. except Exception as e:
  100. LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  101. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  102. @classmethod
  103. def user_channel_permission_save(cls, request_dict, response):
  104. """
  105. 主用户分享设备时设置通道权限保存
  106. """
  107. try:
  108. uid = request_dict.get('uid', None)
  109. channels = request_dict.get('channels', None) # 通道集合,多个','隔开
  110. user_id = request_dict.get('userId', None)
  111. permission_ids = request_dict.get('permissionIds', None) # 权限集合,多个','隔开
  112. if not all([user_id, uid, channels, permission_ids]):
  113. return response.json(444)
  114. p_ids = []
  115. device_user_set = DeviceChannelUserSet.objects.filter(user_id=user_id, uid=uid)
  116. now_time = int(time.time())
  117. with transaction.atomic():
  118. is_delete = False
  119. if not device_user_set.exists():
  120. device_set = {'uid': uid, 'user_id': user_id, 'channels': channels,
  121. 'created_time': now_time, 'updated_time': now_time}
  122. device_user_set = DeviceChannelUserSet.objects.create(**device_set)
  123. channel_user_id = device_user_set.id
  124. else:
  125. DeviceChannelUserSet.objects.update(channels=channels, updated_time=now_time)
  126. channel_user_id = device_user_set.first().id
  127. is_delete = True
  128. if ',' in permission_ids:
  129. p_ids = [int(val) for val in permission_ids.split(',')]
  130. if is_delete:
  131. DeviceChannelUserPermission.objects.filter(
  132. channel_user_id=channel_user_id).delete()
  133. if not p_ids:
  134. channel_permission = {'permission_id': int(permission_ids),
  135. 'channel_user_id': channel_user_id,
  136. 'created_time': now_time}
  137. DeviceChannelUserPermission.objects.create(**channel_permission)
  138. else:
  139. channel_permission_list = []
  140. for item in p_ids:
  141. channel_permission_list.append(DeviceChannelUserPermission(
  142. permission_id=int(item),
  143. channel_user_id=channel_user_id,
  144. created_time=now_time))
  145. DeviceChannelUserPermission.objects.bulk_create(channel_permission_list)
  146. return response.json(0)
  147. except Exception as e:
  148. LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  149. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  150. @staticmethod
  151. def qrcode_share_channel_permission_save(user_id, uid):
  152. """
  153. 二维码分享保存通道权限
  154. @param user_id: 用户id
  155. @param uid: 用户设备ID
  156. @return: True | False
  157. """
  158. try:
  159. if not all([user_id, uid]):
  160. return False
  161. with transaction.atomic():
  162. ds_qs = DeviceChannelUserSet.objects.filter(user_id=user_id, uid=uid)
  163. if ds_qs.exists():
  164. return True
  165. UserDeviceService.update_device_channel(uid)
  166. channel_qs = UidChannelSetModel.objects.filter(uid__uid=uid).values('channel')
  167. if not channel_qs.exists():
  168. return False
  169. channel_list = [str(val['channel']) for val in channel_qs]
  170. channel_str = ','.join(channel_list)
  171. now_time = int(time.time())
  172. device_set = {'uid': uid, 'user_id': user_id, 'channels': channel_str,
  173. 'created_time': now_time, 'updated_time': now_time}
  174. device_user_set = DeviceChannelUserSet.objects.create(**device_set)
  175. channel_permission_qs = DeviceSharePermission.objects \
  176. .all().values('id', 'code').order_by('sort')
  177. user_set_id = device_user_set.id
  178. channel_permission_list = []
  179. for item in channel_permission_qs:
  180. channel_permission_list.append(DeviceChannelUserPermission(
  181. permission_id=item['id'],
  182. channel_user_id=user_set_id,
  183. created_time=now_time))
  184. DeviceChannelUserPermission.objects.bulk_create(channel_permission_list)
  185. return True
  186. except Exception as e:
  187. LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  188. return False
  189. @staticmethod
  190. def synch_share_device_permission(response):
  191. """
  192. 同步分析设备权限
  193. @param response: 响应结果
  194. """
  195. device_info_qs = Device_Info.objects \
  196. .filter(~Q(Type__in=[1, 2, 3, 4, 10001]), ~Q(primaryUserID=''), isShare=1) \
  197. .values('userID_id', 'UID').order_by('-data_joined')
  198. if not device_info_qs.exists():
  199. return response.json(0)
  200. for item in device_info_qs:
  201. UserDeviceShareView.qrcode_share_channel_permission_save(item['userID_id'], item['UID'])
  202. return response.json(0)
  203. @classmethod
  204. def get_wallpaper_list(cls, request_dict, response):
  205. """
  206. 获取设备壁纸列表
  207. @param request_dict:
  208. @param response:
  209. @return:
  210. """
  211. try:
  212. device_type = int(request_dict.get('deviceType', None))
  213. uid = request_dict.get('uid', None)
  214. channel = int(request_dict.get('channel', 1))
  215. LOGGER.info('request_dict:{}'.format(request_dict))
  216. if not all([device_type, uid]):
  217. return response.json(444)
  218. # 查询用户自定义壁纸
  219. user_wallpaper_qs = DeviceWallpaper.objects.filter(channel=channel, uid=uid,
  220. device_type=device_type, parent_id=0, status=1)
  221. # 查询系统默认壁纸
  222. def_wallpaper_qs = DeviceWallpaper.objects.filter(classification=1, device_type=device_type, status=1)
  223. # 查询用户选中的壁纸
  224. user_checked_qs = DeviceWallpaper.objects.filter(channel=channel, uid=uid,
  225. device_type=device_type, parent_id__gt=0, status=1)
  226. checked_id = user_checked_qs[0].parent_id if user_checked_qs.exists() else def_wallpaper_qs.first().id
  227. wallpaper_list = []
  228. if def_wallpaper_qs.exists() or user_wallpaper_qs.exists():
  229. # 初始化存储桶客户端
  230. if CONFIG_CN == CONFIG_INFO or CONFIG_TEST == CONFIG_INFO:
  231. s3 = boto3.client(
  232. 's3',
  233. aws_access_key_id=AWS_ACCESS_KEY_ID[0],
  234. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],
  235. config=botocore.client.Config(signature_version='s3v4'),
  236. region_name='cn-northwest-1'
  237. )
  238. else:
  239. s3 = boto3.client(
  240. 's3',
  241. aws_access_key_id=AWS_ACCESS_KEY_ID[1],
  242. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[1],
  243. config=botocore.client.Config(signature_version='s3v4'),
  244. region_name='us-east-1'
  245. )
  246. # 处理系统默认壁纸和用户自定义壁纸
  247. all_wallpapers_qs = def_wallpaper_qs.union(user_wallpaper_qs)
  248. for item in all_wallpapers_qs:
  249. obj_key = item.obj_prefix + item.obj_name
  250. params = {
  251. 'Key': obj_key,
  252. 'Bucket': 'ansjerfilemanager',
  253. }
  254. response_url = s3.generate_presigned_url(
  255. 'get_object', Params=params, ExpiresIn=3600)
  256. wallpaper = {
  257. 'id': item.id,
  258. 'url': response_url,
  259. 'state': 1 if checked_id == item.id else 0,
  260. 'classification': item.classification
  261. }
  262. wallpaper_list.append(wallpaper)
  263. return response.json(0, {'wallpapers': wallpaper_list})
  264. except Exception as e:
  265. LOGGER.error('查询设备壁纸异常:errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  266. return response.json(5)
  267. @classmethod
  268. def get_upload_wallpaper(cls, request_dict, response):
  269. """
  270. 获取设备壁纸上传链接
  271. @param request_dict:
  272. @param response:
  273. @return:
  274. """
  275. try:
  276. uid = request_dict.get('uid', None)
  277. channel = int(request_dict.get('channel', 1))
  278. if not uid:
  279. return response.json(444)
  280. # 初始化存储桶客户端
  281. if CONFIG_CN == CONFIG_INFO or CONFIG_TEST == CONFIG_INFO:
  282. s3 = boto3.client(
  283. 's3',
  284. aws_access_key_id=AWS_ACCESS_KEY_ID[0],
  285. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],
  286. config=botocore.client.Config(signature_version='s3v4'),
  287. region_name='cn-northwest-1'
  288. )
  289. else:
  290. s3 = boto3.client(
  291. 's3',
  292. aws_access_key_id=AWS_ACCESS_KEY_ID[1],
  293. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[1],
  294. config=botocore.client.Config(signature_version='s3v4'),
  295. region_name='us-east-1'
  296. )
  297. # 生成唯一的文件名
  298. file_name = f"{int(time.time())}.png"
  299. obj_key = f"app/static/device-wallpaper/{uid}/{file_name}"
  300. # 生成预签名的 URL
  301. presigned_url = s3.generate_presigned_url(
  302. 'put_object',
  303. Params={
  304. 'Bucket': 'ansjerfilemanager',
  305. 'Key': obj_key,
  306. },
  307. ExpiresIn=600
  308. )
  309. # 返回预签名的URL和字段
  310. return response.json(0, {
  311. 'uploadUrl': presigned_url,
  312. 'fileName': file_name,
  313. })
  314. except Exception as e:
  315. LOGGER.error('获取上传链接异常:errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  316. return response.json(5)
  317. @classmethod
  318. def notify_upload_wallpaper(cls, request_dict, response):
  319. """
  320. 确认壁纸上传成功,创建DeviceWallpaper
  321. @param request_dict:
  322. @param response:
  323. @return:
  324. """
  325. try:
  326. uid = request_dict.get('uid', None)
  327. file_name = request_dict.get('fileName', None)
  328. channel = int(request_dict.get('channel', 1))
  329. if not all([uid, file_name]):
  330. return response.json(444)
  331. device_info_qs = Device_Info.objects.filter(UID=uid).values('id', 'Type')
  332. device_type = device_info_qs[0]['Type'] if device_info_qs.exists() else ''
  333. DeviceWallpaper.objects.create(
  334. device_type=device_type,
  335. storage_type=1,
  336. channel=channel,
  337. uid=uid,
  338. obj_prefix=f'app/static/device-wallpaper/{uid}/',
  339. obj_name=file_name,
  340. classification=2, # 自定义壁纸分类
  341. status=1,
  342. parent_id=0,
  343. created_time=int(time.time())
  344. )
  345. return response.json(0)
  346. except Exception as e:
  347. LOGGER.error('壁纸创建失败:errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  348. return response.json(5)
  349. @classmethod
  350. def del_wallpaper(cls, request_dict, response):
  351. """
  352. 删除设备壁纸
  353. """
  354. wallpaper_id = request_dict.get('wallpaperId', None)
  355. if not all([wallpaper_id]):
  356. return response.json(444)
  357. try:
  358. wallpaper_id = int(wallpaper_id)
  359. if DeviceWallpaper.objects.filter(id=wallpaper_id, classification=1).exists():
  360. return response.json(176, "系统图片不能删除")
  361. device_wallpaper_qs = DeviceWallpaper.objects.filter(id=wallpaper_id)
  362. device_wallpaper = device_wallpaper_qs.values("obj_prefix", "obj_name", "uid", "parent_id")
  363. uid = device_wallpaper[0]['uid']
  364. obj_name = device_wallpaper[0]['obj_name']
  365. # 使用中壁纸被删除
  366. use_device_wallpaper = DeviceWallpaper.objects.filter(uid=uid, parent_id__gt=0).first()
  367. if use_device_wallpaper and use_device_wallpaper.parent_id == wallpaper_id:
  368. system_device_wallpaper = DeviceWallpaper.objects.filter(id=1).first()
  369. use_device_wallpaper.parent_id = 1
  370. use_device_wallpaper.storage_type = system_device_wallpaper.storage_type
  371. use_device_wallpaper.obj_name = system_device_wallpaper.obj_name
  372. use_device_wallpaper.obj_prefix = system_device_wallpaper.obj_prefix
  373. use_device_wallpaper.classification = system_device_wallpaper.classification
  374. use_device_wallpaper.channel = system_device_wallpaper.channel
  375. use_device_wallpaper.save()
  376. if CONFIG_CN == CONFIG_INFO or CONFIG_TEST == CONFIG_INFO:
  377. s3 = AmazonS3Util(
  378. AWS_ACCESS_KEY_ID[0], AWS_SECRET_ACCESS_KEY[0], 'cn-northwest-1'
  379. )
  380. else:
  381. s3 = AmazonS3Util(
  382. AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], 'us-east-1'
  383. )
  384. s3.delete_obj("ansjerfilemanager", f"app/static/device-wallpaper/{uid}/{obj_name}")
  385. device_wallpaper_qs.delete()
  386. return response.json(0)
  387. except Exception as e:
  388. LOGGER.info('删除壁纸异常:{}'.format(e))
  389. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  390. @classmethod
  391. def select_wallpaper(cls, request_dict, response):
  392. """
  393. 用户选取壁纸
  394. @param request_dict:
  395. @param response:
  396. @return:
  397. """
  398. try:
  399. wallpaper_id = request_dict.get('wallpaperId', None)
  400. uid = request_dict.get('uid', None)
  401. if not all([wallpaper_id, uid]):
  402. return response.json(444)
  403. device_wallpaper = DeviceWallpaper.objects.filter(id=wallpaper_id).values("device_type", "storage_type",
  404. "obj_prefix",
  405. "obj_name",
  406. "classification",
  407. "channel").first()
  408. device_wallpaper_qs = DeviceWallpaper.objects.filter(uid=uid, parent_id__gt=0)
  409. if device_wallpaper_qs.exists():
  410. device_wallpaper_qs.update(
  411. storage_type=device_wallpaper["storage_type"],
  412. classification=device_wallpaper["classification"],
  413. obj_prefix=device_wallpaper["obj_prefix"],
  414. obj_name=device_wallpaper["obj_name"],
  415. parent_id=wallpaper_id
  416. )
  417. else:
  418. DeviceWallpaper.objects.create(
  419. device_type=device_wallpaper["device_type"],
  420. storage_type=device_wallpaper["storage_type"],
  421. obj_name=device_wallpaper["obj_name"],
  422. obj_prefix=device_wallpaper["obj_prefix"],
  423. classification=device_wallpaper["classification"],
  424. uid=uid,
  425. channel=device_wallpaper["channel"],
  426. status=1,
  427. parent_id=wallpaper_id,
  428. created_time=int(time.time())
  429. )
  430. return response.json(0)
  431. except Exception as e:
  432. LOGGER.error('用户选取壁纸异常:errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  433. return response.json(5)