From e2b8fd0d40842f5c672a4387ee47cd8210a8d652 Mon Sep 17 00:00:00 2001 From: ibuler Date: Wed, 16 Apr 2025 17:22:37 +0800 Subject: [PATCH] perf: change account filter by asset --- apps/accounts/api/account/account.py | 12 +++++++++++- apps/accounts/filters.py | 10 +++++----- apps/assets/api/asset/asset.py | 19 ------------------- apps/assets/const/ds.py | 5 ++++- .../migrations/0017_auto_20250407_1124.py | 5 +---- apps/assets/serializers/platform.py | 5 +++++ 6 files changed, 26 insertions(+), 30 deletions(-) diff --git a/apps/accounts/api/account/account.py b/apps/accounts/api/account/account.py index 4416f8f9c..8b39db771 100644 --- a/apps/accounts/api/account/account.py +++ b/apps/accounts/api/account/account.py @@ -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()] diff --git a/apps/accounts/filters.py b/apps/accounts/filters.py index 9f5206609..47d64b31d 100644 --- a/apps/accounts/filters.py +++ b/apps/accounts/filters.py @@ -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" ] diff --git a/apps/assets/api/asset/asset.py b/apps/assets/api/asset/asset.py index 018b648a0..e56a2d067 100644 --- a/apps/assets/api/asset/asset.py +++ b/apps/assets/api/asset/asset.py @@ -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') diff --git a/apps/assets/const/ds.py b/apps/assets/const/ds.py index b9dba6b8d..c99809646 100644 --- a/apps/assets/const/ds.py +++ b/apps/assets/const/ds.py @@ -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, } } diff --git a/apps/assets/migrations/0017_auto_20250407_1124.py b/apps/assets/migrations/0017_auto_20250407_1124.py index b25cee40d..5da3c21d4 100644 --- a/apps/assets/migrations/0017_auto_20250407_1124.py +++ b/apps/assets/migrations/0017_auto_20250407_1124.py @@ -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": [ diff --git a/apps/assets/serializers/platform.py b/apps/assets/serializers/platform.py index c560e6c20..ebe28ca2a 100644 --- a/apps/assets/serializers/platform.py +++ b/apps/assets/serializers/platform.py @@ -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'):