From 43e21c9c64fc75d011ceb7a495f5024c4a406678 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com>
Date: Thu, 29 Dec 2022 13:07:47 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=98=E5=8C=96:=20?=
 =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=97=B6=EF=BC=8C=E5=90=8C=E6=AD=A5=E5=90=AF?=
 =?UTF-8?q?=E7=94=A8=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 backend/dvadmin/system/views/dept.py         | 47 +++++++---------
 backend/dvadmin/system/views/role.py         | 59 ++++++++++++++++++--
 backend/dvadmin/utils/exception.py           |  7 ++-
 backend/dvadmin/utils/import_export_mixin.py | 19 +++++--
 4 files changed, 92 insertions(+), 40 deletions(-)

diff --git a/backend/dvadmin/system/views/dept.py b/backend/dvadmin/system/views/dept.py
index 8239c85..743fa79 100644
--- a/backend/dvadmin/system/views/dept.py
+++ b/backend/dvadmin/system/views/dept.py
@@ -22,6 +22,13 @@ class DeptSerializer(CustomModelSerializer):
     parent_name = serializers.CharField(read_only=True, source='parent.name')
     status_label = serializers.SerializerMethodField()
     has_children = serializers.SerializerMethodField()
+    hasChild = serializers.SerializerMethodField()
+
+    def get_hasChild(self, instance):
+        hasChild = Dept.objects.filter(parent=instance.id)
+        if hasChild:
+            return True
+        return False
 
     def get_status_label(self, obj: Dept):
         if obj.status:
@@ -133,31 +140,19 @@ class DeptViewSet(CustomModelViewSet):
 
     def list(self, request, *args, **kwargs):
         # 如果懒加载,则只返回父级
-        queryset = self.filter_queryset(self.get_queryset())
-        lazy = self.request.query_params.get('lazy')
-        parent = self.request.query_params.get('parent')
-        if lazy:
-            # 如果懒加载模式,返回全部
-            if not parent:
-                role_list = request.user.role.filter(status=1).values("admin", "data_range")
-                is_admin = False
-                for ele in role_list:
-                    if 3 == ele.get("data_range") or ele.get("admin") == True:
-                        is_admin = True
-                        break
-                if self.request.user.is_superuser or is_admin:
-                    queryset = queryset.filter(parent__isnull=True)
-                else:
-                    queryset = queryset.filter(id=self.request.user.dept_id)
-            serializer = self.get_serializer(queryset, many=True, request=request)
-            return SuccessResponse(data=serializer.data, msg="获取成功")
-
-        page = self.paginate_queryset(queryset)
-        if page is not None:
-            serializer = self.get_serializer(page, many=True, request=request)
-            return self.get_paginated_response(serializer.data)
-        serializer = self.get_serializer(queryset, many=True, request=request)
-        return SuccessResponse(data=serializer.data, msg="获取成功")
+        params = request.query_params
+        parent = params.get('parent', None)
+        if params:
+            if parent:
+                queryset = self.queryset.filter(status=True, parent=parent)
+            else:
+                queryset = self.queryset.filter(status=True)
+        else:
+            queryset = self.queryset.filter(status=True, parent__isnull=True)
+        queryset = self.filter_queryset(queryset)
+        serializer = DeptSerializer(queryset, many=True, request=request)
+        data = serializer.data
+        return SuccessResponse(data=data)
 
     def dept_lazy_tree(self, request, *args, **kwargs):
         parent = self.request.query_params.get('parent')
@@ -170,9 +165,9 @@ class DeptViewSet(CustomModelViewSet):
         data = queryset.filter(status=True).order_by('sort').values('name', 'id', 'parent')
         return DetailResponse(data=data, msg="获取成功")
 
+
     @action(methods=["GET"], detail=False, permission_classes=[AnonymousUserPermission])
     def all_dept(self, request, *args, **kwargs):
-        self.extra_filter_backends = []
         queryset = self.filter_queryset(self.get_queryset())
         data = queryset.filter(status=True).order_by('sort').values('name', 'id', 'parent')
         return DetailResponse(data=data, msg="获取成功")
