From ea31de0b2ba4ed8f8093b830813ba770547f0b9e Mon Sep 17 00:00:00 2001 From: ibuler Date: Wed, 22 Feb 2023 20:30:43 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86=20?= =?UTF-8?q?field?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/platform.py | 7 +++---- apps/common/api/mixin.py | 3 --- apps/rbac/api/role.py | 13 +++++++------ apps/users/api/user.py | 9 +++++---- apps/users/serializers/group.py | 14 ++++++-------- apps/users/serializers/user.py | 4 +++- 6 files changed, 24 insertions(+), 26 deletions(-) diff --git a/apps/assets/api/platform.py b/apps/assets/api/platform.py index 2d68b2350..be9456ff7 100644 --- a/apps/assets/api/platform.py +++ b/apps/assets/api/platform.py @@ -1,9 +1,8 @@ -from jumpserver.utils import has_valid_xpack_license +from assets.const import AllTypes +from assets.models import Platform +from assets.serializers import PlatformSerializer from common.api import JMSModelViewSet from common.serializers import GroupedChoiceSerializer -from assets.models import Platform -from assets.const import AllTypes -from assets.serializers import PlatformSerializer __all__ = ['AssetPlatformViewSet'] diff --git a/apps/common/api/mixin.py b/apps/common/api/mixin.py index 3c8c2d487..cb8d6ec3e 100644 --- a/apps/common/api/mixin.py +++ b/apps/common/api/mixin.py @@ -16,9 +16,6 @@ __all__ = [ class PaginatedResponseMixin: - paginate_queryset: Callable - get_serializer: Callable - get_paginated_response: Callable def get_paginated_response_from_queryset(self, queryset): page = self.paginate_queryset(queryset) diff --git a/apps/rbac/api/role.py b/apps/rbac/api/role.py index 3340a37fd..3bccdc573 100644 --- a/apps/rbac/api/role.py +++ b/apps/rbac/api/role.py @@ -59,6 +59,8 @@ class RoleViewSet(JMSModelViewSet): @staticmethod def set_users_amount(queryset): """设置角色的用户绑定数量,以减少查询""" + ids = [role.id for role in queryset] + queryset = Role.objects.filter(id__in=ids) org_id = current_org.id q = Q(role__scope=Role.Scope.system) | Q(role__scope=Role.Scope.org, org_id=org_id) role_bindings = RoleBinding.objects.filter(q).values_list('role_id').annotate(user_count=Count('user_id')) @@ -69,12 +71,11 @@ class RoleViewSet(JMSModelViewSet): role.users_amount = role_user_amount_mapper.get(role.id, 0) return queryset - def paginate_queryset(self, queryset): - page_queryset = super().paginate_queryset(queryset) # 返回是 list 对象 - page_queryset_ids = [str(i.id) for i in page_queryset] - queryset = queryset.filter(id__in=page_queryset_ids) - queryset = self.set_users_amount(queryset) - return queryset + def get_serializer(self, *args, **kwargs): + if len(args) == 1: + queryset = self.set_users_amount(args[0]) + args = (queryset,) + return super().get_serializer(*args, **kwargs) def perform_update(self, serializer): instance = serializer.instance diff --git a/apps/users/api/user.py b/apps/users/api/user.py index 2b08418bf..c7f2d62eb 100644 --- a/apps/users/api/user.py +++ b/apps/users/api/user.py @@ -51,10 +51,11 @@ class UserViewSet(CommonApiMixin, UserQuerysetMixin, SuggestionMixin, BulkModelV queryset = super().get_queryset().prefetch_related('groups') return queryset - def paginate_queryset(self, queryset): - page = super().paginate_queryset(queryset) - self.set_users_roles_for_cache(page or queryset) - return page + def get_serializer(self, *args, **kwargs): + if len(args) == 0: + queryset = self.set_users_roles_for_cache(args[0]) + args = (queryset,) + return super().get_serializer(*args, **kwargs) @action(methods=['get'], detail=False, url_path='suggestions') def match(self, request, *args, **kwargs): diff --git a/apps/users/serializers/group.py b/apps/users/serializers/group.py index 6f75b402a..90228d681 100644 --- a/apps/users/serializers/group.py +++ b/apps/users/serializers/group.py @@ -1,13 +1,12 @@ # -*- coding: utf-8 -*- # -from django.utils.translation import ugettext_lazy as _ -from django.db.models import Prefetch -from rest_framework import serializers - -from orgs.mixins.serializers import BulkOrgResourceModelSerializer from django.db.models import Count -from ..models import User, UserGroup +from django.utils.translation import ugettext_lazy as _ + +from common.serializers.mixin import ObjectRelatedField +from orgs.mixins.serializers import BulkOrgResourceModelSerializer from .. import utils +from ..models import User, UserGroup __all__ = [ 'UserGroupSerializer', @@ -15,9 +14,8 @@ __all__ = [ class UserGroupSerializer(BulkOrgResourceModelSerializer): - users = serializers.PrimaryKeyRelatedField( + users = ObjectRelatedField( required=False, many=True, queryset=User.objects, label=_('User'), - # write_only=True, # group can return many to many on detail ) class Meta: diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index 74c182fed..c04f21018 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -39,7 +39,7 @@ class RolesSerializerMixin(serializers.Serializer): label=_("System roles"), many=True, default=default_system_roles ) org_roles = ObjectRelatedField( - queryset=Role.org_roles, attrs=('id', 'display_name'), + queryset=Role.org_roles, attrs=('id', 'display_name', 'name'), label=_("Org roles"), many=True, required=False, default=default_org_roles ) @@ -91,6 +91,8 @@ class UserSerializer(RolesSerializerMixin, CommonBulkSerializerMixin, serializer ) login_blocked = serializers.BooleanField(read_only=True, label=_("Login blocked")) is_expired = serializers.BooleanField(read_only=True, label=_("Is expired")) + is_valid = serializers.BooleanField(read_only=True, label=_("Is valid")) + is_otp_secret_key_bound = serializers.BooleanField(read_only=True, label=_("Is OTP bound")) can_public_key_auth = serializers.BooleanField( source="can_use_ssh_key_login", label=_("Can public key authentication"), read_only=True