From dbb94fb9ffa470fd6b10cc69d3a0f972318b271b Mon Sep 17 00:00:00 2001 From: ahhui Date: Wed, 2 Aug 2023 18:19:52 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(=E7=94=A8=E6=88=B7):=20=20=E9=87=8D?= =?UTF-8?q?=E5=86=99user=E8=A7=86=E5=9B=BE=E9=9B=86=E7=9A=84list=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=EF=BC=8C=E6=94=AF=E6=8C=81=E9=80=92=E5=BD=92=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/dvadmin/system/views/user.py | 37 +++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/backend/dvadmin/system/views/user.py b/backend/dvadmin/system/views/user.py index 1e9f57b..47dc4af 100644 --- a/backend/dvadmin/system/views/user.py +++ b/backend/dvadmin/system/views/user.py @@ -3,13 +3,13 @@ import hashlib from django.contrib.auth.hashers import make_password, check_password from django_restql.fields import DynamicSerializerMethodField from rest_framework import serializers -from rest_framework.decorators import action, permission_classes +from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated from django.db import connection from application import dispatch from dvadmin.system.models import Users, Role, Dept from dvadmin.system.views.role import RoleSerializer -from dvadmin.utils.json_response import ErrorResponse, DetailResponse +from dvadmin.utils.json_response import ErrorResponse, DetailResponse, SuccessResponse from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.validator import CustomUniqueValidator from dvadmin.utils.viewset import CustomModelViewSet @@ -23,7 +23,7 @@ def recursion(instance, parent, result): res.append(data) if new_instance: array = recursion(new_instance, parent, result) - res += (array) + res += array return res @@ -197,6 +197,7 @@ class ExportUserProfileSerializer(CustomModelSerializer): class UserProfileImportSerializer(CustomModelSerializer): password = serializers.CharField(read_only=True, required=False) + def save(self, **kwargs): data = super().save(**kwargs) password = hashlib.new( @@ -363,3 +364,33 @@ class UserViewSet(CustomModelViewSet): return DetailResponse(data=None, msg="修改成功") else: return ErrorResponse(msg="未获取到用户") + + def list(self, request, *args, **kwargs): + dept_id = request.query_params.get('dept') + show_all = request.query_params.get('show_all') + if not dept_id: + dept_id = '' + if not show_all: + show_all = 0 + if int(show_all): + all_did = [dept_id] + def inner(did): + sub = Dept.objects.filter(parent_id=did) + if not sub.exists(): + return + for i in sub: + all_did.append(i.pk) + inner(i) + if dept_id != '': + inner(dept_id) + queryset = Users.objects.filter(dept_id__in=all_did) + else: + queryset = self.filter_queryset(self.get_queryset()) + else: + queryset = self.filter_queryset(self.get_queryset()) + 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="获取成功") From be51124bb6e58a90563a4b76934e01e7ca75f32a Mon Sep 17 00:00:00 2001 From: ahhui Date: Wed, 2 Aug 2023 18:21:14 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat(=E9=83=A8=E9=97=A8):=20=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=83=A8=E9=97=A8=E5=A4=B4=E4=BF=A1=E6=81=AF=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E4=BB=A5=E5=8F=8A=E9=80=92=E5=BD=92=E7=9A=84=E5=A4=B4?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=9F=A5=E8=AF=A2=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/dvadmin/system/views/dept.py | 50 ++++++++++++++++++++++++++++ backend/dvadmin/utils/viewset.py | 2 -- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/backend/dvadmin/system/views/dept.py b/backend/dvadmin/system/views/dept.py index 70ee9fd..9eaa023 100644 --- a/backend/dvadmin/system/views/dept.py +++ b/backend/dvadmin/system/views/dept.py @@ -189,3 +189,53 @@ class DeptViewSet(CustomModelViewSet): dept.save() return SuccessResponse(data=[], msg="下移成功") + + @action(methods=['GET'], detail=False, permission_classes=[]) + def dept_info(self, request): + """部门信息""" + def inner(did, li): + sub = Dept.objects.filter(parent_id=did) + if not sub.exists(): + return li + for i in sub: + li.append(i.pk) + inner(i, li) + return li + dept_id = request.query_params.get('dept_id') + show_all = request.query_params.get('show_all') + if dept_id is None: + return ErrorResponse(msg="部门不存在") + if not show_all: + show_all = 0 + if int(show_all): # 递归当前部门下的所有部门,查询用户 + all_did = [dept_id] + inner(dept_id, all_did) + users = Users.objects.filter(dept_id__in=all_did) + else: + if dept_id != '': + users = Users.objects.filter(dept_id=dept_id) + else: + users = Users.objects.none() + dept_obj = Dept.objects.get(id=dept_id) if dept_id != '' else None + sub_dept = Dept.objects.filter(parent_id=dept_obj.pk) if dept_id != '' else [] + data = { + 'dept_name': dept_obj and dept_obj.name, + 'dept_user': users.count(), + 'owner': dept_obj and dept_obj.owner, + 'description': dept_obj and dept_obj.description, + 'gender': { + 'male': users.filter(gender=1).count(), + 'female': users.filter(gender=2).count(), + 'unknown': users.filter(gender=0).count(), + }, + 'sub_dept_map': [] + } + for dept in sub_dept: + all_did = [dept.pk] + inner(dept.pk, all_did) + sub_data = { + 'name': dept.name, + 'count': Users.objects.filter(dept_id__in=all_did).count() + } + data['sub_dept_map'].append(sub_data) + return SuccessResponse(data) diff --git a/backend/dvadmin/utils/viewset.py b/backend/dvadmin/utils/viewset.py index a40dae0..47e1c6c 100644 --- a/backend/dvadmin/utils/viewset.py +++ b/backend/dvadmin/utils/viewset.py @@ -6,8 +6,6 @@ @Created on: 2021/6/1 001 22:57 @Remark: 自定义视图集 """ -import uuid - from django.db import transaction from drf_yasg import openapi from drf_yasg.utils import swagger_auto_schema From 7da23ab6a605b81a7b055c2d42e292f3001e841d Mon Sep 17 00:00:00 2001 From: ahhui Date: Thu, 3 Aug 2023 10:44:57 +0800 Subject: [PATCH 3/3] =?UTF-8?q?chore(=E4=BC=98=E5=8C=96):=20=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dvadmin/system/fixtures/initSerializer.py | 19 ++++++++++--------- backend/dvadmin/system/fixtures/initialize.py | 9 +++++---- backend/dvadmin/system/urls.py | 4 +--- backend/dvadmin/utils/models.py | 10 ++-------- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/backend/dvadmin/system/fixtures/initSerializer.py b/backend/dvadmin/system/fixtures/initSerializer.py index b8ee294..210e4a7 100644 --- a/backend/dvadmin/system/fixtures/initSerializer.py +++ b/backend/dvadmin/system/fixtures/initSerializer.py @@ -6,8 +6,11 @@ from rest_framework import serializers os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings') import django django.setup() -from dvadmin.system.models import Role, Dept, Users, Menu, MenuButton, ApiWhiteList, Dictionary, SystemConfig, \ +from dvadmin.system.models import ( + Role, Dept, Users, Menu, MenuButton, + ApiWhiteList, Dictionary, SystemConfig, RoleMenuPermission, RoleMenuButtonPermission +) from dvadmin.utils.serializers import CustomModelSerializer @@ -50,7 +53,6 @@ class MenuButtonInitSerializer(CustomModelSerializer): read_only_fields = ["id"] - class MenuInitSerializer(CustomModelSerializer): """ 递归深度获取数信息(用于生成初始化json文件) @@ -139,8 +141,8 @@ class RoleMenuInitSerializer(CustomModelSerializer): """ 初始化角色菜单(用于生成初始化json文件) """ - role_key = serializers.CharField(max_length=100,required=True) - menu_component_name = serializers.CharField(max_length=100,required=True) + role_key = serializers.CharField(max_length=100, required=True) + menu_component_name = serializers.CharField(max_length=100, required=True) def create(self, validated_data): init_data = self.initial_data @@ -154,7 +156,7 @@ class RoleMenuInitSerializer(CustomModelSerializer): class Meta: model = RoleMenuPermission - fields = ['role_key','menu_component_name','creator', 'dept_belong_id'] + fields = ['role_key', 'menu_component_name', 'creator', 'dept_belong_id'] read_only_fields = ["id"] extra_kwargs = { 'role': {'required': False}, @@ -168,8 +170,8 @@ class RoleMenuButtonInitSerializer(CustomModelSerializer): """ 初始化角色菜单按钮(用于生成初始化json文件) """ - role_key = serializers.CharField(max_length=100,required=True) - menu_button_value = serializers.CharField(max_length=100,required=True) + role_key = serializers.CharField(max_length=100, required=True) + menu_button_value = serializers.CharField(max_length=100, required=True) data_range = serializers.CharField(max_length=100, required=False) def create(self, validated_data): @@ -186,7 +188,7 @@ class RoleMenuButtonInitSerializer(CustomModelSerializer): class Meta: model = RoleMenuButtonPermission - fields = ['role_key','menu_button_value','data_range','dept','creator', 'dept_belong_id'] + fields = ['role_key', 'menu_button_value','data_range','dept','creator', 'dept_belong_id'] read_only_fields = ["id"] extra_kwargs = { 'role': {'required': False}, @@ -196,7 +198,6 @@ class RoleMenuButtonInitSerializer(CustomModelSerializer): } - class ApiWhiteListInitSerializer(CustomModelSerializer): """ 初始化获取数信息(用于生成初始化json文件) diff --git a/backend/dvadmin/system/fixtures/initialize.py b/backend/dvadmin/system/fixtures/initialize.py index 45cc103..74d89d7 100644 --- a/backend/dvadmin/system/fixtures/initialize.py +++ b/backend/dvadmin/system/fixtures/initialize.py @@ -8,9 +8,11 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "application.settings") django.setup() from dvadmin.utils.core_initialize import CoreInitialize -from dvadmin.system.fixtures.initSerializer import UsersInitSerializer, DeptInitSerializer, RoleInitSerializer, \ - MenuInitSerializer, ApiWhiteListInitSerializer, DictionaryInitSerializer, SystemConfigInitSerializer, \ - RoleMenuInitSerializer, RoleMenuButtonInitSerializer +from dvadmin.system.fixtures.initSerializer import ( + UsersInitSerializer, DeptInitSerializer, RoleInitSerializer, + MenuInitSerializer, ApiWhiteListInitSerializer, DictionaryInitSerializer, + SystemConfigInitSerializer, RoleMenuInitSerializer, RoleMenuButtonInitSerializer +) class Initialize(CoreInitialize): @@ -51,7 +53,6 @@ class Initialize(CoreInitialize): """ self.init_base(RoleMenuButtonInitSerializer, unique_fields=['role', 'menu_button']) - def init_api_white_list(self): """ 初始API白名单 diff --git a/backend/dvadmin/system/urls.py b/backend/dvadmin/system/urls.py index fb1abd3..0d03cf2 100644 --- a/backend/dvadmin/system/urls.py +++ b/backend/dvadmin/system/urls.py @@ -29,13 +29,11 @@ system_url.register(r'area', AreaViewSet) system_url.register(r'file', FileViewSet) system_url.register(r'api_white_list', ApiWhiteListViewSet) system_url.register(r'system_config', SystemConfigViewSet) -system_url.register(r'message_center',MessageCenterViewSet) +system_url.register(r'message_center', MessageCenterViewSet) system_url.register(r'role_menu_button_permission', RoleMenuButtonPermissionViewSet) system_url.register(r'role_menu_permission', RoleMenuPermissionViewSet) - - urlpatterns = [ path('user/export/', UserViewSet.as_view({'post': 'export_data', })), path('user/import/', UserViewSet.as_view({'get': 'import_data', 'post': 'import_data'})), diff --git a/backend/dvadmin/utils/models.py b/backend/dvadmin/utils/models.py index af7d71c..2c45fa7 100644 --- a/backend/dvadmin/utils/models.py +++ b/backend/dvadmin/utils/models.py @@ -6,8 +6,6 @@ @Created on: 2021/5/31 031 22:08 @Remark: 公共基础model类 """ -import uuid - from django.apps import apps from django.db import models from django.db.models import QuerySet @@ -20,8 +18,6 @@ class SoftDeleteQuerySet(QuerySet): pass - - class SoftDeleteManager(models.Manager): """支持软删除""" @@ -40,7 +36,7 @@ class SoftDeleteManager(models.Manager): return SoftDeleteQuerySet(self.model, using=self._db).exclude(is_deleted=False) return SoftDeleteQuerySet(self.model).exclude(is_deleted=True) - def get_by_natural_key(self,name): + def get_by_natural_key(self, name): return SoftDeleteQuerySet(self.model).get(username=name) @@ -86,8 +82,6 @@ class CoreModel(models.Model): verbose_name_plural = verbose_name - - def get_all_models_objects(model_name=None): """ 获取所有 models 对象 @@ -111,4 +105,4 @@ def get_all_models_objects(model_name=None): settings.ALL_MODELS_OBJECTS.setdefault(item.__name__, {"table": table, "object": item}) if model_name: return settings.ALL_MODELS_OBJECTS[model_name] or {} - return settings.ALL_MODELS_OBJECTS or {} \ No newline at end of file + return settings.ALL_MODELS_OBJECTS or {}