mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-12-24 21:12:35 +00:00
perf: UserPermUtil supoort get_node_assets and get_node_all_assets
This commit is contained in:
@@ -41,11 +41,6 @@ class UserPermTree(AssetSearchTree):
|
||||
self._user: User = user
|
||||
self._util = UserPermUtil(user, org=self._org)
|
||||
|
||||
@timeit
|
||||
def _pre_build(self):
|
||||
super()._pre_build()
|
||||
self._util.init()
|
||||
|
||||
def _make_assets_q_object(self):
|
||||
q_base = super()._make_assets_q_object()
|
||||
q_perm_assets = Q(id__in=self._util._user_direct_asset_ids)
|
||||
@@ -1,8 +1,10 @@
|
||||
|
||||
from common.utils import timeit, lazyproperty, get_logger
|
||||
from django.db.models import Q
|
||||
|
||||
from common.utils import timeit, lazyproperty, get_logger, is_uuid
|
||||
from orgs.utils import current_org
|
||||
from users.models import User
|
||||
from assets.models import Node
|
||||
from assets.models import Node, Asset
|
||||
from perms.models import AssetPermission
|
||||
|
||||
|
||||
@@ -26,21 +28,19 @@ class UserPermUtil(object):
|
||||
self._user_permission_ids = set()
|
||||
self._user_group_ids = set()
|
||||
self._user_group_permission_ids = set()
|
||||
self._user_all_permission_ids = set()
|
||||
self._user_direct_asset_ids = set()
|
||||
self._user_direct_node_ids = set()
|
||||
self._user_direct_node_all_children_ids = set()
|
||||
self._init()
|
||||
|
||||
def init(self):
|
||||
def _init(self):
|
||||
self._load_user_permission_ids()
|
||||
self._load_user_group_ids()
|
||||
self._load_user_group_permission_ids()
|
||||
self._load_user_direct_asset_ids()
|
||||
self._load_user_direct_node_ids()
|
||||
self._load_user_direct_node_all_children_ids()
|
||||
|
||||
@lazyproperty
|
||||
def _user_all_permission_ids(self):
|
||||
return self._user_permission_ids | self._user_group_permission_ids
|
||||
|
||||
@timeit
|
||||
def _load_user_permission_ids(self):
|
||||
@@ -49,6 +49,7 @@ class UserPermUtil(object):
|
||||
).distinct('assetpermission_id').values_list('assetpermission_id', flat=True)
|
||||
perm_ids = self._uuids_to_string(perm_ids)
|
||||
self._user_permission_ids.update(perm_ids)
|
||||
self._user_all_permission_ids.update(perm_ids)
|
||||
|
||||
@timeit
|
||||
def _load_user_group_ids(self):
|
||||
@@ -65,6 +66,7 @@ class UserPermUtil(object):
|
||||
).distinct('assetpermission_id').values_list('assetpermission_id', flat=True)
|
||||
perm_ids = self._uuids_to_string(perm_ids)
|
||||
self._user_group_permission_ids.update(perm_ids)
|
||||
self._user_all_permission_ids.update(perm_ids)
|
||||
|
||||
@timeit
|
||||
def _load_user_direct_asset_ids(self):
|
||||
@@ -98,6 +100,30 @@ class UserPermUtil(object):
|
||||
self._user_direct_node_all_children_ids.update(self._user_direct_node_ids)
|
||||
self._user_direct_node_all_children_ids.update(dn_children_ids)
|
||||
|
||||
def get_node_assets(self, node: Node):
|
||||
''' 获取节点下授权的直接资产, Luna 页面展开时需要 '''
|
||||
q = Q(node_id=node.id)
|
||||
if str(node.id) not in self._user_direct_node_all_children_ids:
|
||||
q &= Q(id__in=self._user_direct_asset_ids)
|
||||
assets = Asset.objects.filter(q)
|
||||
return assets
|
||||
|
||||
def get_node_all_assets(self, node: Node):
|
||||
''' 获取节点及其子节点下所有授权资产, 测试时需要 '''
|
||||
if str(node.id) in self._user_direct_node_all_children_ids:
|
||||
assets = node.get_all_assets()
|
||||
return assets
|
||||
|
||||
children_ids = node.get_all_children(with_self=True).values_list('id', flat=True)
|
||||
children_ids = self._uuids_to_string(children_ids)
|
||||
dn_all_nodes_ids = set(children_ids) & self._user_direct_node_all_children_ids
|
||||
other_nodes_ids = set(children_ids) - dn_all_nodes_ids
|
||||
|
||||
q = Q(node_id__in=dn_all_nodes_ids)
|
||||
q |= Q(node_id__in=other_nodes_ids) & Q(id__in=self._user_direct_asset_ids)
|
||||
assets = Asset.objects.filter(q)
|
||||
return assets
|
||||
|
||||
def _uuids_to_string(self, uuids):
|
||||
return [ str(u) for u in uuids ]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user