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): """ 导出功能