diff --git a/apps/assets/api/node.py b/apps/assets/api/node.py index bb8cc719a..1d8a4f497 100644 --- a/apps/assets/api/node.py +++ b/apps/assets/api/node.py @@ -140,7 +140,7 @@ class NodeChildrenApi(mixins.ListModelMixin, generics.CreateAPIView): node_fake = Node() node_fake.id = asset.id node_fake.is_node = False - node_fake.parent = node + node_fake.parent_id = node.id node_fake.value = asset.hostname queryset.append(node_fake) queryset = sorted(queryset, key=lambda x: x.is_node, reverse=True) diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py index f407e11b0..4f4f9ad8b 100644 --- a/apps/assets/models/node.py +++ b/apps/assets/models/node.py @@ -5,7 +5,7 @@ import uuid from django.db import models, transaction from django.db.models import Q from django.utils.translation import ugettext_lazy as _ - +from common.utils import with_cache __all__ = ['Node'] @@ -166,6 +166,6 @@ class Node(models.Model): obj, created = cls.objects.get_or_create( key='0', defaults={"key": '0', 'value': "ROOT"} ) + print(obj) return obj - diff --git a/apps/assets/serializers/node.py b/apps/assets/serializers/node.py index 00cea71f0..56e01f742 100644 --- a/apps/assets/serializers/node.py +++ b/apps/assets/serializers/node.py @@ -64,14 +64,11 @@ class NodeSerializer(serializers.ModelSerializer): @staticmethod def get_parent(obj): - return obj.parent.id + return obj.parent.id if obj.is_node else obj.parent_id @staticmethod def get_assets_amount(obj): - if obj.is_node: - return obj.get_all_assets().count() - else: - return 0 + return obj.get_all_assets().count() if obj.is_node else 0 def get_fields(self): fields = super().get_fields() diff --git a/apps/common/utils.py b/apps/common/utils.py index d73c094ec..deaeb5280 100644 --- a/apps/common/utils.py +++ b/apps/common/utils.py @@ -16,6 +16,7 @@ import calendar import threading from io import StringIO import uuid +from functools import wraps import paramiko import sshpubkeys @@ -395,3 +396,17 @@ class TeeObj: def close(self): self.file_obj.close() + +def with_cache(func): + cache = {} + key = "_{}.{}".format(func.__module__, func.__name__) + + @wraps(func) + def wrapper(*args, **kwargs): + cached = cache.get(key) + if cached: + return cached + res = func(*args, **kwargs) + cache[key] = res + return res + return wrapper diff --git a/apps/perms/utils.py b/apps/perms/utils.py index 36c432826..475acfb68 100644 --- a/apps/perms/utils.py +++ b/apps/perms/utils.py @@ -104,6 +104,11 @@ class AssetPermissionUtil: return assets def get_nodes_with_assets(self): + """ + 返回节点并且包含资产 + {"node": {"assets": set("system_user")}} + :return: + """ assets = self.get_assets() nodes = defaultdict(dict) for asset, system_users in assets.items(): @@ -112,7 +117,7 @@ class AssetPermissionUtil: if asset in nodes[node]: nodes[node][asset].update(system_users) else: - nodes[node] = {asset: system_users} + nodes[node][asset] = system_users return nodes