From 65984d38f1e5adf81477f44b1954cf4833c1ed21 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Fri, 28 Mar 2025 16:32:13 +0800 Subject: [PATCH] perf: Account filter --- apps/accounts/api/automations/base.py | 11 +---- .../accounts/api/automations/change_secret.py | 4 +- apps/accounts/api/automations/push_account.py | 4 +- apps/accounts/filters.py | 42 ++++++++++--------- apps/assets/automations/base/manager.py | 5 ++- 5 files changed, 31 insertions(+), 35 deletions(-) diff --git a/apps/accounts/api/automations/base.py b/apps/accounts/api/automations/base.py index 34ad6c109..8f9faad0c 100644 --- a/apps/accounts/api/automations/base.py +++ b/apps/accounts/api/automations/base.py @@ -17,7 +17,7 @@ from orgs.mixins import generics __all__ = [ 'AutomationAssetsListApi', 'AutomationRemoveAssetApi', 'AutomationAddAssetApi', 'AutomationNodeAddRemoveApi', - 'AutomationExecutionViewSet', 'RecordListMixin' + 'AutomationExecutionViewSet' ] @@ -124,12 +124,3 @@ class AutomationExecutionViewSet( execution = self.get_object() report = execution.manager.gen_report() return HttpResponse(report) - - -class RecordListMixin: - def list(self, request, *args, **kwargs): - try: - response = super().list(request, *args, **kwargs) - except Exception as e: - response = Response({'detail': str(e)}, status=status.HTTP_400_BAD_REQUEST) - return response diff --git a/apps/accounts/api/automations/change_secret.py b/apps/accounts/api/automations/change_secret.py index 9cdce3013..5ea945b57 100644 --- a/apps/accounts/api/automations/change_secret.py +++ b/apps/accounts/api/automations/change_secret.py @@ -16,7 +16,7 @@ from orgs.mixins.api import OrgBulkModelViewSet, OrgGenericViewSet from rbac.permissions import RBACPermission from .base import ( AutomationAssetsListApi, AutomationRemoveAssetApi, AutomationAddAssetApi, - AutomationNodeAddRemoveApi, AutomationExecutionViewSet, RecordListMixin + AutomationNodeAddRemoveApi, AutomationExecutionViewSet ) __all__ = [ @@ -35,7 +35,7 @@ class ChangeSecretAutomationViewSet(OrgBulkModelViewSet): serializer_class = serializers.ChangeSecretAutomationSerializer -class ChangeSecretRecordViewSet(RecordListMixin, mixins.ListModelMixin, OrgGenericViewSet): +class ChangeSecretRecordViewSet(mixins.ListModelMixin, OrgGenericViewSet): filterset_class = ChangeSecretRecordFilterSet permission_classes = [RBACPermission, IsValidLicense] search_fields = ('asset__address', 'account__username') diff --git a/apps/accounts/api/automations/push_account.py b/apps/accounts/api/automations/push_account.py index 643f58d61..4b0004f3b 100644 --- a/apps/accounts/api/automations/push_account.py +++ b/apps/accounts/api/automations/push_account.py @@ -9,7 +9,7 @@ from accounts.models import PushAccountAutomation, PushSecretRecord from orgs.mixins.api import OrgBulkModelViewSet, OrgGenericViewSet from .base import ( AutomationAssetsListApi, AutomationRemoveAssetApi, AutomationAddAssetApi, - AutomationNodeAddRemoveApi, AutomationExecutionViewSet, RecordListMixin + AutomationNodeAddRemoveApi, AutomationExecutionViewSet ) __all__ = [ @@ -42,7 +42,7 @@ class PushAccountExecutionViewSet(AutomationExecutionViewSet): return queryset -class PushAccountRecordViewSet(RecordListMixin, mixins.ListModelMixin, OrgGenericViewSet): +class PushAccountRecordViewSet(mixins.ListModelMixin, OrgGenericViewSet): filterset_class = PushAccountRecordFilterSet search_fields = ('asset__address', 'account__username') ordering_fields = ('date_finished',) diff --git a/apps/accounts/filters.py b/apps/accounts/filters.py index 0d92b9406..bd14a9e48 100644 --- a/apps/accounts/filters.py +++ b/apps/accounts/filters.py @@ -5,7 +5,6 @@ import uuid import django_filters from django.db.models import Q from django.utils import timezone -from django.utils.translation import gettext_lazy as _ from django_filters import rest_framework as drf_filters from rest_framework import filters from rest_framework.compat import coreapi @@ -13,11 +12,26 @@ from rest_framework.compat import coreapi from assets.models import Node from assets.utils import get_node_from_request from common.drf.filters import BaseFilterSet +from common.utils import get_logger from common.utils.timezone import local_zero_hour, local_now from .const.automation import ChangeSecretRecordStatusChoice from .models import Account, GatheredAccount, ChangeSecretRecord, PushSecretRecord, IntegrationApplication, \ AutomationExecution +logger = get_logger(__file__) + + +class UUIDFilterMixin: + @staticmethod + def filter_uuid(queryset, name, value): + try: + uuid.UUID(value) + except ValueError: + logger.warning(f"Invalid UUID: {value}") + return queryset.none() + + return queryset.filter(**{name: value}) + class NodeFilterBackend(filters.BaseFilterBackend): fields = ['node_id'] @@ -43,14 +57,14 @@ class NodeFilterBackend(filters.BaseFilterBackend): return queryset -class AccountFilterSet(BaseFilterSet): +class AccountFilterSet(UUIDFilterMixin, BaseFilterSet): ip = drf_filters.CharFilter(field_name="address", lookup_expr="exact") hostname = drf_filters.CharFilter(field_name="name", lookup_expr="exact") username = drf_filters.CharFilter(field_name="username", lookup_expr="exact") address = drf_filters.CharFilter(field_name="asset__address", lookup_expr="exact") - asset_id = drf_filters.CharFilter(field_name="asset", lookup_expr="exact") - asset = drf_filters.CharFilter(field_name="asset", lookup_expr="exact") - assets = drf_filters.CharFilter(field_name="asset_id", lookup_expr="exact") + asset_id = drf_filters.CharFilter(field_name="asset", method="filter_uuid") + asset = drf_filters.CharFilter(field_name="asset", method="filter_uuid") + assets = drf_filters.CharFilter(field_name="asset_id", method="filter_uuid") has_secret = drf_filters.BooleanFilter(method="filter_has_secret") platform = drf_filters.CharFilter( field_name="asset__platform_id", lookup_expr="exact" @@ -185,16 +199,6 @@ class SecretRecordMixin(drf_filters.FilterSet): return queryset.filter(date_finished__gte=dt) -class UUIDExecutionFilterMixin: - @staticmethod - def filter_execution(queryset, name, value): - try: - uuid.UUID(value) - except ValueError: - raise ValueError(_('Enter a valid UUID.')) - return queryset.filter(**{name: value}) - - class DaysExecutionFilterMixin: days = drf_filters.NumberFilter(method="filter_days") field: str @@ -209,10 +213,10 @@ class DaysExecutionFilterMixin: class ChangeSecretRecordFilterSet( - SecretRecordMixin, UUIDExecutionFilterMixin, + SecretRecordMixin, UUIDFilterMixin, DaysExecutionFilterMixin, BaseFilterSet ): - execution_id = django_filters.CharFilter(method="filter_execution") + execution_id = django_filters.CharFilter(method="filter_uuid") days = drf_filters.NumberFilter(method="filter_days") field = 'date_finished' @@ -230,8 +234,8 @@ class AutomationExecutionFilterSet(DaysExecutionFilterMixin, BaseFilterSet): fields = ["days", 'trigger', 'automation_id', 'automation__name'] -class PushAccountRecordFilterSet(SecretRecordMixin, UUIDExecutionFilterMixin, BaseFilterSet): - execution_id = django_filters.CharFilter(method="filter_execution") +class PushAccountRecordFilterSet(SecretRecordMixin, UUIDFilterMixin, BaseFilterSet): + execution_id = django_filters.CharFilter(method="filter_uuid") class Meta: model = PushSecretRecord diff --git a/apps/assets/automations/base/manager.py b/apps/assets/automations/base/manager.py index 1837ddfea..8446dbeb4 100644 --- a/apps/assets/automations/base/manager.py +++ b/apps/assets/automations/base/manager.py @@ -3,10 +3,10 @@ import json import logging import os import shutil +import time from collections import defaultdict from socket import gethostname -import time import yaml from django.conf import settings from django.template.loader import render_to_string @@ -334,7 +334,8 @@ class PlaybookPrepareMixin: return sub_playbook_path def check_automation_enabled(self, platform, assets): - if not platform.automation or not platform.automation.ansible_enabled: + automation = getattr(platform, 'automation', None) + if not (automation and getattr(automation, 'ansible_enabled', False)): print(_(" - Platform {} ansible disabled").format(platform.name)) self.on_assets_not_ansible_enabled(assets) return False