perf: change account filter by asset

pull/15225/head
ibuler 2025-04-16 17:22:37 +08:00 committed by 老广
parent 2aace05099
commit e2b8fd0d40
6 changed files with 26 additions and 30 deletions

View File

@ -46,6 +46,16 @@ class AccountViewSet(OrgBulkModelViewSet):
} }
export_as_zip = True export_as_zip = True
def get_queryset(self):
queryset = super().get_queryset()
asset_id = self.request.query_params.get('asset') or self.request.query_params.get('asset_id')
if not asset_id:
return queryset
asset = get_object_or_404(Asset, pk=asset_id)
queryset = asset.all_accounts.all()
return queryset
@action(methods=['get'], detail=False, url_path='su-from-accounts') @action(methods=['get'], detail=False, url_path='su-from-accounts')
def su_from_accounts(self, request, *args, **kwargs): def su_from_accounts(self, request, *args, **kwargs):
account_id = request.query_params.get('account') account_id = request.query_params.get('account')

View File

@ -65,7 +65,6 @@ class AccountFilterSet(UUIDFilterMixin, BaseFilterSet):
address = drf_filters.CharFilter(field_name="asset__address", lookup_expr="exact") address = drf_filters.CharFilter(field_name="asset__address", lookup_expr="exact")
asset_name = drf_filters.CharFilter(field_name="asset__name", lookup_expr="exact") asset_name = drf_filters.CharFilter(field_name="asset__name", lookup_expr="exact")
asset_id = drf_filters.CharFilter(field_name="asset", method="filter_uuid") 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") 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(
@ -151,8 +150,9 @@ class AccountFilterSet(UUIDFilterMixin, BaseFilterSet):
kwargs.update({"date_change_secret__gt": date}) kwargs.update({"date_change_secret__gt": date})
if name == "latest_secret_change_failed": if name == "latest_secret_change_failed":
queryset = queryset.filter(date_change_secret__gt=date).exclude( queryset = (
change_secret_status=ChangeSecretRecordStatusChoice.success queryset.filter(date_change_secret__gt=date)
.exclude(change_secret_status=ChangeSecretRecordStatusChoice.success)
) )
if kwargs: if kwargs:
@ -162,8 +162,8 @@ class AccountFilterSet(UUIDFilterMixin, BaseFilterSet):
class Meta: class Meta:
model = Account model = Account
fields = [ fields = [
"id", "asset", "source_id", "secret_type", "category", "id", "source_id", "secret_type", "category", "type",
"type", "privileged", "secret_reset", "connectivity", 'is_active' "privileged", "secret_reset", "connectivity", "is_active"
] ]

View File

@ -11,7 +11,6 @@ from rest_framework.decorators import action
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.status import HTTP_200_OK from rest_framework.status import HTTP_200_OK
from accounts.filters import AccountFilterSet
from accounts.serializers import AccountSerializer from accounts.serializers import AccountSerializer
from accounts.tasks import push_accounts_to_assets_task, verify_accounts_connectivity_task from accounts.tasks import push_accounts_to_assets_task, verify_accounts_connectivity_task
from assets import serializers from assets import serializers
@ -177,24 +176,6 @@ class AssetViewSet(SuggestionMixin, BaseAssetViewSet):
gateways = asset.domain.gateways gateways = asset.domain.gateways
return self.get_paginated_response_from_queryset(gateways) return self.get_paginated_response_from_queryset(gateways)
@action(methods=["GET"], detail=True, url_path="accounts")
def accounts(self, *args, **kwargs):
pk = self.kwargs.get("pk")
asset = get_object_or_404(self.model, pk=pk)
queryset = asset.all_accounts.all()
filterset = AccountFilterSet(
data=self.request.query_params,
queryset=queryset,
request=self.request,
)
if not filterset.is_valid():
return Response(filterset.errors, status=status.HTTP_400_BAD_REQUEST)
queryset = filterset.qs
return self.get_paginated_response_from_queryset(queryset)
@action(methods=['post'], detail=False, url_path='sync-platform-protocols') @action(methods=['post'], detail=False, url_path='sync-platform-protocols')
def sync_platform_protocols(self, request, *args, **kwargs): def sync_platform_protocols(self, request, *args, **kwargs):
platform_id = request.data.get('platform_id') platform_id = request.data.get('platform_id')

View File

@ -15,10 +15,13 @@ class DirectoryTypes(BaseType):
def _get_base_constrains(cls) -> dict: def _get_base_constrains(cls) -> dict:
return { return {
'*': { '*': {
'charset_enabled': False, 'charset_enabled': True,
'domain_enabled': True, 'domain_enabled': True,
'ds_enabled': False, 'ds_enabled': False,
'su_enabled': True, 'su_enabled': True,
},
cls.WINDOWS_AD: {
'su_enabled': False,
} }
} }

View File

@ -14,7 +14,7 @@ def add_ds_platforms(apps, schema_editor):
"created_by": "system", "created_by": "system",
"updated_by": "system", "updated_by": "system",
"comment": "", "comment": "",
"name": "Windows active directory", "name": "WindowsActiveDirectory",
"category": "ds", "category": "ds",
"type": "windows_ad", "type": "windows_ad",
"meta": {}, "meta": {},
@ -115,19 +115,16 @@ def add_ds_platforms(apps, schema_editor):
"category": "ds", "category": "ds",
"type": "general", "type": "general",
"meta": { "meta": {
}, },
"internal": true, "internal": true,
"domain_enabled": false, "domain_enabled": false,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [ "custom_fields": [
], ],
"automation": { "automation": {
"ansible_enabled": false, "ansible_enabled": false,
"ansible_config": { "ansible_config": {
} }
}, },
"protocols": [ "protocols": [

View File

@ -220,6 +220,11 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes
def set_initial_value(self): def set_initial_value(self):
if not hasattr(self, 'initial_data'): if not hasattr(self, 'initial_data'):
return return
name = self.initial_data.get('name')
if ' ' in name:
self.initial_data['name'] = name.replace(' ', '-')
if self.instance: if self.instance:
return return
if not self.initial_data.get('automation'): if not self.initial_data.get('automation'):