mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-06-25 22:42:05 +00:00
[Update] 优化获取系统用户
This commit is contained in:
parent
89fa0658e1
commit
6fc666e60d
@ -298,14 +298,15 @@ class NodeAssetsMixin:
|
|||||||
return self.get_all_assets().valid()
|
return self.get_all_assets().valid()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@timeit
|
def get_nodes_all_assets(cls, nodes_keys, extra_assets_ids=None):
|
||||||
def get_nodes_all_assets(cls, nodes_keys):
|
|
||||||
from .asset import Asset
|
from .asset import Asset
|
||||||
nodes_keys = cls.clean_children_keys(nodes_keys)
|
nodes_keys = cls.clean_children_keys(nodes_keys)
|
||||||
assets_ids = set()
|
assets_ids = set()
|
||||||
for key in nodes_keys:
|
for key in nodes_keys:
|
||||||
node_assets_ids = cls.tree().all_assets(key)
|
node_assets_ids = cls.tree().all_assets(key)
|
||||||
assets_ids.update(set(node_assets_ids))
|
assets_ids.update(set(node_assets_ids))
|
||||||
|
if extra_assets_ids:
|
||||||
|
assets_ids.update(set(extra_assets_ids))
|
||||||
return Asset.objects.filter(id__in=assets_ids)
|
return Asset.objects.filter(id__in=assets_ids)
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ from rest_framework.generics import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from common.permissions import IsOrgAdminOrAppUser
|
from common.permissions import IsOrgAdminOrAppUser
|
||||||
from common.utils import get_logger
|
from common.utils import get_logger, timeit
|
||||||
from ...hands import Node
|
from ...hands import Node
|
||||||
from ... import serializers
|
from ... import serializers
|
||||||
from .mixin import UserAssetPermissionMixin, UserAssetTreeMixin
|
from .mixin import UserAssetPermissionMixin, UserAssetTreeMixin
|
||||||
|
@ -334,17 +334,13 @@ class AssetPermissionUtilV2(AssetPermissionUtilCacheMixin):
|
|||||||
for node in nodes:
|
for node in nodes:
|
||||||
ancestor_keys = node.get_ancestor_keys(with_self=True)
|
ancestor_keys = node.get_ancestor_keys(with_self=True)
|
||||||
nodes_keys_related.update(set(ancestor_keys))
|
nodes_keys_related.update(set(ancestor_keys))
|
||||||
pattern = []
|
|
||||||
for key in nodes_keys_related:
|
|
||||||
pattern.append(r'^{0}$|^{0}:'.format(key))
|
|
||||||
pattern = '|'.join(list(pattern))
|
|
||||||
kwargs = {"assets": asset}
|
kwargs = {"assets": asset}
|
||||||
|
|
||||||
if pattern:
|
if nodes_keys_related:
|
||||||
kwargs["nodes__key__regex"] = pattern
|
kwargs["nodes__key__in"] = nodes_keys_related
|
||||||
|
|
||||||
queryset = self.permissions
|
queryset = self.permissions
|
||||||
if len(kwargs) == 1:
|
if kwargs == 1:
|
||||||
queryset = queryset.filter(**kwargs)
|
queryset = queryset.filter(**kwargs)
|
||||||
elif len(kwargs) > 1:
|
elif len(kwargs) > 1:
|
||||||
kwargs = [{k: v} for k, v in kwargs.items()]
|
kwargs = [{k: v} for k, v in kwargs.items()]
|
||||||
@ -378,33 +374,11 @@ class AssetPermissionUtilV2(AssetPermissionUtilCacheMixin):
|
|||||||
nodes_keys = Node.clean_children_keys(nodes_keys)
|
nodes_keys = Node.clean_children_keys(nodes_keys)
|
||||||
return nodes_keys, assets_ids
|
return nodes_keys, assets_ids
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def filter_assets_by_or_kwargs(kwargs):
|
|
||||||
if len(kwargs) == 1:
|
|
||||||
queryset = Asset.objects.filter(**kwargs)
|
|
||||||
elif len(kwargs) > 1:
|
|
||||||
kwargs = [{k: v} for k, v in kwargs.items()]
|
|
||||||
args = [Q(**kw) for kw in kwargs]
|
|
||||||
args = reduce(lambda x, y: x | y, args)
|
|
||||||
queryset = Asset.objects.filter(args)
|
|
||||||
else:
|
|
||||||
queryset = Asset.objects.none()
|
|
||||||
return queryset
|
|
||||||
|
|
||||||
@timeit
|
@timeit
|
||||||
def get_assets(self):
|
def get_assets(self):
|
||||||
nodes_keys, assets_ids = self.get_permissions_nodes_and_assets()
|
nodes_keys, assets_ids = self.get_permissions_nodes_and_assets()
|
||||||
pattern = set()
|
queryset = Node.get_nodes_all_assets(nodes_keys, extra_assets_ids=assets_ids)
|
||||||
for key in nodes_keys:
|
return queryset.valid()
|
||||||
pattern.add(r'^{0}$|^{0}:'.format(key))
|
|
||||||
pattern = '|'.join(list(pattern))
|
|
||||||
kwargs = {}
|
|
||||||
if assets_ids:
|
|
||||||
kwargs["id__in"] = assets_ids
|
|
||||||
if pattern:
|
|
||||||
kwargs["nodes__key__regex"] = pattern
|
|
||||||
queryset = self.filter_assets_by_or_kwargs(kwargs)
|
|
||||||
return queryset.valid().distinct()
|
|
||||||
|
|
||||||
def get_nodes_assets(self, node, deep=False):
|
def get_nodes_assets(self, node, deep=False):
|
||||||
if deep:
|
if deep:
|
||||||
@ -412,7 +386,7 @@ class AssetPermissionUtilV2(AssetPermissionUtilCacheMixin):
|
|||||||
else:
|
else:
|
||||||
assets_ids = self.user_tree.assets(node.key)
|
assets_ids = self.user_tree.assets(node.key)
|
||||||
queryset = Asset.objects.filter(id__in=assets_ids)
|
queryset = Asset.objects.filter(id__in=assets_ids)
|
||||||
return queryset.valid().distinct()
|
return queryset.valid()
|
||||||
|
|
||||||
def get_nodes(self):
|
def get_nodes(self):
|
||||||
return [n.identifier for n in self.user_tree.all_nodes_itr()]
|
return [n.identifier for n in self.user_tree.all_nodes_itr()]
|
||||||
|
Loading…
Reference in New Issue
Block a user