perf: change account filter by asset

This commit is contained in:
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
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')
def su_from_accounts(self, request, *args, **kwargs):
account_id = request.query_params.get('account')
@ -117,7 +127,7 @@ class AccountViewSet(OrgBulkModelViewSet):
self.model.objects.create(**account_data)
success_count += 1
except Exception as e:
logger.debug(f'{ "Move" if move else "Copy" } to assets error: {e}')
logger.debug(f'{"Move" if move else "Copy"} to assets error: {e}')
creation_results[asset] = {'error': _('Account already exists'), 'state': 'error'}
results = [{'asset': str(asset), **res} for asset, res in creation_results.items()]

View File

@ -65,7 +65,6 @@ class AccountFilterSet(UUIDFilterMixin, BaseFilterSet):
address = drf_filters.CharFilter(field_name="asset__address", 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 = 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(
@ -151,8 +150,9 @@ class AccountFilterSet(UUIDFilterMixin, BaseFilterSet):
kwargs.update({"date_change_secret__gt": date})
if name == "latest_secret_change_failed":
queryset = queryset.filter(date_change_secret__gt=date).exclude(
change_secret_status=ChangeSecretRecordStatusChoice.success
queryset = (
queryset.filter(date_change_secret__gt=date)
.exclude(change_secret_status=ChangeSecretRecordStatusChoice.success)
)
if kwargs:
@ -162,8 +162,8 @@ class AccountFilterSet(UUIDFilterMixin, BaseFilterSet):
class Meta:
model = Account
fields = [
"id", "asset", "source_id", "secret_type", "category",
"type", "privileged", "secret_reset", "connectivity", 'is_active'
"id", "source_id", "secret_type", "category", "type",
"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.status import HTTP_200_OK
from accounts.filters import AccountFilterSet
from accounts.serializers import AccountSerializer
from accounts.tasks import push_accounts_to_assets_task, verify_accounts_connectivity_task
from assets import serializers
@ -177,24 +176,6 @@ class AssetViewSet(SuggestionMixin, BaseAssetViewSet):
gateways = asset.domain.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')
def sync_platform_protocols(self, request, *args, **kwargs):
platform_id = request.data.get('platform_id')

View File

@ -15,10 +15,13 @@ class DirectoryTypes(BaseType):
def _get_base_constrains(cls) -> dict:
return {
'*': {
'charset_enabled': False,
'charset_enabled': True,
'domain_enabled': True,
'ds_enabled': False,
'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",
"updated_by": "system",
"comment": "",
"name": "Windows active directory",
"name": "WindowsActiveDirectory",
"category": "ds",
"type": "windows_ad",
"meta": {},
@ -115,19 +115,16 @@ def add_ds_platforms(apps, schema_editor):
"category": "ds",
"type": "general",
"meta": {
},
"internal": true,
"domain_enabled": false,
"su_enabled": false,
"su_method": null,
"custom_fields": [
],
"automation": {
"ansible_enabled": false,
"ansible_config": {
}
},
"protocols": [

View File

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