mirror of https://github.com/jumpserver/jumpserver
perf: 优化授权资产 api,很多资产也不怕
parent
e428eb351b
commit
9c8635b230
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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` 的数据查询
|
||||||
|
|
Loading…
Reference in New Issue