mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-07-21 18:12:13 +00:00
Merge pull request #15001 from jumpserver/pr@dev@account_risk_filter
perf: account filter node
This commit is contained in:
commit
bc9782bd55
@ -8,7 +8,7 @@ from rest_framework.status import HTTP_200_OK
|
|||||||
|
|
||||||
from accounts import serializers
|
from accounts import serializers
|
||||||
from accounts.const import ChangeSecretRecordStatusChoice
|
from accounts.const import ChangeSecretRecordStatusChoice
|
||||||
from accounts.filters import AccountFilterSet
|
from accounts.filters import AccountFilterSet, NodeFilterBackend
|
||||||
from accounts.mixins import AccountRecordViewLogMixin
|
from accounts.mixins import AccountRecordViewLogMixin
|
||||||
from accounts.models import Account, ChangeSecretRecord
|
from accounts.models import Account, ChangeSecretRecord
|
||||||
from assets.models import Asset, Node
|
from assets.models import Asset, Node
|
||||||
@ -31,7 +31,7 @@ __all__ = [
|
|||||||
class AccountViewSet(OrgBulkModelViewSet):
|
class AccountViewSet(OrgBulkModelViewSet):
|
||||||
model = Account
|
model = Account
|
||||||
search_fields = ('username', 'name', 'asset__name', 'asset__address', 'comment')
|
search_fields = ('username', 'name', 'asset__name', 'asset__address', 'comment')
|
||||||
extra_filter_backends = [AttrRulesFilterBackend]
|
extra_filter_backends = [AttrRulesFilterBackend, NodeFilterBackend]
|
||||||
filterset_class = AccountFilterSet
|
filterset_class = AccountFilterSet
|
||||||
serializer_classes = {
|
serializer_classes = {
|
||||||
'default': serializers.AccountSerializer,
|
'default': serializers.AccountSerializer,
|
||||||
|
@ -30,6 +30,8 @@ __all__ = [
|
|||||||
"CheckAccountEngineViewSet",
|
"CheckAccountEngineViewSet",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
from ...filters import NodeFilterBackend
|
||||||
|
|
||||||
from ...risk_handlers import RiskHandler
|
from ...risk_handlers import RiskHandler
|
||||||
|
|
||||||
|
|
||||||
@ -80,7 +82,8 @@ class CheckAccountExecutionViewSet(AutomationExecutionViewSet):
|
|||||||
class AccountRiskViewSet(OrgBulkModelViewSet):
|
class AccountRiskViewSet(OrgBulkModelViewSet):
|
||||||
model = AccountRisk
|
model = AccountRisk
|
||||||
search_fields = ("username", "asset")
|
search_fields = ("username", "asset")
|
||||||
filterset_fields = ("risk", "status", "asset")
|
filterset_fields = ("risk", "status", "asset_id")
|
||||||
|
extra_filter_backends = [NodeFilterBackend]
|
||||||
serializer_classes = {
|
serializer_classes = {
|
||||||
"default": serializers.AccountRiskSerializer,
|
"default": serializers.AccountRiskSerializer,
|
||||||
"assets": serializers.AssetRiskSerializer,
|
"assets": serializers.AssetRiskSerializer,
|
||||||
|
@ -3,14 +3,41 @@
|
|||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
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.compat import coreapi
|
||||||
|
|
||||||
from assets.models import Node
|
from assets.models import Node
|
||||||
|
from assets.utils import get_node_from_request
|
||||||
from common.drf.filters import BaseFilterSet
|
from common.drf.filters import BaseFilterSet
|
||||||
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
|
||||||
|
|
||||||
|
|
||||||
|
class NodeFilterBackend(filters.BaseFilterBackend):
|
||||||
|
fields = ['node_id']
|
||||||
|
|
||||||
|
def get_schema_fields(self, view):
|
||||||
|
return [
|
||||||
|
coreapi.Field(
|
||||||
|
name=field, location='query', required=False,
|
||||||
|
type='string', example='', description='', schema=None,
|
||||||
|
)
|
||||||
|
for field in self.fields
|
||||||
|
]
|
||||||
|
|
||||||
|
def filter_queryset(self, request, queryset, view):
|
||||||
|
node = get_node_from_request(request)
|
||||||
|
if node is None:
|
||||||
|
return queryset
|
||||||
|
|
||||||
|
node_qs = Node.objects.none()
|
||||||
|
node_qs |= node.get_all_children(with_self=True)
|
||||||
|
node_ids = list(node_qs.values_list("id", flat=True))
|
||||||
|
queryset = queryset.filter(asset__nodes__in=node_ids)
|
||||||
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
class AccountFilterSet(BaseFilterSet):
|
class AccountFilterSet(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")
|
||||||
@ -19,8 +46,6 @@ class AccountFilterSet(BaseFilterSet):
|
|||||||
asset_id = drf_filters.CharFilter(field_name="asset", lookup_expr="exact")
|
asset_id = drf_filters.CharFilter(field_name="asset", lookup_expr="exact")
|
||||||
asset = 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")
|
assets = drf_filters.CharFilter(field_name="asset_id", lookup_expr="exact")
|
||||||
nodes = drf_filters.CharFilter(method="filter_nodes")
|
|
||||||
node_id = drf_filters.CharFilter(method="filter_nodes")
|
|
||||||
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"
|
||||||
@ -36,9 +61,7 @@ class AccountFilterSet(BaseFilterSet):
|
|||||||
latest_updated = drf_filters.BooleanFilter(method="filter_latest")
|
latest_updated = drf_filters.BooleanFilter(method="filter_latest")
|
||||||
latest_secret_changed = drf_filters.BooleanFilter(method="filter_latest")
|
latest_secret_changed = drf_filters.BooleanFilter(method="filter_latest")
|
||||||
latest_secret_change_failed = drf_filters.BooleanFilter(method="filter_latest")
|
latest_secret_change_failed = drf_filters.BooleanFilter(method="filter_latest")
|
||||||
risk = drf_filters.CharFilter(
|
risk = drf_filters.CharFilter(method="filter_risk")
|
||||||
method="filter_risk",
|
|
||||||
)
|
|
||||||
integrationapplication = drf_filters.CharFilter(method="filter_integrationapplication")
|
integrationapplication = drf_filters.CharFilter(method="filter_integrationapplication")
|
||||||
long_time_no_change_secret = drf_filters.BooleanFilter(method="filter_long_time")
|
long_time_no_change_secret = drf_filters.BooleanFilter(method="filter_long_time")
|
||||||
long_time_no_verified = drf_filters.BooleanFilter(method="filter_long_time")
|
long_time_no_verified = drf_filters.BooleanFilter(method="filter_long_time")
|
||||||
@ -111,19 +134,6 @@ class AccountFilterSet(BaseFilterSet):
|
|||||||
queryset = queryset.filter(**kwargs)
|
queryset = queryset.filter(**kwargs)
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def filter_nodes(queryset, name, value):
|
|
||||||
nodes = Node.objects.filter(id=value)
|
|
||||||
if not nodes:
|
|
||||||
return queryset
|
|
||||||
|
|
||||||
node_qs = Node.objects.none()
|
|
||||||
for node in nodes:
|
|
||||||
node_qs |= node.get_all_children(with_self=True)
|
|
||||||
node_ids = list(node_qs.values_list("id", flat=True))
|
|
||||||
queryset = queryset.filter(asset__nodes__in=node_ids)
|
|
||||||
return queryset
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Account
|
model = Account
|
||||||
fields = [
|
fields = [
|
||||||
|
Loading…
Reference in New Issue
Block a user