diff --git a/apps/assets/signal_handlers/node_assets_amount.py b/apps/assets/signal_handlers/node_assets_amount.py index ef3cf0895..314171a71 100644 --- a/apps/assets/signal_handlers/node_assets_amount.py +++ b/apps/assets/signal_handlers/node_assets_amount.py @@ -10,6 +10,7 @@ from common.const.signals import PRE_ADD, POST_REMOVE, PRE_CLEAR from common.decorators import on_transaction_commit, merge_delay_run from common.utils import get_logger from orgs.utils import tmp_to_org +from ..tasks import check_node_assets_amount_task logger = get_logger(__file__) @@ -33,13 +34,18 @@ def on_node_asset_change(sender, action, instance, reverse, pk_set, **kwargs): node_ids = [instance.id] else: node_ids = pk_set - update_node_assets_amount(*node_ids) + update_nodes_assets_amount(*node_ids) @merge_delay_run(ttl=5) -def update_node_assets_amount(*node_ids): +def update_nodes_assets_amount(*node_ids): nodes = list(Node.objects.filter(id__in=node_ids)) logger.info('Update nodes assets amount: {} nodes'.format(len(node_ids))) + + if len(node_ids) > 100: + check_node_assets_amount_task.delay() + return + for node in nodes: node.assets_amount = node.get_assets_amount() diff --git a/apps/assets/utils/node.py b/apps/assets/utils/node.py index deaa7d32b..b21508b64 100644 --- a/apps/assets/utils/node.py +++ b/apps/assets/utils/node.py @@ -1,12 +1,12 @@ # ~*~ coding: utf-8 ~*~ # from collections import defaultdict + +from common.db.models import output_as_string +from common.struct import Stack from common.utils import get_logger, dict_get_any, is_uuid, get_object_or_none, timeit from common.utils.http import is_true -from common.struct import Stack -from common.db.models import output_as_string from orgs.utils import ensure_in_real_or_default_org, current_org - from ..locks import NodeTreeUpdateLock from ..models import Node, Asset @@ -25,11 +25,11 @@ def check_node_assets_amount(): for node in nodes: nodeid_nodekey_mapper[node.id] = node.key - for nodeid, assetid in nodeid_assetid_pairs: - if nodeid not in nodeid_nodekey_mapper: + for node_id, asset_id in nodeid_assetid_pairs: + if node_id not in nodeid_nodekey_mapper: continue - nodekey = nodeid_nodekey_mapper[nodeid] - nodekey_assetids_mapper[nodekey].add(assetid) + node_key = nodeid_nodekey_mapper[node_id] + nodekey_assetids_mapper[node_key].add(asset_id) util = NodeAssetsUtil(nodes, nodekey_assetids_mapper) util.generate() diff --git a/apps/audits/signal_handlers.py b/apps/audits/signal_handlers.py index ee7056ef8..2b8a9ef4c 100644 --- a/apps/audits/signal_handlers.py +++ b/apps/audits/signal_handlers.py @@ -2,6 +2,7 @@ # import uuid +from celery import shared_task from django.apps import apps from django.conf import settings from django.contrib.auth import BACKEND_SESSION_KEY @@ -26,6 +27,7 @@ from common.signals import django_ready from common.utils import get_request_ip, get_logger, get_syslogger from common.utils.encode import data_to_json from jumpserver.utils import current_request +from orgs.utils import org_aware_func from terminal.models import Session, Command from terminal.serializers import SessionSerializer, SessionCommandSerializer from users.models import User @@ -69,24 +71,18 @@ M2M_ACTION = { } -@receiver(m2m_changed) -def on_m2m_changed(sender, action, instance, reverse, model, pk_set, **kwargs): - if action not in M2M_ACTION: - return - if not instance: - return - return - - resource_type = instance._meta.verbose_name +@shared_task(verbose_name=_("Create m2m operate log")) +@org_aware_func('instance') +def create_m2m_operate_log(instance, action, model, pk_set): current_instance = model_to_dict(instance, include_model_fields=False) - + resource_type = instance._meta.verbose_name + field_name = str(model._meta.verbose_name) + action = M2M_ACTION[action] instance_id = current_instance.get('id') log_id, before_instance = get_instance_dict_from_cache(instance_id) - field_name = str(model._meta.verbose_name) objs = model.objects.filter(pk__in=pk_set) objs_display = [str(o) for o in objs] - action = M2M_ACTION[action] changed_field = current_instance.get(field_name, []) after, before, before_value = None, None, None @@ -107,10 +103,20 @@ def on_m2m_changed(sender, action, instance, reverse, model, pk_set, **kwargs): create_or_update_operate_log( ActionChoices.update, resource_type, - resource=instance, log_id=log_id, before=before, after=after + resource=instance, log_id=log_id, + before=before, after=after ) +@receiver(m2m_changed) +def on_m2m_changed(sender, action, instance, model, pk_set, **kwargs): + if action not in M2M_ACTION: + return + if not instance: + return + create_m2m_operate_log.delay(instance, action, model, pk_set) + + def signal_of_operate_log_whether_continue(sender, instance, created, update_fields=None): condition = True if not instance: @@ -129,16 +135,21 @@ def signal_of_operate_log_whether_continue(sender, instance, created, update_fie return condition +@shared_task(verbose_name=_("Create operate log")) +@org_aware_func('instance') +def create_operate_log(instance, created, update_fields=None): + pass + + @receiver(pre_save) -def on_object_pre_create_or_update(sender, instance=None, raw=False, using=None, update_fields=None, **kwargs): +def on_object_pre_create_or_update(sender, instance=None, update_fields=None, **kwargs): ok = signal_of_operate_log_whether_continue( sender, instance, False, update_fields ) if not ok: return - # users.PrivateToken Model 没有 id 有 pk字段 - instance_id = getattr(instance, 'id', getattr(instance, 'pk', None)) + instance_id = getattr(instance, 'pk', None) instance_before_data = {'id': instance_id} raw_instance = type(instance).objects.filter(pk=instance_id).first() @@ -152,7 +163,6 @@ def on_object_pre_create_or_update(sender, instance=None, raw=False, using=None, @receiver(post_save) def on_object_created_or_update(sender, instance=None, created=False, update_fields=None, **kwargs): - return ok = signal_of_operate_log_whether_continue( sender, instance, created, update_fields ) diff --git a/apps/common/decorators.py b/apps/common/decorators.py index 04e27219b..f2c1a0fd9 100644 --- a/apps/common/decorators.py +++ b/apps/common/decorators.py @@ -65,7 +65,7 @@ def _run_func_if_is_last(ttl, suffix_key, org, func, *args, **kwargs): logger.error('delay run error: %s' % e) -executor = ThreadPoolExecutor(10) +executor = ThreadPoolExecutor(20) def delay_run(ttl=5, key=None):