Răsfoiți Sursa

新增设备分享权限接口

zhangdongming 2 ani în urmă
părinte
comite
1f9892e0cb
2 a modificat fișierele cu 134 adăugiri și 0 ștergeri
  1. 4 0
      Ansjer/urls.py
  2. 130 0
      Controller/UserDevice/UserDeviceShareController.py

+ 4 - 0
Ansjer/urls.py

@@ -29,6 +29,8 @@ from Controller.Surveys import CloudStorageController
 from Controller.SensorGateway import SensorGatewayController, EquipmentFamilyController
 from django.urls import include
 
+from Controller.UserDevice import UserDeviceShareController
+
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
     url(r'^account/authcode$', UserController.authCodeView.as_view()),
@@ -343,6 +345,8 @@ urlpatterns = [
 
     # 问卷调查
     url(r'^api/surveys/(?P<operation>.*)$', CloudStorageController.CloudStorageView.as_view()),
+    # 设备分享
+    url(r'^api/device/share/(?P<operation>.*)$', UserDeviceShareController.UserDeviceShareView.as_view()),
 
     # 网关家庭模块
     url(r'^app/sensor/gateway/(?P<operation>.*)$', EquipmentFamilyController.EquipmentFamilyView.as_view()),

+ 130 - 0
Controller/UserDevice/UserDeviceShareController.py

@@ -0,0 +1,130 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : UserDeviceShareController.py
+@Time    : 2023/1/7 15:05
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+import logging
+import time
+
+from django.db import transaction
+from django.views import View
+
+from Model.models import DeviceSharePermission, DeviceChannelUserSet, DeviceChannelUserPermission
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+
+LOGGER = logging.getLogger('info')
+
+
+class UserDeviceShareView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
+        lang = request_dict.get('lang', token.lang)
+        response = ResponseObject(lang)
+        if token.code != 0:
+            return response.json(token.code)
+        if operation == 'user-permissions':
+            return self.get_user_share_permission(request_dict, response)
+        elif operation == 'permissions-save':
+            return self.user_channel_permission_save(request_dict, response)
+        else:
+            return response.json(404)
+
+    @classmethod
+    def get_user_share_permission(cls, request_dict, response):
+        """
+        获取用户分享权限
+        @param request_dict: 设备uid
+        @param response: 响应对象
+        @return: permission List
+        """
+        try:
+            uid = request_dict.get('uid', None)
+            user_id = request_dict.get('userId', None)
+            if not all([user_id, uid]):
+                return response(444, 'uid and userId is required')
+            user_permission_qs = DeviceChannelUserSet.objects.filter(user_id=user_id, uid=uid) \
+                .values('id', 'channels')
+            if not user_permission_qs.exists():
+                return response.json(0, [])
+            up_id = user_permission_qs[0]['id']
+            channel_permission_qs = DeviceChannelUserPermission.objects.filter(channel_user_id=up_id) \
+                .values('permission_id', 'channel_user_id')
+            if not channel_permission_qs.exists():
+                return response.json(0, [])
+            data = {'channels': [int(val) for val in user_permission_qs[0]['channels'].split(',')]}
+            p_list = []
+            for item in channel_permission_qs:
+                permission_qs = DeviceSharePermission.objects.filter(id=item['permission_id']) \
+                    .values('code')
+                if not permission_qs.exists():
+                    continue
+                p_list.append({'permissionId': item['permission_id'], 'code': permission_qs[0]['code']})
+            data['permissions'] = p_list
+            return response.json(0, data)
+        except Exception as e:
+            LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))
+
+    @classmethod
+    def user_channel_permission_save(cls, request_dict, response):
+        """
+        主用户分享设备时设置通道权限保存
+        """
+        try:
+            uid = request_dict.get('uid', None)
+            channels = request_dict.get('channels', None)  # 通道集合,多个','隔开
+            user_id = request_dict.get('userId', None)
+            permission_ids = request_dict.get('permissionIds', None)  # 权限集合,多个','隔开
+            if not all([user_id, uid, channels, permission_ids]):
+                return response.json(444)
+            p_ids = []
+            device_user_set = DeviceChannelUserSet.objects.filter(user_id=user_id, uid=uid)
+            now_time = int(time.time())
+            with transaction.atomic():
+                is_delete = False
+                if not device_user_set.exists():
+                    device_set = {'uid': uid, 'user_id': user_id, 'channels': channels,
+                                  'created_time': now_time, 'updated_time': now_time}
+                    device_user_set = DeviceChannelUserSet.objects.create(**device_set)
+                    channel_user_id = device_user_set.id
+                else:
+                    DeviceChannelUserSet.objects.update(channels=channels, updated_time=now_time)
+                    channel_user_id = device_user_set.first().id
+                    is_delete = True
+                if ',' in permission_ids:
+                    p_ids = [int(val) for val in permission_ids.split(',')]
+                if is_delete:
+                    DeviceChannelUserPermission.objects.filter(
+                        channel_user_id=channel_user_id).delete()
+                if not p_ids:
+                    channel_permission = {'permission_id': int(permission_ids),
+                                          'channel_user_id': channel_user_id,
+                                          'created_time': now_time}
+                    DeviceChannelUserPermission.objects.create(**channel_permission)
+                else:
+                    channel_permission_list = []
+                    for item in p_ids:
+                        channel_permission_list.append(DeviceChannelUserPermission(
+                            permission_id=int(item),
+                            channel_user_id=channel_user_id,
+                            created_time=now_time))
+                    DeviceChannelUserPermission.objects.bulk_create(channel_permission_list)
+                return response.json(0)
+        except Exception as e:
+            LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500, repr(e))