Merge pull request #3621 from jumpserver/dev_node

[Update] 资产节点添加资产时,祖先节点授权的系统用户关联对应资产
pull/3624/head
BaiJiangJie 2020-01-10 16:47:44 +08:00 committed by GitHub
commit bafffc95b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 4 deletions

View File

@ -10,6 +10,7 @@ from django.dispatch import receiver
from common.utils import get_logger, timeit from common.utils import get_logger, timeit
from common.decorator import on_transaction_commit from common.decorator import on_transaction_commit
from .models import Asset, SystemUser, Node, AuthBook from .models import Asset, SystemUser, Node, AuthBook
from .utils import TreeService
from .tasks import ( from .tasks import (
update_assets_hardware_info_util, update_assets_hardware_info_util,
test_asset_connectivity_util, test_asset_connectivity_util,
@ -131,16 +132,22 @@ def on_asset_nodes_add(sender, instance=None, action='', model=None, pk_set=None
if action != "post_add": if action != "post_add":
return return
logger.debug("Assets node add signal recv: {}".format(action)) logger.debug("Assets node add signal recv: {}".format(action))
queryset = model.objects.filter(pk__in=pk_set).values_list('id', flat=True) queryset = model.objects.filter(pk__in=pk_set).values_list('key', flat=True)
if model == Node: if model == Node:
nodes = queryset nodes = queryset
assets = [instance] assets = [instance]
else: else:
nodes = [instance] nodes = [instance]
assets = queryset assets = queryset
# 节点资产发生变化时,将资产关联到节点关联的系统用户, 只关注新增的 # 节点资产发生变化时,将资产关联到节点及祖先节点关联的系统用户, 只关注新增的
nodes_ancestors_keys = set()
node_tree = TreeService.new()
for node in nodes:
ancestors_keys = node_tree.ancestors_ids(nid=node)
nodes_ancestors_keys.update(ancestors_keys)
system_users = SystemUser.objects.filter(nodes__key__in=nodes_ancestors_keys)
system_users_assets = defaultdict(set) system_users_assets = defaultdict(set)
system_users = SystemUser.objects.filter(nodes__in=nodes)
for system_user in system_users: for system_user in system_users:
system_users_assets[system_user].update(set(assets)) system_users_assets[system_user].update(set(assets))
for system_user, _assets in system_users_assets.items(): for system_user, _assets in system_users_assets.items():

View File

@ -84,11 +84,15 @@ class TreeService(Tree):
children_ids = self.all_children_ids(nid, with_self=with_self) children_ids = self.all_children_ids(nid, with_self=with_self)
return [self.get_node(i, deep=deep) for i in children_ids] return [self.get_node(i, deep=deep) for i in children_ids]
def ancestors(self, nid, with_self=False, deep=False): def ancestors_ids(self, nid, with_self=True):
ancestor_ids = list(self.rsearch(nid)) ancestor_ids = list(self.rsearch(nid))
ancestor_ids.pop() ancestor_ids.pop()
if not with_self: if not with_self:
ancestor_ids.pop(0) ancestor_ids.pop(0)
return ancestor_ids
def ancestors(self, nid, with_self=False, deep=False):
ancestor_ids = self.ancestors_ids(nid, with_self=with_self)
return [self.get_node(i, deep=deep) for i in ancestor_ids] return [self.get_node(i, deep=deep) for i in ancestor_ids]
def get_node_full_tag(self, nid): def get_node_full_tag(self, nid):