From f29ba1319c034a6276c958c7e766459969088415 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 20 Feb 2025 10:03:35 +0800 Subject: [PATCH 1/2] perf: update some choice --- apps/accounts/migrations/0001_initial.py | 2 +- apps/accounts/serializers/automations/base.py | 16 +-- apps/assets/migrations/0001_initial.py | 114 ++++++++++++------ apps/assets/serializers/automations/base.py | 15 +-- apps/common/const/choices.py | 4 +- apps/i18n/core/en/LC_MESSAGES/django.po | 4 +- apps/i18n/core/ja/LC_MESSAGES/django.po | 4 +- apps/i18n/core/zh/LC_MESSAGES/django.po | 4 +- apps/i18n/core/zh_Hant/LC_MESSAGES/django.po | 4 +- 9 files changed, 97 insertions(+), 70 deletions(-) diff --git a/apps/accounts/migrations/0001_initial.py b/apps/accounts/migrations/0001_initial.py index f508c266b..817b3246c 100644 --- a/apps/accounts/migrations/0001_initial.py +++ b/apps/accounts/migrations/0001_initial.py @@ -94,7 +94,7 @@ class Migration(migrations.Migration): ('snapshot', models.JSONField(blank=True, default=dict, encoder=common.db.encoder.ModelJSONFieldEncoder, null=True, verbose_name='Account backup snapshot')), - ('trigger', models.CharField(choices=[('manual', 'Manual trigger'), ('timing', 'Timing trigger')], + ('trigger', models.CharField(choices=[('manual', 'Manual'), ('timing', 'Timing')], default='manual', max_length=128, verbose_name='Trigger mode')), ('reason', models.CharField(blank=True, max_length=1024, null=True, verbose_name='Reason')), ('is_success', models.BooleanField(default=False, verbose_name='Is success')), diff --git a/apps/accounts/serializers/automations/base.py b/apps/accounts/serializers/automations/base.py index 4bb9038b2..828aa33c8 100644 --- a/apps/accounts/serializers/automations/base.py +++ b/apps/accounts/serializers/automations/base.py @@ -1,11 +1,10 @@ from django.utils.translation import gettext_lazy as _ from rest_framework import serializers -from accounts.models import AutomationExecution from assets.const import AutomationTypes from assets.models import Asset, Node, BaseAutomation -from common.const.choices import Trigger -from common.serializers.fields import ObjectRelatedField, LabeledChoiceField +from assets.serializers.automations import AutomationExecutionSerializer as AssetAutomationExecutionSerializer +from common.serializers.fields import ObjectRelatedField from common.utils import get_logger from ops.mixin import PeriodTaskSerializerMixin from orgs.mixins.serializers import BulkOrgResourceModelSerializer @@ -49,17 +48,8 @@ class BaseAutomationSerializer(PeriodTaskSerializerMixin, BulkOrgResourceModelSe raise NotImplementedError -class AutomationExecutionSerializer(serializers.ModelSerializer): +class AutomationExecutionSerializer(AssetAutomationExecutionSerializer): snapshot = serializers.SerializerMethodField(label=_('Automation snapshot')) - type = serializers.ChoiceField(choices=AutomationTypes.choices, write_only=True, label=_('Type')) - trigger = LabeledChoiceField(choices=Trigger.choices, read_only=True, label=_("Trigger mode")) - - class Meta: - model = AutomationExecution - read_only_fields = [ - 'trigger', 'date_start', 'date_finished', 'snapshot', 'status', 'duration' - ] - fields = ['id', 'automation', 'type'] + read_only_fields @staticmethod def get_snapshot(obj): diff --git a/apps/assets/migrations/0001_initial.py b/apps/assets/migrations/0001_initial.py index 63133bbc2..d62a3cca9 100644 --- a/apps/assets/migrations/0001_initial.py +++ b/apps/assets/migrations/0001_initial.py @@ -11,7 +11,6 @@ import common.db.fields class Migration(migrations.Migration): - initial = True dependencies = [ @@ -27,8 +26,11 @@ class Migration(migrations.Migration): ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), - ('connectivity', models.CharField(choices=[('-', 'Unknown'), ('na', 'N/A'), ('ok', 'OK'), ('err', 'Error')], default='-', max_length=16, verbose_name='Connectivity')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('connectivity', + models.CharField(choices=[('-', 'Unknown'), ('na', 'N/A'), ('ok', 'OK'), ('err', 'Error')], + default='-', max_length=16, verbose_name='Connectivity')), ('date_verified', models.DateTimeField(null=True, verbose_name='Date verified')), ('name', models.CharField(max_length=128, verbose_name='Name')), ('address', models.CharField(db_index=True, max_length=767, verbose_name='Address')), @@ -39,21 +41,27 @@ class Migration(migrations.Migration): options={ 'verbose_name': 'Asset', 'ordering': [], - 'permissions': [('refresh_assethardwareinfo', 'Can refresh asset hardware info'), ('test_assetconnectivity', 'Can test asset connectivity'), ('match_asset', 'Can match asset'), ('change_assetnodes', 'Can change asset nodes')], + 'permissions': [('refresh_assethardwareinfo', 'Can refresh asset hardware info'), + ('test_assetconnectivity', 'Can test asset connectivity'), + ('match_asset', 'Can match asset'), ('change_assetnodes', 'Can change asset nodes')], }, - bases=(assets.models.asset.common.NodesRelationMixin, assets.models.asset.common.JSONFilterMixin, models.Model), + bases=( + assets.models.asset.common.NodesRelationMixin, assets.models.asset.common.JSONFilterMixin, models.Model), ), migrations.CreateModel( name='AutomationExecution', fields=[ - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('status', models.CharField(default='pending', max_length=16, verbose_name='Status')), ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Date created')), ('date_start', models.DateTimeField(db_index=True, null=True, verbose_name='Date start')), ('date_finished', models.DateTimeField(null=True, verbose_name='Date finished')), - ('snapshot', common.db.fields.EncryptJsonDictTextField(blank=True, default=dict, null=True, verbose_name='Automation snapshot')), - ('trigger', models.CharField(choices=[('manual', 'Manual trigger'), ('timing', 'Timing trigger')], default='manual', max_length=128, verbose_name='Trigger mode')), + ('snapshot', common.db.fields.EncryptJsonDictTextField(blank=True, default=dict, null=True, + verbose_name='Automation snapshot')), + ('trigger', models.CharField(choices=[('manual', 'Manual'), ('timing', 'Timing')], default='manual', + max_length=128, verbose_name='Trigger mode')), ], options={ 'verbose_name': 'Automation task execution', @@ -69,7 +77,8 @@ class Migration(migrations.Migration): ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('name', models.CharField(max_length=128, verbose_name='Name')), ('is_periodic', models.BooleanField(default=False, verbose_name='Periodic run')), ('interval', models.IntegerField(blank=True, default=24, null=True, verbose_name='Interval')), @@ -92,7 +101,8 @@ class Migration(migrations.Migration): ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('name', models.CharField(max_length=128, verbose_name='Name')), ], options={ @@ -108,7 +118,8 @@ class Migration(migrations.Migration): ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('key', models.CharField(max_length=64, unique=True, verbose_name='Key')), ('value', models.CharField(max_length=128, verbose_name='Value')), @@ -123,7 +134,8 @@ class Migration(migrations.Migration): 'ordering': ['parent_key', 'value'], 'permissions': [('match_node', 'Can match node')], }, - bases=(models.Model, assets.models.node.SomeNodesMixin, assets.models.node.FamilyMixin, assets.models.node.NodeAssetsMixin), + bases=(models.Model, assets.models.node.SomeNodesMixin, assets.models.node.FamilyMixin, + assets.models.node.NodeAssetsMixin), ), migrations.CreateModel( name='Platform', @@ -139,7 +151,9 @@ class Migration(migrations.Migration): ('type', models.CharField(default='linux', max_length=32, verbose_name='Type')), ('meta', common.db.fields.JsonDictTextField(blank=True, null=True, verbose_name='Meta')), ('internal', models.BooleanField(default=False, verbose_name='Internal')), - ('charset', models.CharField(choices=[('utf-8', 'UTF-8'), ('gbk', 'GBK')], default='utf-8', max_length=8, verbose_name='Charset')), + ('charset', + models.CharField(choices=[('utf-8', 'UTF-8'), ('gbk', 'GBK')], default='utf-8', max_length=8, + verbose_name='Charset')), ('domain_enabled', models.BooleanField(default=True, verbose_name='Gateway enabled')), ('su_enabled', models.BooleanField(default=False, verbose_name='Su enabled')), ('su_method', models.CharField(blank=True, max_length=32, null=True, verbose_name='Su method')), @@ -152,7 +166,9 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Cloud', fields=[ - ('asset_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.asset')), + ('asset_ptr', + models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, + primary_key=True, serialize=False, to='assets.asset')), ], options={ 'verbose_name': 'Cloud', @@ -162,7 +178,9 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Custom', fields=[ - ('asset_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.asset')), + ('asset_ptr', + models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, + primary_key=True, serialize=False, to='assets.asset')), ], options={ 'verbose_name': 'Custom asset', @@ -172,7 +190,9 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Database', fields=[ - ('asset_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.asset')), + ('asset_ptr', + models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, + primary_key=True, serialize=False, to='assets.asset')), ('db_name', models.CharField(blank=True, max_length=1024, verbose_name='Database')), ('use_ssl', models.BooleanField(default=False, verbose_name='Use SSL')), ('ca_cert', common.db.fields.EncryptTextField(blank=True, verbose_name='CA cert')), @@ -188,7 +208,9 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Device', fields=[ - ('asset_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.asset')), + ('asset_ptr', + models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, + primary_key=True, serialize=False, to='assets.asset')), ], options={ 'verbose_name': 'Device', @@ -198,7 +220,9 @@ class Migration(migrations.Migration): migrations.CreateModel( name='GPT', fields=[ - ('asset_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.asset')), + ('asset_ptr', + models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, + primary_key=True, serialize=False, to='assets.asset')), ('proxy', models.CharField(blank=True, default='', max_length=128, verbose_name='Proxy')), ], options={ @@ -209,7 +233,9 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Host', fields=[ - ('asset_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.asset')), + ('asset_ptr', + models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, + primary_key=True, serialize=False, to='assets.asset')), ], options={ 'verbose_name': 'Host', @@ -219,11 +245,17 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Web', fields=[ - ('asset_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.asset')), - ('autofill', models.CharField(choices=[('no', 'Disabled'), ('basic', 'Basic'), ('script', 'Script')], default='basic', max_length=16, verbose_name='Autofill')), - ('username_selector', models.CharField(blank=True, default='', max_length=128, verbose_name='Username selector')), - ('password_selector', models.CharField(blank=True, default='', max_length=128, verbose_name='Password selector')), - ('submit_selector', models.CharField(blank=True, default='', max_length=128, verbose_name='Submit selector')), + ('asset_ptr', + models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, + primary_key=True, serialize=False, to='assets.asset')), + ('autofill', models.CharField(choices=[('no', 'Disabled'), ('basic', 'Basic'), ('script', 'Script')], + default='basic', max_length=16, verbose_name='Autofill')), + ('username_selector', + models.CharField(blank=True, default='', max_length=128, verbose_name='Username selector')), + ('password_selector', + models.CharField(blank=True, default='', max_length=128, verbose_name='Password selector')), + ('submit_selector', + models.CharField(blank=True, default='', max_length=128, verbose_name='Submit selector')), ('script', models.JSONField(blank=True, default=list, verbose_name='Script')), ], options={ @@ -237,7 +269,8 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=32, verbose_name='Name')), ('port', models.IntegerField(verbose_name='Port')), - ('asset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='protocols', to='assets.asset', verbose_name='Asset')), + ('asset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='protocols', + to='assets.asset', verbose_name='Asset')), ], ), migrations.CreateModel( @@ -251,7 +284,8 @@ class Migration(migrations.Migration): ('default', models.BooleanField(default=False, verbose_name='Default')), ('public', models.BooleanField(default=True, verbose_name='Public')), ('setting', models.JSONField(default=dict, verbose_name='Setting')), - ('platform', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='protocols', to='assets.platform')), + ('platform', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='protocols', + to='assets.platform')), ], ), migrations.CreateModel( @@ -264,24 +298,32 @@ class Migration(migrations.Migration): ('ping_method', models.CharField(blank=True, max_length=32, null=True, verbose_name='Ping method')), ('ping_params', models.JSONField(default=dict, verbose_name='Ping params')), ('gather_facts_enabled', models.BooleanField(default=False, verbose_name='Gather facts enabled')), - ('gather_facts_method', models.TextField(blank=True, max_length=32, null=True, verbose_name='Gather facts method')), + ('gather_facts_method', + models.TextField(blank=True, max_length=32, null=True, verbose_name='Gather facts method')), ('gather_facts_params', models.JSONField(default=dict, verbose_name='Gather facts params')), ('change_secret_enabled', models.BooleanField(default=False, verbose_name='Change secret enabled')), - ('change_secret_method', models.TextField(blank=True, max_length=32, null=True, verbose_name='Change secret method')), + ('change_secret_method', + models.TextField(blank=True, max_length=32, null=True, verbose_name='Change secret method')), ('change_secret_params', models.JSONField(default=dict, verbose_name='Change secret params')), ('push_account_enabled', models.BooleanField(default=False, verbose_name='Push account enabled')), - ('push_account_method', models.TextField(blank=True, max_length=32, null=True, verbose_name='Push account method')), + ('push_account_method', + models.TextField(blank=True, max_length=32, null=True, verbose_name='Push account method')), ('push_account_params', models.JSONField(default=dict, verbose_name='Push account params')), ('verify_account_enabled', models.BooleanField(default=False, verbose_name='Verify account enabled')), - ('verify_account_method', models.TextField(blank=True, max_length=32, null=True, verbose_name='Verify account method')), + ('verify_account_method', + models.TextField(blank=True, max_length=32, null=True, verbose_name='Verify account method')), ('verify_account_params', models.JSONField(default=dict, verbose_name='Verify account params')), ('gather_accounts_enabled', models.BooleanField(default=False, verbose_name='Gather facts enabled')), - ('gather_accounts_method', models.TextField(blank=True, max_length=32, null=True, verbose_name='Gather facts method')), + ('gather_accounts_method', + models.TextField(blank=True, max_length=32, null=True, verbose_name='Gather facts method')), ('gather_accounts_params', models.JSONField(default=dict, verbose_name='Gather facts params')), ('remove_account_enabled', models.BooleanField(default=False, verbose_name='Remove account enabled')), - ('remove_account_method', models.TextField(blank=True, max_length=32, null=True, verbose_name='Remove account method')), + ('remove_account_method', + models.TextField(blank=True, max_length=32, null=True, verbose_name='Remove account method')), ('remove_account_params', models.JSONField(default=dict, verbose_name='Remove account params')), - ('platform', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='automation', to='assets.platform')), + ('platform', + models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='automation', + to='assets.platform')), ], ), migrations.CreateModel( @@ -293,10 +335,12 @@ class Migration(migrations.Migration): ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), - ('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), + ('org_id', + models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('name', models.CharField(max_length=128, verbose_name='Name')), ('value', models.CharField(max_length=128, verbose_name='Value')), - ('category', models.CharField(choices=[('S', 'System'), ('U', 'User')], default='U', max_length=128, verbose_name='Category')), + ('category', models.CharField(choices=[('S', 'System'), ('U', 'User')], default='U', max_length=128, + verbose_name='Category')), ('is_active', models.BooleanField(default=True, verbose_name='Is active')), ], options={ diff --git a/apps/assets/serializers/automations/base.py b/apps/assets/serializers/automations/base.py index 62ffc3542..b50cd5254 100644 --- a/apps/assets/serializers/automations/base.py +++ b/apps/assets/serializers/automations/base.py @@ -2,7 +2,7 @@ from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from assets.models import Asset, Node, BaseAutomation, AutomationExecution -from common.const.choices import Trigger +from common.const.choices import Trigger, Status from common.serializers.fields import ObjectRelatedField, LabeledChoiceField from common.utils import get_logger from ops.mixin import PeriodTaskSerializerMixin @@ -36,24 +36,17 @@ class BaseAutomationSerializer(PeriodTaskSerializerMixin, BulkOrgResourceModelSe class AutomationExecutionSerializer(serializers.ModelSerializer): snapshot = serializers.SerializerMethodField(label=_('Automation snapshot')) - status = serializers.SerializerMethodField(label=_("Status")) trigger = LabeledChoiceField(choices=Trigger.choices, read_only=True, label=_("Trigger mode")) + status = LabeledChoiceField(choices=Status.choices, read_only=True, label=_('Status')) class Meta: model = AutomationExecution read_only_fields = [ - 'trigger', 'date_start', 'date_finished', 'snapshot', 'status', 'duration' + 'trigger', 'date_start', 'date_finished', + 'snapshot', 'status', 'duration' ] fields = ['id', 'automation'] + read_only_fields - @staticmethod - def get_status(obj): - from common.const import Status - status = Status._member_map_.get(obj.status) - if status is None: - return obj.status - return status.label - @staticmethod def get_snapshot(obj): from assets.const import AutomationTypes as AssetTypes diff --git a/apps/common/const/choices.py b/apps/common/const/choices.py index 8158f874f..69130a321 100644 --- a/apps/common/const/choices.py +++ b/apps/common/const/choices.py @@ -54,8 +54,8 @@ def get_country_phone_choices(): class Trigger(models.TextChoices): - manual = 'manual', _('Manual trigger') - timing = 'timing', _('Timing trigger') + manual = 'manual', _('Manual') + timing = 'timing', _('Timing') class Status(models.TextChoices): diff --git a/apps/i18n/core/en/LC_MESSAGES/django.po b/apps/i18n/core/en/LC_MESSAGES/django.po index e710c0366..707cf015b 100644 --- a/apps/i18n/core/en/LC_MESSAGES/django.po +++ b/apps/i18n/core/en/LC_MESSAGES/django.po @@ -4414,11 +4414,11 @@ msgid "China" msgstr "" #: common/const/choices.py:57 -msgid "Manual trigger" +msgid "Manual" msgstr "" #: common/const/choices.py:58 -msgid "Timing trigger" +msgid "Timing" msgstr "" #: common/const/choices.py:62 diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index 5402c293f..3c7382710 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -4566,11 +4566,11 @@ msgid "China" msgstr "中国" #: common/const/choices.py:57 -msgid "Manual trigger" +msgid "Manual" msgstr "手動トリガー" #: common/const/choices.py:58 -msgid "Timing trigger" +msgid "Timing" msgstr "タイミングトリガー" #: common/const/choices.py:62 diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index ce8ab1310..5652a6a33 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -4533,11 +4533,11 @@ msgid "China" msgstr "中国" #: common/const/choices.py:57 -msgid "Manual trigger" +msgid "Manual" msgstr "手动触发" #: common/const/choices.py:58 -msgid "Timing trigger" +msgid "Timing" msgstr "定时触发" #: common/const/choices.py:62 diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index 17c6b1505..1eadacc92 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -4508,11 +4508,11 @@ msgid "China" msgstr "中國" #: common/const/choices.py:57 -msgid "Manual trigger" +msgid "Manual" msgstr "手動觸發" #: common/const/choices.py:58 -msgid "Timing trigger" +msgid "Timing" msgstr "定時觸發" #: common/const/choices.py:62 From 04bf099dbe0dc765d8d36f5c5a2d527e590510f4 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 20 Feb 2025 11:16:21 +0800 Subject: [PATCH 2/2] perf: update account serializer remote unused code --- .../api/automations/gather_account.py | 16 +++---- apps/accounts/serializers/automations/base.py | 46 ++----------------- .../serializers/automations/gather_account.py | 21 +++++---- apps/accounts/urls.py | 5 +- apps/assets/models/automations/base.py | 4 ++ apps/assets/serializers/automations/base.py | 18 +++++--- 6 files changed, 40 insertions(+), 70 deletions(-) diff --git a/apps/accounts/api/automations/gather_account.py b/apps/accounts/api/automations/gather_account.py index b7d10edf6..49f38d028 100644 --- a/apps/accounts/api/automations/gather_account.py +++ b/apps/accounts/api/automations/gather_account.py @@ -17,22 +17,22 @@ from orgs.mixins.api import OrgBulkModelViewSet from .base import AutomationExecutionViewSet __all__ = [ - "GatherAccountsAutomationViewSet", - "GatherAccountsExecutionViewSet", + "DiscoverAccountsAutomationViewSet", + "DiscoverAccountsExecutionViewSet", "GatheredAccountViewSet", ] from ...risk_handlers import RiskHandler -class GatherAccountsAutomationViewSet(OrgBulkModelViewSet): +class DiscoverAccountsAutomationViewSet(OrgBulkModelViewSet): model = GatherAccountsAutomation filterset_fields = ("name",) search_fields = filterset_fields - serializer_class = serializers.GatherAccountAutomationSerializer + serializer_class = serializers.DiscoverAccountAutomationSerializer -class GatherAccountsExecutionViewSet(AutomationExecutionViewSet): +class DiscoverAccountsExecutionViewSet(AutomationExecutionViewSet): rbac_perms = ( ("list", "accounts.view_gatheraccountsexecution"), ("retrieve", "accounts.view_gatheraccountsexecution"), @@ -76,9 +76,9 @@ class GatheredAccountViewSet(OrgBulkModelViewSet): filterset_class = GatheredAccountFilterSet ordering = ("status",) serializer_classes = { - "default": serializers.GatheredAccountSerializer, - "status": serializers.GatheredAccountActionSerializer, - "details": serializers.GatheredAccountDetailsSerializer + "default": serializers.DiscoverAccountSerializer, + "status": serializers.DiscoverAccountActionSerializer, + "details": serializers.DiscoverAccountDetailsSerializer } rbac_perms = { "status": "assets.change_gatheredaccount", diff --git a/apps/accounts/serializers/automations/base.py b/apps/accounts/serializers/automations/base.py index 828aa33c8..ab79e23a3 100644 --- a/apps/accounts/serializers/automations/base.py +++ b/apps/accounts/serializers/automations/base.py @@ -2,40 +2,19 @@ from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from assets.const import AutomationTypes -from assets.models import Asset, Node, BaseAutomation +from assets.models import BaseAutomation from assets.serializers.automations import AutomationExecutionSerializer as AssetAutomationExecutionSerializer -from common.serializers.fields import ObjectRelatedField +from assets.serializers.automations import BaseAutomationSerializer as AssetBaseAutomationSerializer from common.utils import get_logger -from ops.mixin import PeriodTaskSerializerMixin -from orgs.mixins.serializers import BulkOrgResourceModelSerializer logger = get_logger(__file__) __all__ = [ 'BaseAutomationSerializer', 'AutomationExecutionSerializer', - 'UpdateAssetSerializer', 'UpdateNodeSerializer', 'AutomationAssetsSerializer', ] -class BaseAutomationSerializer(PeriodTaskSerializerMixin, BulkOrgResourceModelSerializer): - assets = ObjectRelatedField(many=True, required=False, queryset=Asset.objects, label=_('Assets')) - nodes = ObjectRelatedField(many=True, required=False, queryset=Node.objects, label=_('Nodes')) - is_periodic = serializers.BooleanField(default=False, required=False, label=_("Periodic perform")) - - class Meta: - read_only_fields = [ - 'date_created', 'date_updated', 'created_by', - 'periodic_display', 'executed_amount', 'type' - ] - fields = read_only_fields + [ - 'id', 'name', 'is_periodic', 'interval', 'crontab', 'comment', - 'accounts', 'nodes', 'assets', 'is_active', - ] - extra_kwargs = { - 'name': {'required': True}, - 'executed_amount': {'label': _('Executions')}, - } - +class BaseAutomationSerializer(AssetBaseAutomationSerializer): def validate_name(self, name): if self.instance and self.instance.name == name: return name @@ -66,22 +45,3 @@ class AutomationExecutionSerializer(AssetAutomationExecutionSerializer): 'type_display': type_display, } return snapshot - - -class UpdateAssetSerializer(serializers.ModelSerializer): - class Meta: - model = BaseAutomation - fields = ['id', 'assets'] - - -class UpdateNodeSerializer(serializers.ModelSerializer): - class Meta: - model = BaseAutomation - fields = ['id', 'nodes'] - - -class AutomationAssetsSerializer(serializers.ModelSerializer): - class Meta: - model = Asset - only_fields = ['id', 'name', 'address'] - fields = tuple(only_fields) diff --git a/apps/accounts/serializers/automations/gather_account.py b/apps/accounts/serializers/automations/gather_account.py index 795fa95b2..8d3f48216 100644 --- a/apps/accounts/serializers/automations/gather_account.py +++ b/apps/accounts/serializers/automations/gather_account.py @@ -11,14 +11,14 @@ from orgs.mixins.serializers import BulkOrgResourceModelSerializer from .base import BaseAutomationSerializer __all__ = [ - 'GatheredAccountSerializer', - 'GatheredAccountActionSerializer', - 'GatherAccountAutomationSerializer', - 'GatheredAccountDetailsSerializer' + 'DiscoverAccountSerializer', + 'DiscoverAccountActionSerializer', + 'DiscoverAccountAutomationSerializer', + 'DiscoverAccountDetailsSerializer' ] -class GatherAccountAutomationSerializer(BaseAutomationSerializer): +class DiscoverAccountAutomationSerializer(BaseAutomationSerializer): class Meta: model = GatherAccountsAutomation read_only_fields = BaseAutomationSerializer.Meta.read_only_fields @@ -43,7 +43,7 @@ class AccountAssetSerializer(_AccountAssetSerializer): fields = [f for f in _AccountAssetSerializer.Meta.fields if f != 'auto_config'] -class GatheredAccountSerializer(BulkOrgResourceModelSerializer): +class DiscoverAccountSerializer(BulkOrgResourceModelSerializer): asset = AccountAssetSerializer(label=_('Asset')) class Meta(BaseAccountSerializer.Meta): @@ -63,12 +63,12 @@ class GatheredAccountSerializer(BulkOrgResourceModelSerializer): return queryset -class GatheredAccountActionSerializer(GatheredAccountSerializer): - class Meta(GatheredAccountSerializer.Meta): - read_only_fields = list(set(GatheredAccountSerializer.Meta.read_only_fields) - {'status'}) +class DiscoverAccountActionSerializer(DiscoverAccountSerializer): + class Meta(DiscoverAccountSerializer.Meta): + read_only_fields = list(set(DiscoverAccountSerializer.Meta.read_only_fields) - {'status'}) -class GatheredAccountDetailsSerializer(serializers.Serializer): +class DiscoverAccountDetailsSerializer(serializers.Serializer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) request = self.context.get('request') @@ -78,6 +78,7 @@ class GatheredAccountDetailsSerializer(serializers.Serializer): params = request.query_params if params.get('format') == 'openapi': return + pk = request.parser_context['kwargs'].get('pk') obj = get_object_or_404(GatheredAccount, pk=pk) details = obj.detail diff --git a/apps/accounts/urls.py b/apps/accounts/urls.py index 45a0ad7a8..8f567a0d3 100644 --- a/apps/accounts/urls.py +++ b/apps/accounts/urls.py @@ -19,8 +19,8 @@ router.register(r'account-backup-plan-executions', api.BackupAccountExecutionVie router.register(r'change-secret-automations', api.ChangeSecretAutomationViewSet, 'change-secret-automation') router.register(r'change-secret-executions', api.ChangSecretExecutionViewSet, 'change-secret-execution') router.register(r'change-secret-records', api.ChangeSecretRecordViewSet, 'change-secret-record') -router.register(r'gather-account-automations', api.GatherAccountsAutomationViewSet, 'gather-account-automation') -router.register(r'gather-account-executions', api.GatherAccountsExecutionViewSet, 'gather-account-execution') +router.register(r'gather-account-automations', api.DiscoverAccountsAutomationViewSet, 'gather-account-automation') +router.register(r'gather-account-executions', api.DiscoverAccountsExecutionViewSet, 'gather-account-execution') router.register(r'push-account-automations', api.PushAccountAutomationViewSet, 'push-account-automation') router.register(r'push-account-executions', api.PushAccountExecutionViewSet, 'push-account-execution') router.register(r'push-account-records', api.PushAccountRecordViewSet, 'push-account-record') @@ -30,7 +30,6 @@ router.register(r'account-check-engines', api.CheckAccountEngineViewSet, 'accoun router.register(r'account-risks', api.AccountRiskViewSet, 'account-risks') router.register(r'integration-applications', api.IntegrationApplicationViewSet, 'integration-apps') - urlpatterns = [ path('accounts/bulk/', api.AssetAccountBulkCreateApi.as_view(), name='account-bulk-create'), path('accounts/tasks/', api.AccountsTaskCreateAPI.as_view(), name='account-task-create'), diff --git a/apps/assets/models/automations/base.py b/apps/assets/models/automations/base.py index 3c235ea9d..2df9aff61 100644 --- a/apps/assets/models/automations/base.py +++ b/apps/assets/models/automations/base.py @@ -159,6 +159,10 @@ class AutomationExecution(OrgModelMixin): ) verbose_name = _("Automation task execution") + @property + def short_id(self): + return str(self.id)[:8] + @property def is_finished(self): return bool(self.date_finished) diff --git a/apps/assets/serializers/automations/base.py b/apps/assets/serializers/automations/base.py index b50cd5254..184c6bd37 100644 --- a/apps/assets/serializers/automations/base.py +++ b/apps/assets/serializers/automations/base.py @@ -22,15 +22,20 @@ class BaseAutomationSerializer(PeriodTaskSerializerMixin, BulkOrgResourceModelSe class Meta: read_only_fields = [ - 'date_created', 'date_updated', 'created_by', 'periodic_display' + 'date_created', 'date_updated', 'created_by', + 'periodic_display', 'executed_amount', 'type' ] - fields = [ - 'id', 'name', 'is_periodic', 'interval', 'crontab', 'comment', - 'type', 'accounts', 'nodes', 'assets', 'is_active' - ] + read_only_fields + mini_fields = [ + 'id', 'name', 'type', 'is_periodic', 'interval', + 'crontab', 'comment', 'is_active' + ] + fields = mini_fields + [ + 'accounts', 'nodes', 'assets', + ] + read_only_fields extra_kwargs = { 'name': {'required': True}, 'type': {'read_only': True}, + 'executed_amount': {'label': _('Executions')}, } @@ -38,6 +43,7 @@ class AutomationExecutionSerializer(serializers.ModelSerializer): snapshot = serializers.SerializerMethodField(label=_('Automation snapshot')) trigger = LabeledChoiceField(choices=Trigger.choices, read_only=True, label=_("Trigger mode")) status = LabeledChoiceField(choices=Status.choices, read_only=True, label=_('Status')) + short_id = serializers.CharField(read_only=True, label=_('Short ID')) class Meta: model = AutomationExecution @@ -45,7 +51,7 @@ class AutomationExecutionSerializer(serializers.ModelSerializer): 'trigger', 'date_start', 'date_finished', 'snapshot', 'status', 'duration' ] - fields = ['id', 'automation'] + read_only_fields + fields = ['id', 'short_id', 'automation'] + read_only_fields @staticmethod def get_snapshot(obj):