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()