Commit 6fc666e6 authored by ibuler's avatar ibuler

[Update] 优化获取系统用户

parent 89fa0658
...@@ -298,14 +298,15 @@ class NodeAssetsMixin: ...@@ -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 ( ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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()]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment