From 48b3699591c97eee202be574a58896d4f576cccf Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 21 Apr 2023 11:18:04 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=94=AF=E6=8C=81=20?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=20applet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit perf: 优化平台 --- apps/assets/api/mixin.py | 16 ++++++++++++++-- apps/assets/const/types.py | 13 ++++++++----- apps/assets/serializers/platform.py | 11 ++--------- apps/common/serializers/dynamic.py | 3 +++ apps/locale/zh/LC_MESSAGES/django.mo | 4 ++-- apps/locale/zh/LC_MESSAGES/django.po | 2 +- apps/terminal/models/applet/applet.py | 2 +- 7 files changed, 31 insertions(+), 20 deletions(-) diff --git a/apps/assets/api/mixin.py b/apps/assets/api/mixin.py index d7cb90121..13ae0f283 100644 --- a/apps/assets/api/mixin.py +++ b/apps/assets/api/mixin.py @@ -57,11 +57,23 @@ class SerializeToTreeNodeMixin: ] return data + @lazyproperty + def support_types(self): + from assets.const import AllTypes + return AllTypes.get_types_values(exclude_custom=True) + + def get_icon(self, asset): + if asset.type in self.support_types: + return asset.type + else: + return 'file' + @timeit def serialize_assets(self, assets, node_key=None): sftp_enabled_platform = PlatformProtocol.objects \ .filter(name='ssh', setting__sftp_enabled=True) \ - .values_list('platform', flat=True).distinct() + .values_list('platform', flat=True) \ + .distinct() if node_key is None: get_pid = lambda asset: getattr(asset, 'parent_key', '') else: @@ -75,7 +87,7 @@ class SerializeToTreeNodeMixin: 'pId': get_pid(asset), 'isParent': False, 'open': False, - 'iconSkin': asset.type, + 'iconSkin': self.get_icon(asset), 'chkDisabled': not asset.is_active, 'meta': { 'type': 'asset', diff --git a/apps/assets/const/types.py b/apps/assets/const/types.py index ad26968a5..8194c5c14 100644 --- a/apps/assets/const/types.py +++ b/apps/assets/const/types.py @@ -151,15 +151,18 @@ class AllTypes(ChoicesMixin): ) @classmethod - def get_types(cls): + def get_types(cls, exclude_custom=False): choices = [] - for i in dict(cls.category_types()).values(): - choices.extend(i.get_types()) + + for name, tp in dict(cls.category_types()).items(): + if name == Category.CUSTOM and exclude_custom: + continue + choices.extend(tp.get_types()) return choices @classmethod - def get_types_values(cls): - choices = cls.get_types() + def get_types_values(cls, exclude_custom=False): + choices = cls.get_types(exclude_custom=exclude_custom) return [c.value for c in choices] @staticmethod diff --git a/apps/assets/serializers/platform.py b/apps/assets/serializers/platform.py index b010a6ed0..3313168cc 100644 --- a/apps/assets/serializers/platform.py +++ b/apps/assets/serializers/platform.py @@ -2,7 +2,7 @@ from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from assets.const.web import FillType -from common.serializers import WritableNestedModelSerializer +from common.serializers import WritableNestedModelSerializer, type_field_map from common.serializers.fields import LabeledChoiceField from common.utils import lazyproperty from ..const import Category, AllTypes @@ -88,14 +88,7 @@ class PlatformProtocolSerializer(serializers.ModelSerializer): class PlatformCustomField(serializers.Serializer): - TYPE_CHOICES = [ - ("str", "str"), - ("text", "text"), - ("int", "int"), - ("bool", "bool"), - ("choice", "choice"), - ("list", "list"), - ] + TYPE_CHOICES = [(t, t) for t, c in type_field_map.items()] name = serializers.CharField(label=_("Name"), max_length=128) label = serializers.CharField(label=_("Label"), max_length=128) type = serializers.ChoiceField(choices=TYPE_CHOICES, label=_("Type"), default='str') diff --git a/apps/common/serializers/dynamic.py b/apps/common/serializers/dynamic.py index 9ab26b9bb..2a8ffe0c0 100644 --- a/apps/common/serializers/dynamic.py +++ b/apps/common/serializers/dynamic.py @@ -7,6 +7,7 @@ example_info = [ type_field_map = { "str": serializers.CharField, + "password": serializers.CharField, "int": serializers.IntegerField, "bool": serializers.BooleanField, "text": serializers.CharField, @@ -27,6 +28,8 @@ def set_default_if_need(data, i): def set_default_by_type(tp, data, field_info): if tp == 'str': data['max_length'] = 4096 + elif tp == 'password': + data['write_only'] = True elif tp == 'choice': choices = field_info.pop('choices', []) if isinstance(choices, str): diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index a4ec5564d..20231b06d 100644 --- a/apps/locale/zh/LC_MESSAGES/django.mo +++ b/apps/locale/zh/LC_MESSAGES/django.mo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2dd0610d610c2660f35d50dc2871ac08cc09080d2503e1080a57d97c47fea471 -size 114418 +oid sha256:591b458d6f8ea8d125bd584ca57768cd5aa5a7103b42e345eaadac744a73d475 +size 114412 diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 4d3396700..fce65d116 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -1060,7 +1060,7 @@ msgstr "Web" #: assets/const/category.py:15 msgid "Custom type" -msgstr "自定义类型" +msgstr "自定义" #: assets/const/cloud.py:7 msgid "Public cloud" diff --git a/apps/terminal/models/applet/applet.py b/apps/terminal/models/applet/applet.py index 786bc35de..c7296eda6 100644 --- a/apps/terminal/models/applet/applet.py +++ b/apps/terminal/models/applet/applet.py @@ -98,7 +98,7 @@ class Applet(JMSBaseModel): return try: with open(os.path.join(d, 'platform.yml')) as f: - data = yaml.safe_load(f) + data = yaml_load_with_i18n(f) except Exception as e: raise ValidationError({'error': _('Load platform.yml failed: {}').format(e)})