From 106062ce81e8dee98e7c46b8f56412d9fd6354d8 Mon Sep 17 00:00:00 2001 From: feng <1304903146@qq.com> Date: Thu, 2 Jan 2025 15:26:39 +0800 Subject: [PATCH] perf: copy move account --- apps/accounts/api/account/account.py | 37 ++++++++++++++++++++++++++++ apps/assets/models/base.py | 4 +-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/apps/accounts/api/account/account.py b/apps/accounts/api/account/account.py index d3f1f4221..819e2da8c 100644 --- a/apps/accounts/api/account/account.py +++ b/apps/accounts/api/account/account.py @@ -90,6 +90,43 @@ class AccountViewSet(OrgBulkModelViewSet): self.model.objects.filter(id__in=account_ids).update(secret=None) return Response(status=HTTP_200_OK) + def _copy_or_move_to_assets(self, request, move=False): + account = self.get_object() + asset_ids = request.data.get('assets', []) + assets = Asset.objects.filter(id__in=asset_ids) + field_names = [ + 'name', 'username', 'secret_type', 'secret', + 'privileged', 'is_active', 'source', 'source_id', 'comment' + ] + account_data = {field: getattr(account, field) for field in field_names} + + creation_results = {} + success_count = 0 + + for asset in assets: + account_data['asset'] = asset + creation_results[asset] = {'state': 'created'} + try: + self.model.objects.create(**account_data) + success_count += 1 + except Exception as e: + creation_results[asset] = {'error': str(e), 'state': 'error'} + + results = [{'asset': asset, **res} for asset, res in creation_results.items()] + + if move and success_count > 0: + account.delete() + + return Response(data=results, status=HTTP_200_OK) + + @action(methods=['patch'], detail=True, url_path='move-to-assets') + def move_to_assets(self, request, *args, **kwargs): + return self._copy_or_move_to_assets(request, move=True) + + @action(methods=['patch'], detail=True, url_path='copy-to-assets') + def copy_to_assets(self, request, *args, **kwargs): + return self._copy_or_move_to_assets(request, move=False) + class AccountSecretsViewSet(AccountRecordViewLogMixin, AccountViewSet): """ diff --git a/apps/assets/models/base.py b/apps/assets/models/base.py index c4866c22b..031335b72 100644 --- a/apps/assets/models/base.py +++ b/apps/assets/models/base.py @@ -6,9 +6,7 @@ from django.utils import timezone from django.utils.translation import gettext_lazy as _ from assets.const import Connectivity -from common.utils import ( - get_logger -) +from common.utils import get_logger logger = get_logger(__file__)