perf: 优化授权资产 api,很多资产也不怕

pull/12539/head
ibuler 2024-01-12 16:44:46 +08:00 committed by Bryan
parent e428eb351b
commit 9c8635b230
3 changed files with 14 additions and 11 deletions

View File

@ -1,8 +1,8 @@
from rest_framework.pagination import LimitOffsetPagination from rest_framework.pagination import LimitOffsetPagination
from rest_framework.request import Request from rest_framework.request import Request
from common.utils import get_logger
from assets.models import Node from assets.models import Node
from common.utils import get_logger
logger = get_logger(__name__) logger = get_logger(__name__)
@ -28,6 +28,7 @@ class AssetPaginationBase(LimitOffsetPagination):
'key', 'all', 'show_current_asset', 'key', 'all', 'show_current_asset',
'cache_policy', 'display', 'draw', 'cache_policy', 'display', 'draw',
'order', 'node', 'node_id', 'fields_size', 'order', 'node', 'node_id', 'fields_size',
'asset'
} }
for k, v in self._request.query_params.items(): for k, v in self._request.query_params.items():
if k not in exclude_query_params and v is not None: if k not in exclude_query_params and v is not None:

View File

@ -7,8 +7,7 @@ from assets.models import Asset, Node
from common.utils import get_logger, lazyproperty, is_uuid from common.utils import get_logger, lazyproperty, is_uuid
from orgs.utils import tmp_to_root_org from orgs.utils import tmp_to_root_org
from perms import serializers from perms import serializers
from perms.pagination import AllPermedAssetPagination from perms.pagination import NodePermedAssetPagination, AllPermedAssetPagination
from perms.pagination import NodePermedAssetPagination
from perms.utils import UserPermAssetUtil, PermAssetDetailUtil from perms.utils import UserPermAssetUtil, PermAssetDetailUtil
from .mixin import ( from .mixin import (
SelfOrPKUserMixin SelfOrPKUserMixin

View File

@ -24,7 +24,6 @@ class AssetPermissionPermAssetUtil:
self.perm_ids = perm_ids self.perm_ids = perm_ids
def get_all_assets(self): def get_all_assets(self):
""" 获取所有授权的资产 """
node_assets = self.get_perm_nodes_assets() node_assets = self.get_perm_nodes_assets()
direct_assets = self.get_direct_assets() direct_assets = self.get_direct_assets()
# 比原来的查到所有 asset id 再搜索块很多,因为当资产量大的时候,搜索会很慢 # 比原来的查到所有 asset id 再搜索块很多,因为当资产量大的时候,搜索会很慢
@ -34,10 +33,11 @@ class AssetPermissionPermAssetUtil:
def get_perm_nodes_assets(self, flat=False): def get_perm_nodes_assets(self, flat=False):
""" 获取所有授权节点下的资产 """ """ 获取所有授权节点下的资产 """
from assets.models import Node from assets.models import Node
nodes = Node.objects \ from ..models import AssetPermission
.prefetch_related('granted_by_permissions') \ nodes_ids = AssetPermission.objects \
.filter(granted_by_permissions__in=self.perm_ids) \ .filter(id__in=self.perm_ids) \
.only('id', 'key') .values_list('nodes', flat=True)
nodes = Node.objects.filter(id__in=nodes_ids).only('id', 'key')
assets = PermNode.get_nodes_all_assets(*nodes) assets = PermNode.get_nodes_all_assets(*nodes)
if flat: if flat:
return set(assets.values_list('id', flat=True)) return set(assets.values_list('id', flat=True))
@ -46,9 +46,11 @@ class AssetPermissionPermAssetUtil:
@timeit @timeit
def get_direct_assets(self, flat=False): def get_direct_assets(self, flat=False):
""" 获取直接授权的资产 """ """ 获取直接授权的资产 """
assets = Asset.objects.order_by() \ from ..models import AssetPermission
.filter(granted_by_permissions__id__in=self.perm_ids) \ asset_ids = AssetPermission.objects \
.distinct() .filter(id__in=self.perm_ids) \
.values_list('assets', flat=True)
assets = Asset.objects.filter(id__in=asset_ids).distinct()
if flat: if flat:
return set(assets.values_list('id', flat=True)) return set(assets.values_list('id', flat=True))
return assets return assets
@ -152,6 +154,7 @@ class UserPermAssetUtil(AssetPermissionPermAssetUtil):
assets = assets.filter(nodes__id=node.id).order_by().distinct() assets = assets.filter(nodes__id=node.id).order_by().distinct()
return assets return assets
@timeit
def _get_indirect_perm_node_all_assets(self, node): def _get_indirect_perm_node_all_assets(self, node):
""" 获取间接授权节点下的所有资产 """ 获取间接授权节点下的所有资产
此算法依据 `UserAssetGrantedTreeNodeRelation` 的数据查询 此算法依据 `UserAssetGrantedTreeNodeRelation` 的数据查询