diff --git a/apps/assets/pagination.py b/apps/assets/pagination.py index 8ae42ef16..316029301 100644 --- a/apps/assets/pagination.py +++ b/apps/assets/pagination.py @@ -1,8 +1,8 @@ from rest_framework.pagination import LimitOffsetPagination from rest_framework.request import Request -from common.utils import get_logger from assets.models import Node +from common.utils import get_logger logger = get_logger(__name__) @@ -28,6 +28,7 @@ class AssetPaginationBase(LimitOffsetPagination): 'key', 'all', 'show_current_asset', 'cache_policy', 'display', 'draw', 'order', 'node', 'node_id', 'fields_size', + 'asset' } for k, v in self._request.query_params.items(): if k not in exclude_query_params and v is not None: diff --git a/apps/perms/api/user_permission/assets.py b/apps/perms/api/user_permission/assets.py index bc51dfe77..6db934c3b 100644 --- a/apps/perms/api/user_permission/assets.py +++ b/apps/perms/api/user_permission/assets.py @@ -7,8 +7,7 @@ from assets.models import Asset, Node from common.utils import get_logger, lazyproperty, is_uuid from orgs.utils import tmp_to_root_org from perms import serializers -from perms.pagination import AllPermedAssetPagination -from perms.pagination import NodePermedAssetPagination +from perms.pagination import NodePermedAssetPagination, AllPermedAssetPagination from perms.utils import UserPermAssetUtil, PermAssetDetailUtil from .mixin import ( SelfOrPKUserMixin diff --git a/apps/perms/utils/user_perm.py b/apps/perms/utils/user_perm.py index 0ad02fb25..d06f18a83 100644 --- a/apps/perms/utils/user_perm.py +++ b/apps/perms/utils/user_perm.py @@ -24,7 +24,6 @@ class AssetPermissionPermAssetUtil: self.perm_ids = perm_ids def get_all_assets(self): - """ 获取所有授权的资产 """ node_assets = self.get_perm_nodes_assets() direct_assets = self.get_direct_assets() # 比原来的查到所有 asset id 再搜索块很多,因为当资产量大的时候,搜索会很慢 @@ -34,10 +33,11 @@ class AssetPermissionPermAssetUtil: def get_perm_nodes_assets(self, flat=False): """ 获取所有授权节点下的资产 """ from assets.models import Node - nodes = Node.objects \ - .prefetch_related('granted_by_permissions') \ - .filter(granted_by_permissions__in=self.perm_ids) \ - .only('id', 'key') + from ..models import AssetPermission + nodes_ids = AssetPermission.objects \ + .filter(id__in=self.perm_ids) \ + .values_list('nodes', flat=True) + nodes = Node.objects.filter(id__in=nodes_ids).only('id', 'key') assets = PermNode.get_nodes_all_assets(*nodes) if flat: return set(assets.values_list('id', flat=True)) @@ -46,9 +46,11 @@ class AssetPermissionPermAssetUtil: @timeit def get_direct_assets(self, flat=False): """ 获取直接授权的资产 """ - assets = Asset.objects.order_by() \ - .filter(granted_by_permissions__id__in=self.perm_ids) \ - .distinct() + from ..models import AssetPermission + asset_ids = AssetPermission.objects \ + .filter(id__in=self.perm_ids) \ + .values_list('assets', flat=True) + assets = Asset.objects.filter(id__in=asset_ids).distinct() if flat: return set(assets.values_list('id', flat=True)) return assets @@ -152,6 +154,7 @@ class UserPermAssetUtil(AssetPermissionPermAssetUtil): assets = assets.filter(nodes__id=node.id).order_by().distinct() return assets + @timeit def _get_indirect_perm_node_all_assets(self, node): """ 获取间接授权节点下的所有资产 此算法依据 `UserAssetGrantedTreeNodeRelation` 的数据查询