1
0
mirror of https://github.com/jumpserver/jumpserver.git synced 2025-05-06 07:06:23 +00:00

perf: Account filter

This commit is contained in:
feng 2025-03-28 16:32:13 +08:00 committed by ZhaoJiSen
parent f6913ac63c
commit 65984d38f1
5 changed files with 31 additions and 35 deletions
apps
accounts
assets/automations/base

View File

@ -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

View File

@ -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')

View File

@ -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',)

View File

@ -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

View File

@ -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