diff --git a/apps/accounts/api/automations/base.py b/apps/accounts/api/automations/base.py index 4ef0fbfd7..34ad6c109 100644 --- a/apps/accounts/api/automations/base.py +++ b/apps/accounts/api/automations/base.py @@ -6,6 +6,7 @@ from rest_framework import status, mixins, viewsets from rest_framework.decorators import action from rest_framework.response import Response +from accounts.filters import AutomationExecutionFilterSet from accounts.models import AutomationExecution from accounts.tasks import execute_account_automation_task from assets import serializers @@ -100,6 +101,7 @@ class AutomationExecutionViewSet( ): search_fields = ('trigger', 'automation__name') filterset_fields = ('trigger', 'automation_id', 'automation__name') + filterset_class = AutomationExecutionFilterSet serializer_class = serializers.AutomationExecutionSerializer tp: str diff --git a/apps/accounts/automations/backup_account/handlers.py b/apps/accounts/automations/backup_account/handlers.py index 737c427a2..251a7d605 100644 --- a/apps/accounts/automations/backup_account/handlers.py +++ b/apps/accounts/automations/backup_account/handlers.py @@ -38,6 +38,8 @@ class BaseAccountHandler: else: if isinstance(v, dict): v = v.get('label') + elif v is None: + v = '' data[k] = v return data @@ -196,8 +198,8 @@ class AccountBackupHandler: attachment_list = [attachment] AccountBackupExecutionTaskMsg(name, user).publish(attachment_list) - # for file in files: - # os.remove(file) + for file in files: + os.remove(file) def send_backup_obj_storage(self, files, recipients, password): if not files: @@ -282,8 +284,7 @@ class AccountBackupHandler: else: recipients = recipients_part_one or recipients_part_two files = self.create_excel() - print(files) - # self.send_backup_mail(files, recipients) + self.send_backup_mail(files, recipients) def run(self): print('{}: {}'.format(_('Plan start'), local_now_display())) diff --git a/apps/accounts/filters.py b/apps/accounts/filters.py index 8995cb524..86f1d65e9 100644 --- a/apps/accounts/filters.py +++ b/apps/accounts/filters.py @@ -15,7 +15,8 @@ from assets.utils import get_node_from_request from common.drf.filters import BaseFilterSet from common.utils.timezone import local_zero_hour, local_now from .const.automation import ChangeSecretRecordStatusChoice -from .models import Account, GatheredAccount, ChangeSecretRecord, PushSecretRecord, IntegrationApplication +from .models import Account, GatheredAccount, ChangeSecretRecord, PushSecretRecord, IntegrationApplication, \ + AutomationExecution class NodeFilterBackend(filters.BaseFilterBackend): @@ -190,24 +191,41 @@ class UUIDExecutionFilterMixin: return queryset.filter(**{name: value}) -class ChangeSecretRecordFilterSet(SecretRecordMixin, UUIDExecutionFilterMixin, BaseFilterSet): - execution_id = django_filters.CharFilter(method="filter_execution") +class DaysExecutionFilterMixin: days = drf_filters.NumberFilter(method="filter_days") + field: str - @staticmethod - def filter_days(queryset, name, value): + def filter_days(self, queryset, name, value): value = int(value) dt = local_zero_hour() if value != 1: dt = local_now() - timezone.timedelta(days=value) - return queryset.filter(date_finished__gte=dt) + return queryset.filter(**{f'{self.field}__gte': dt}) + + +class ChangeSecretRecordFilterSet( + SecretRecordMixin, UUIDExecutionFilterMixin, + DaysExecutionFilterMixin, BaseFilterSet +): + execution_id = django_filters.CharFilter(method="filter_execution") + days = drf_filters.NumberFilter(method="filter_days") + + field = 'date_finished' class Meta: model = ChangeSecretRecord fields = ["id", "status", "asset_id", "execution_id"] +class AutomationExecutionFilterSet(DaysExecutionFilterMixin, BaseFilterSet): + field = 'date_start' + + class Meta: + model = AutomationExecution + fields = ["days", 'trigger', 'automation_id', 'automation__name'] + + class PushAccountRecordFilterSet(SecretRecordMixin, UUIDExecutionFilterMixin, BaseFilterSet): execution_id = django_filters.CharFilter(method="filter_execution") diff --git a/apps/accounts/serializers/account/account.py b/apps/accounts/serializers/account/account.py index 438fb0244..88f6de07c 100644 --- a/apps/accounts/serializers/account/account.py +++ b/apps/accounts/serializers/account/account.py @@ -460,7 +460,10 @@ class AccountSecretSerializer(SecretReadableMixin, AccountSerializer): 'secret': {'write_only': False}, 'spec_info': {'label': _('Spec info')}, } - exclude_backup_fields = ['passphrase', 'push_now', 'params'] + exclude_backup_fields = [ + 'passphrase', 'push_now', 'params', + 'spec_info', 'platform', 'auto_config' + ] class AccountHistorySerializer(serializers.ModelSerializer): diff --git a/apps/assets/automations/base/manager.py b/apps/assets/automations/base/manager.py index 3c968213f..ea5c91631 100644 --- a/apps/assets/automations/base/manager.py +++ b/apps/assets/automations/base/manager.py @@ -150,7 +150,7 @@ class BaseManager: recipients = self.execution.recipients if not recipients: return - print("Send report to: ", ",".join([str(u) for u in recipients])) + print(f"Send report to: {','.join([str(u) for u in recipients])}") report = self.gen_report() report = transform(report, cssutils_logging_level="CRITICAL") diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index 6c475efed..6f38ad697 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -3956,7 +3956,7 @@ msgstr "请输入动态安全码" msgid "" "The two-factor code you entered has either already been used or has expired. " "Please request a new one." -msgstr "" +msgstr "您输入的双重验证码已被使用或已过期。请申请新的双重验证码。" #: authentication/mfa/custom.py:21 msgid "MFA Custom code invalid"