diff --git a/backend/dvadmin/system/views/role.py b/backend/dvadmin/system/views/role.py
index 66aac90..e1acf87 100644
--- a/backend/dvadmin/system/views/role.py
+++ b/backend/dvadmin/system/views/role.py
@@ -8,12 +8,13 @@
 """
 from rest_framework import serializers
 from rest_framework.decorators import action
+from rest_framework.permissions import IsAuthenticated
 
 from dvadmin.system.models import Role, Menu
 from dvadmin.system.views.dept import DeptSerializer
 from dvadmin.system.views.menu import MenuSerializer
 from dvadmin.system.views.menu_button import MenuButtonSerializer
-from dvadmin.utils.json_response import SuccessResponse
+from dvadmin.utils.json_response import SuccessResponse, DetailResponse
 from dvadmin.utils.serializers import CustomModelSerializer
 from dvadmin.utils.validator import CustomUniqueValidator
 from dvadmin.utils.viewset import CustomModelViewSet
@@ -96,12 +97,58 @@ class RoleViewSet(CustomModelViewSet):
     serializer_class = RoleSerializer
     create_serializer_class = RoleCreateUpdateSerializer
     update_serializer_class = RoleCreateUpdateSerializer
+    search_fields = ['name','key']
 
-    @action(methods=['GET'], detail=True, permission_classes=[])
-    def roleId_get_menu(self, request, *args, **kwargs):
+    @action(methods=['GET'], detail=True, permission_classes=[IsAuthenticated])
+    def roleId_get_menu(self, request,pk):
         """通过角色id获取该角色用于的菜单"""
-        # instance = self.get_object()
-        # queryset = instance.menu.all()
-        queryset = Menu.objects.filter(status=1).all()
+        instance = Role.objects.filter(id=pk).first()
+        queryset = instance.menu.all()
+        # queryset = Menu.objects.filter(status=1).all()
+        queryset = self.filter_queryset(queryset)
         serializer = MenuPermissonSerializer(queryset, many=True)
         return SuccessResponse(data=serializer.data)
+
+    @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])
+    def data_scope(self,request):
+        is_superuser = request.user.is_superuser
+        is_admin = Role.objects.filter(users__id=request.user.id,admin=True)
+        if is_superuser or is_admin:
+            data = [
+            {
+              "value": 0,
+              "label": '仅本人数据权限'
+            },
+            {
+              "value": 1,
+              "label": '本部门及以下数据权限'
+            },
+            {
+              "value": 2,
+              "label": '本部门数据权限'
+            },
+            {
+              "value": 3,
+              "label": '全部数据权限'
+            },
+            {
+              "value": 4,
+              "label": '自定义数据权限'
+            }
+          ]
+        else:
+            data = [
+                {
+                    "value": 0,
+                    "label": '仅本人数据权限'
+                },
+                {
+                    "value": 1,
+                    "label": '本部门及以下数据权限'
+                },
+                {
+                    "value": 2,
+                    "label": '本部门数据权限'
+                }
+            ]
+        return DetailResponse(data=data)
diff --git a/backend/dvadmin/utils/exception.py b/backend/dvadmin/utils/exception.py
index 2cf9150..a6996df 100644
--- a/backend/dvadmin/utils/exception.py
+++ b/backend/dvadmin/utils/exception.py
@@ -40,9 +40,10 @@ def CustomExceptionHandler(ex, context):
     elif isinstance(ex, DRFAPIException):
         set_rollback()
         msg = ex.detail
-        for k, v in msg.items():
-            for i in v:
-                msg = "%s:%s" % (k, i)
+        if isinstance(msg,dict):
+            for k, v in msg.items():
+                for i in v:
+                    msg = "%s:%s" % (k, i)
     elif isinstance(ex, ProtectedError):
         set_rollback()
         msg = "删除失败:该条数据与其他数据有相关绑定"
diff --git a/backend/dvadmin/utils/import_export_mixin.py b/backend/dvadmin/utils/import_export_mixin.py
index 39913fb..45e08db 100644
--- a/backend/dvadmin/utils/import_export_mixin.py
+++ b/backend/dvadmin/utils/import_export_mixin.py
@@ -57,6 +57,11 @@ class ImportSerializerMixin:
             length += 2.1 if ord(char) > 256 else 1
         return round(length, 1) if length <= self.export_column_width else self.export_column_width
 
+    @action(methods=['get'],detail=False)
+    def update_field(self,request:Request):
+        data = [{"label":value,"value":key} for key,value in self.import_field_dict.items()]
+        return DetailResponse(data=data)
+
     @action(methods=['get','post'],detail=False)
     @transaction.atomic  # Django 事务,防止出错
     def import_data(self, request: Request, *args, **kwargs):
@@ -148,12 +153,15 @@ class ImportSerializerMixin:
         unique_list = [
             ele.name for ele in queryset.model._meta.get_fields() if hasattr(ele, "unique") and ele.unique == True
         ]
+        updateField = request.data.get("updateField")
         for ele in data:
-            # 获取 unique 字段
-            if queryset.model._meta.unique_together:  # 判断是否存在联合主键
-                filter_dic = {i: ele.get(i) for i in list(queryset.model._meta.unique_together[0])}
-            else:
-                filter_dic = {i: ele.get(i) for i in list(set(unique_list)) if ele.get(i) is not None}
+            # # 获取 unique 字段
+            # if queryset.model._meta.unique_together:  # 判断是否存在联合主键
+            #     filter_dic = {i: ele.get(i) for i in list(queryset.model._meta.unique_together[0])}
+            # else:
+            #     filter_dic = {i: ele.get(i) for i in list(set(unique_list)) if ele.get(i) is not None}
+            filter_dic = {updateField:ele.get(updateField)}
+            print(162,filter_dic)
             instance = filter_dic and queryset.filter(**filter_dic).first()
             if instance and not updateSupport:
                 continue
@@ -207,6 +215,7 @@ class ExportSerializerMixin:
             length += 2.1 if ord(char) > 256 else 1
         return round(length, 1) if length <= self.export_column_width else self.export_column_width
 
+    @action(methods=['get'],detail=False)
     def export_data(self, request: Request, *args, **kwargs):
         """
         导出功能