From a9ddbcc0cdcb496bf86ab1c1b3c136fb8b6d9c00 Mon Sep 17 00:00:00 2001 From: Michael Bai Date: Fri, 24 Sep 2021 11:45:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=92=8C=E8=B5=84=E4=BA=A7/=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=85=B3=E8=81=94=E6=97=B6=E8=B5=84=E4=BA=A7=E7=89=B9?= =?UTF-8?q?=E6=9D=83=E7=94=A8=E6=88=B7=E6=9B=B4=E6=96=B0=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/authbook.py | 16 +++++++++------- apps/assets/signals_handler/authbook.py | 6 ++++-- apps/assets/tasks/common.py | 11 ++++++++++- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/apps/assets/models/authbook.py b/apps/assets/models/authbook.py index 180dc90f7..2707583da 100644 --- a/apps/assets/models/authbook.py +++ b/apps/assets/models/authbook.py @@ -94,25 +94,27 @@ class AuthBook(BaseUser, AbsConnectivity): i.private_key = self.private_key i.public_key = self.public_key i.comment = 'Update triggered by account {}'.format(self.id) - i.save(update_fields=['password', 'private_key', 'public_key']) + + # 不触发post_save信号 + self.__class__.objects.bulk_update(matched, fields=['password', 'private_key', 'public_key']) def remove_asset_admin_user_if_need(self): - if not self.asset or not self.asset.admin_user: + if not self.asset or not self.systemuser: return - if not self.systemuser.is_admin_user: + if not self.systemuser.is_admin_user or self.asset.admin_user != self.systemuser: return - logger.debug('Remove asset admin user: {} {}'.format(self.asset, self.systemuser)) self.asset.admin_user = None self.asset.save() + logger.debug('Remove asset admin user: {} {}'.format(self.asset, self.systemuser)) def update_asset_admin_user_if_need(self): - if not self.systemuser or not self.systemuser.is_admin_user: + if not self.asset or not self.systemuser: return - if not self.asset or self.asset.admin_user == self.systemuser: + if not self.systemuser.is_admin_user or self.asset.admin_user == self.systemuser: return - logger.debug('Update asset admin user: {} {}'.format(self.asset, self.systemuser)) self.asset.admin_user = self.systemuser self.asset.save() + logger.debug('Update asset admin user: {} {}'.format(self.asset, self.systemuser)) def __str__(self): return self.smart_name diff --git a/apps/assets/signals_handler/authbook.py b/apps/assets/signals_handler/authbook.py index 55abf5c55..f42d8627e 100644 --- a/apps/assets/signals_handler/authbook.py +++ b/apps/assets/signals_handler/authbook.py @@ -34,9 +34,11 @@ def on_authbook_post_delete(sender, instance, **kwargs): @receiver(post_save, sender=AuthBook) -def on_authbook_post_create(sender, instance, **kwargs): +def on_authbook_post_create(sender, instance, created, **kwargs): instance.sync_to_system_user_account() - instance.update_asset_admin_user_if_need() + if created: + # 只在创建时进行更新资产的管理用户 + instance.update_asset_admin_user_if_need() @receiver(pre_save, sender=AuthBook) diff --git a/apps/assets/tasks/common.py b/apps/assets/tasks/common.py index 5a92ec039..322a64fe1 100644 --- a/apps/assets/tasks/common.py +++ b/apps/assets/tasks/common.py @@ -4,6 +4,7 @@ from celery import shared_task from orgs.utils import tmp_to_root_org +from assets.models import AuthBook __all__ = ['add_nodes_assets_to_system_users'] @@ -15,4 +16,12 @@ def add_nodes_assets_to_system_users(nodes_keys, system_users): nodes = Node.objects.filter(key__in=nodes_keys) assets = Node.get_nodes_all_assets(*nodes) for system_user in system_users: - system_user.assets.add(*tuple(assets)) + """ 解决资产和节点进行关联时,已经关联过的节点不会触发 authbook post_save 信号, + 无法更新节点下所有资产的管理用户的问题 """ + for asset in assets: + defaults = {'asset': asset, 'system_user': system_user} + instance, created = AuthBook.objects.update_or_create( + defaults=defaults, asset=asset, systemuser=system_user + ) + # 只要关联都需要更新资产的管理用户 + instance.update_asset_admin_user_if_need()