diff --git a/bkmonitor/packages/monitor_web/shield/resources/backend_resources.py b/bkmonitor/packages/monitor_web/shield/resources/backend_resources.py index efdb353008..b0741b5919 100644 --- a/bkmonitor/packages/monitor_web/shield/resources/backend_resources.py +++ b/bkmonitor/packages/monitor_web/shield/resources/backend_resources.py @@ -21,6 +21,7 @@ from bkmonitor.documents.alert import AlertDocument from bkmonitor.documents.base import BulkActionType from bkmonitor.models import Event, Shield +from bkmonitor.utils.common_utils import logger from bkmonitor.utils.request import get_request, get_request_username from bkmonitor.utils.time_tools import ( DEFAULT_FORMAT, @@ -31,6 +32,7 @@ strftime_local, utc2biz_str, ) +from bkmonitor.utils.user import get_global_user from bkmonitor.views import serializers from constants.shield import ScopeType, ShieldCategory, ShieldStatus from core.drf_resource import resource @@ -510,18 +512,34 @@ class DisableShieldResource(Resource): """ class RequestSerializer(serializers.Serializer): - id = serializers.IntegerField(required=True, label="屏蔽id") + id = serializers.ListField(required=True, child=serializers.IntegerField(), min_length=1, label="屏蔽id列表") - def perform_request(self, data): - try: - shield = Shield.objects.get(id=data["id"]) - except Shield.DoesNotExist: - raise ShieldNotExist({"msg": data["id"]}) + def to_internal_value(self, data): + data["id"] = data.get("id", []) + # 确保"id"字段始终是一个列表 + if not isinstance(data["id"], list): + data["id"] = [data["id"]] + + return super().to_internal_value(data) - if shield.is_enabled: - shield.is_enabled = False - shield.failure_time = now() - shield.save() + def perform_request(self, data): + username = get_global_user() or "unknown" + shields = Shield.objects.filter(pk__in=data["id"]) + update_shields = [] + for shield in shields: + if shield.is_enabled: + shield.is_enabled = False + shield.failure_time = now() + shield.update_user = username # 记录最后的操作人 + update_shields.append(shield) + Shield.objects.bulk_update(update_shields, ["is_enabled", "failure_time", "update_user"]) + + # 检查是否有不存在的屏蔽对象ID + existing_ids = {shield.id for shield in shields} + missing_ids = set(data["id"]) - existing_ids + + if missing_ids: + logger.warning("Alarm shield ids does not exist: {}".format(list(missing_ids))) return "success"