From 22dd81de43b8a587cbe6db64065946c56c0e1d65 Mon Sep 17 00:00:00 2001 From: Bai Date: Thu, 16 Feb 2023 16:51:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=9B=E5=BB=BA=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E3=80=81=E8=B5=84=E4=BA=A7=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E8=B5=84=E4=BA=A7=E6=95=B0=E9=87=8F=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E5=88=B7=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E7=9A=84=E4=BF=A1=E5=8F=B7=E4=B8=8D=E5=A4=AA?= =?UTF-8?q?=E5=AF=B9=EF=BC=8C=E5=A6=82=E6=9E=9C=E6=98=AF=20post=5Fremove?= =?UTF-8?q?=20=E9=82=A3=E4=B9=88=E8=8E=B7=E5=8F=96=E8=B5=84=E4=BA=A7?= =?UTF-8?q?=E7=9A=84=E5=85=B3=E8=81=94=E8=8A=82=E7=82=B9=E6=98=AF=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E4=B8=8D=E5=88=B0=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/signal_handlers/asset.py | 2 +- apps/assets/signal_handlers/node_assets_amount.py | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/assets/signal_handlers/asset.py b/apps/assets/signal_handlers/asset.py index 88ebab11e..be25988f6 100644 --- a/apps/assets/signal_handlers/asset.py +++ b/apps/assets/signal_handlers/asset.py @@ -91,7 +91,7 @@ def on_asset_delete(instance: Asset, using, **kwargs): @receiver(post_delete, sender=Asset) def on_asset_post_delete(instance: Asset, using, **kwargs): logger.debug("Asset post delete signal recv: {}".format(instance)) - node_ids = getattr(instance, RELATED_NODE_IDS, None) + node_ids = getattr(instance, RELATED_NODE_IDS, []) if node_ids: m2m_changed.send( sender=Asset.nodes.through, instance=instance, reverse=False, diff --git a/apps/assets/signal_handlers/node_assets_amount.py b/apps/assets/signal_handlers/node_assets_amount.py index 361f3a176..79e2ed568 100644 --- a/apps/assets/signal_handlers/node_assets_amount.py +++ b/apps/assets/signal_handlers/node_assets_amount.py @@ -6,7 +6,7 @@ from django.db.models.signals import m2m_changed from django.dispatch import receiver from assets.models import Asset, Node -from common.const.signals import PRE_ADD, POST_REMOVE, PRE_CLEAR +from common.const.signals import PRE_CLEAR, POST_ADD, PRE_REMOVE from common.decorators import on_transaction_commit, merge_delay_run from common.utils import get_logger from orgs.utils import tmp_to_org @@ -24,7 +24,8 @@ def on_node_asset_change(sender, action, instance, reverse, pk_set, **kwargs): if action in refused: raise ValueError - mapper = {PRE_ADD: add, POST_REMOVE: sub} + # 这里监听 post_add, pre_remove, 如果pre_add 和 post_remove, 那么 node_ids 就已经获取不到了 + mapper = {POST_ADD: add, PRE_REMOVE: sub} if action not in mapper: return @@ -32,13 +33,14 @@ def on_node_asset_change(sender, action, instance, reverse, pk_set, **kwargs): if reverse: node_ids = [instance.id] else: - node_ids = pk_set + node_ids = list(pk_set) update_nodes_assets_amount(node_ids=node_ids) @merge_delay_run(ttl=5) def update_nodes_assets_amount(node_ids=()): - nodes = list(Node.objects.filter(id__in=node_ids)) + nodes = Node.objects.filter(id__in=node_ids) + nodes = Node.get_ancestor_queryset(nodes) logger.debug('Recv asset nodes change signal, recompute node assets amount') logger.info('Update nodes assets amount: {} nodes'.format(len(node_ids)))