mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-06-23 21:47:27 +00:00
perf: Account filter
This commit is contained in:
parent
f6913ac63c
commit
65984d38f1
@ -17,7 +17,7 @@ from orgs.mixins import generics
|
|||||||
__all__ = [
|
__all__ = [
|
||||||
'AutomationAssetsListApi', 'AutomationRemoveAssetApi',
|
'AutomationAssetsListApi', 'AutomationRemoveAssetApi',
|
||||||
'AutomationAddAssetApi', 'AutomationNodeAddRemoveApi',
|
'AutomationAddAssetApi', 'AutomationNodeAddRemoveApi',
|
||||||
'AutomationExecutionViewSet', 'RecordListMixin'
|
'AutomationExecutionViewSet'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@ -124,12 +124,3 @@ class AutomationExecutionViewSet(
|
|||||||
execution = self.get_object()
|
execution = self.get_object()
|
||||||
report = execution.manager.gen_report()
|
report = execution.manager.gen_report()
|
||||||
return HttpResponse(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
|
|
||||||
|
@ -16,7 +16,7 @@ from orgs.mixins.api import OrgBulkModelViewSet, OrgGenericViewSet
|
|||||||
from rbac.permissions import RBACPermission
|
from rbac.permissions import RBACPermission
|
||||||
from .base import (
|
from .base import (
|
||||||
AutomationAssetsListApi, AutomationRemoveAssetApi, AutomationAddAssetApi,
|
AutomationAssetsListApi, AutomationRemoveAssetApi, AutomationAddAssetApi,
|
||||||
AutomationNodeAddRemoveApi, AutomationExecutionViewSet, RecordListMixin
|
AutomationNodeAddRemoveApi, AutomationExecutionViewSet
|
||||||
)
|
)
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
@ -35,7 +35,7 @@ class ChangeSecretAutomationViewSet(OrgBulkModelViewSet):
|
|||||||
serializer_class = serializers.ChangeSecretAutomationSerializer
|
serializer_class = serializers.ChangeSecretAutomationSerializer
|
||||||
|
|
||||||
|
|
||||||
class ChangeSecretRecordViewSet(RecordListMixin, mixins.ListModelMixin, OrgGenericViewSet):
|
class ChangeSecretRecordViewSet(mixins.ListModelMixin, OrgGenericViewSet):
|
||||||
filterset_class = ChangeSecretRecordFilterSet
|
filterset_class = ChangeSecretRecordFilterSet
|
||||||
permission_classes = [RBACPermission, IsValidLicense]
|
permission_classes = [RBACPermission, IsValidLicense]
|
||||||
search_fields = ('asset__address', 'account__username')
|
search_fields = ('asset__address', 'account__username')
|
||||||
|
@ -9,7 +9,7 @@ from accounts.models import PushAccountAutomation, PushSecretRecord
|
|||||||
from orgs.mixins.api import OrgBulkModelViewSet, OrgGenericViewSet
|
from orgs.mixins.api import OrgBulkModelViewSet, OrgGenericViewSet
|
||||||
from .base import (
|
from .base import (
|
||||||
AutomationAssetsListApi, AutomationRemoveAssetApi, AutomationAddAssetApi,
|
AutomationAssetsListApi, AutomationRemoveAssetApi, AutomationAddAssetApi,
|
||||||
AutomationNodeAddRemoveApi, AutomationExecutionViewSet, RecordListMixin
|
AutomationNodeAddRemoveApi, AutomationExecutionViewSet
|
||||||
)
|
)
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
@ -42,7 +42,7 @@ class PushAccountExecutionViewSet(AutomationExecutionViewSet):
|
|||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
class PushAccountRecordViewSet(RecordListMixin, mixins.ListModelMixin, OrgGenericViewSet):
|
class PushAccountRecordViewSet(mixins.ListModelMixin, OrgGenericViewSet):
|
||||||
filterset_class = PushAccountRecordFilterSet
|
filterset_class = PushAccountRecordFilterSet
|
||||||
search_fields = ('asset__address', 'account__username')
|
search_fields = ('asset__address', 'account__username')
|
||||||
ordering_fields = ('date_finished',)
|
ordering_fields = ('date_finished',)
|
||||||
|
@ -5,7 +5,6 @@ import uuid
|
|||||||
import django_filters
|
import django_filters
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.translation import gettext_lazy as _
|
|
||||||
from django_filters import rest_framework as drf_filters
|
from django_filters import rest_framework as drf_filters
|
||||||
from rest_framework import filters
|
from rest_framework import filters
|
||||||
from rest_framework.compat import coreapi
|
from rest_framework.compat import coreapi
|
||||||
@ -13,11 +12,26 @@ from rest_framework.compat import coreapi
|
|||||||
from assets.models import Node
|
from assets.models import Node
|
||||||
from assets.utils import get_node_from_request
|
from assets.utils import get_node_from_request
|
||||||
from common.drf.filters import BaseFilterSet
|
from common.drf.filters import BaseFilterSet
|
||||||
|
from common.utils import get_logger
|
||||||
from common.utils.timezone import local_zero_hour, local_now
|
from common.utils.timezone import local_zero_hour, local_now
|
||||||
from .const.automation import ChangeSecretRecordStatusChoice
|
from .const.automation import ChangeSecretRecordStatusChoice
|
||||||
from .models import Account, GatheredAccount, ChangeSecretRecord, PushSecretRecord, IntegrationApplication, \
|
from .models import Account, GatheredAccount, ChangeSecretRecord, PushSecretRecord, IntegrationApplication, \
|
||||||
AutomationExecution
|
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):
|
class NodeFilterBackend(filters.BaseFilterBackend):
|
||||||
fields = ['node_id']
|
fields = ['node_id']
|
||||||
@ -43,14 +57,14 @@ class NodeFilterBackend(filters.BaseFilterBackend):
|
|||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
class AccountFilterSet(BaseFilterSet):
|
class AccountFilterSet(UUIDFilterMixin, BaseFilterSet):
|
||||||
ip = drf_filters.CharFilter(field_name="address", lookup_expr="exact")
|
ip = drf_filters.CharFilter(field_name="address", lookup_expr="exact")
|
||||||
hostname = drf_filters.CharFilter(field_name="name", lookup_expr="exact")
|
hostname = drf_filters.CharFilter(field_name="name", lookup_expr="exact")
|
||||||
username = drf_filters.CharFilter(field_name="username", lookup_expr="exact")
|
username = drf_filters.CharFilter(field_name="username", lookup_expr="exact")
|
||||||
address = drf_filters.CharFilter(field_name="asset__address", 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_id = drf_filters.CharFilter(field_name="asset", method="filter_uuid")
|
||||||
asset = drf_filters.CharFilter(field_name="asset", lookup_expr="exact")
|
asset = drf_filters.CharFilter(field_name="asset", method="filter_uuid")
|
||||||
assets = drf_filters.CharFilter(field_name="asset_id", lookup_expr="exact")
|
assets = drf_filters.CharFilter(field_name="asset_id", method="filter_uuid")
|
||||||
has_secret = drf_filters.BooleanFilter(method="filter_has_secret")
|
has_secret = drf_filters.BooleanFilter(method="filter_has_secret")
|
||||||
platform = drf_filters.CharFilter(
|
platform = drf_filters.CharFilter(
|
||||||
field_name="asset__platform_id", lookup_expr="exact"
|
field_name="asset__platform_id", lookup_expr="exact"
|
||||||
@ -185,16 +199,6 @@ class SecretRecordMixin(drf_filters.FilterSet):
|
|||||||
return queryset.filter(date_finished__gte=dt)
|
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:
|
class DaysExecutionFilterMixin:
|
||||||
days = drf_filters.NumberFilter(method="filter_days")
|
days = drf_filters.NumberFilter(method="filter_days")
|
||||||
field: str
|
field: str
|
||||||
@ -209,10 +213,10 @@ class DaysExecutionFilterMixin:
|
|||||||
|
|
||||||
|
|
||||||
class ChangeSecretRecordFilterSet(
|
class ChangeSecretRecordFilterSet(
|
||||||
SecretRecordMixin, UUIDExecutionFilterMixin,
|
SecretRecordMixin, UUIDFilterMixin,
|
||||||
DaysExecutionFilterMixin, BaseFilterSet
|
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")
|
days = drf_filters.NumberFilter(method="filter_days")
|
||||||
|
|
||||||
field = 'date_finished'
|
field = 'date_finished'
|
||||||
@ -230,8 +234,8 @@ class AutomationExecutionFilterSet(DaysExecutionFilterMixin, BaseFilterSet):
|
|||||||
fields = ["days", 'trigger', 'automation_id', 'automation__name']
|
fields = ["days", 'trigger', 'automation_id', 'automation__name']
|
||||||
|
|
||||||
|
|
||||||
class PushAccountRecordFilterSet(SecretRecordMixin, UUIDExecutionFilterMixin, BaseFilterSet):
|
class PushAccountRecordFilterSet(SecretRecordMixin, UUIDFilterMixin, BaseFilterSet):
|
||||||
execution_id = django_filters.CharFilter(method="filter_execution")
|
execution_id = django_filters.CharFilter(method="filter_uuid")
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = PushSecretRecord
|
model = PushSecretRecord
|
||||||
|
@ -3,10 +3,10 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
|
import time
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from socket import gethostname
|
from socket import gethostname
|
||||||
|
|
||||||
import time
|
|
||||||
import yaml
|
import yaml
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
@ -334,7 +334,8 @@ class PlaybookPrepareMixin:
|
|||||||
return sub_playbook_path
|
return sub_playbook_path
|
||||||
|
|
||||||
def check_automation_enabled(self, platform, assets):
|
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))
|
print(_(" - Platform {} ansible disabled").format(platform.name))
|
||||||
self.on_assets_not_ansible_enabled(assets)
|
self.on_assets_not_ansible_enabled(assets)
|
||||||
return False
|
return False
|
||||||
|
Loading…
Reference in New Issue
Block a user