diff --git a/apps/assets/serializers/asset/common.py b/apps/assets/serializers/asset/common.py index 2bbc6e451..5f1cee9ab 100644 --- a/apps/assets/serializers/asset/common.py +++ b/apps/assets/serializers/asset/common.py @@ -31,6 +31,12 @@ __all__ = [ class AssetProtocolsSerializer(serializers.ModelSerializer): port = serializers.IntegerField(required=False, allow_null=True, max_value=65535, min_value=0) + def get_render_help_text(self): + if self.parent and self.parent.many: + return _('Protocols, format is ["protocol/port"]') + else: + return _('Protocol, format is name/port') + def to_file_representation(self, data): return '{name}/{port}'.format(**data) @@ -97,6 +103,9 @@ class AssetAccountSerializer(AccountSerializer): attrs = super().validate(attrs) return self.set_secret(attrs) + def get_render_help_text(self): + return _('Accounts, format [{"name": "x", "username": "x", "secret": "x", "secret_type": "password"}]') + class Meta(AccountSerializer.Meta): fields = [ f for f in AccountSerializer.Meta.fields @@ -121,12 +130,23 @@ class AccountSecretSerializer(SecretReadableMixin, CommonModelSerializer): } +class NodeDisplaySerializer(serializers.ListField): + def get_render_help_text(self): + return _('Node path, format ["/org_name/node_name"], if node not exist, will create it') + + def to_internal_value(self, data): + return data + + def to_representation(self, data): + return data + + class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, WritableNestedModelSerializer): category = LabeledChoiceField(choices=Category.choices, read_only=True, label=_('Category')) type = LabeledChoiceField(choices=AllTypes.choices(), read_only=True, label=_('Type')) protocols = AssetProtocolsSerializer(many=True, required=False, label=_('Protocols'), default=()) accounts = AssetAccountSerializer(many=True, required=False, allow_null=True, write_only=True, label=_('Accounts')) - nodes_display = serializers.ListField(read_only=False, required=False, label=_("Node path")) + nodes_display = NodeDisplaySerializer(read_only=False, required=False, label=_("Node path")) _accounts = None class Meta: diff --git a/apps/common/api/action.py b/apps/common/api/action.py index fb780705a..627a1468a 100644 --- a/apps/common/api/action.py +++ b/apps/common/api/action.py @@ -38,9 +38,15 @@ class SuggestionMixin: class RenderToJsonMixin: @action(methods=[POST, PUT], detail=False, url_path='render-to-json') def render_to_json(self, request: Request, *args, **kwargs): + rows = request.data + if rows and isinstance(rows[0], dict): + first = list(rows[0].values())[0] + if first.startswith('#Help'): + rows.pop(0) + data = { 'title': (), - 'data': request.data, + 'data': rows, } jms_context = getattr(request, 'jms_context', {}) diff --git a/apps/common/drf/parsers/base.py b/apps/common/drf/parsers/base.py index 33b344457..b4cbd1825 100644 --- a/apps/common/drf/parsers/base.py +++ b/apps/common/drf/parsers/base.py @@ -119,8 +119,6 @@ class BaseFileParser(BaseParser): value = field.to_file_internal_value(value) elif isinstance(field, serializers.BooleanField): value = value.lower() in ['true', '1', 'yes'] - elif isinstance(field, serializers.ChoiceField): - value = value elif isinstance(field, ObjectRelatedField): if field.many: value = [self.id_name_to_obj(v) for v in value] @@ -164,6 +162,15 @@ class BaseFileParser(BaseParser): data.append(row_data) return data + @staticmethod + def pop_help_text_if_need(rows): + rows = list(rows) + if not rows: + return rows + if rows[0][0] == '#Help': + rows.pop(0) + return rows + def parse(self, stream, media_type=None, parser_context=None): assert parser_context is not None, '`parser_context` should not be `None`' @@ -192,6 +199,7 @@ class BaseFileParser(BaseParser): request.jms_context = {} request.jms_context['column_title_field_pairs'] = column_title_field_pairs + rows = self.pop_help_text_if_need(rows) data = self.generate_data(field_names, rows) return data except Exception as e: diff --git a/apps/common/drf/renders/base.py b/apps/common/drf/renders/base.py index a6eae282e..b7361c729 100644 --- a/apps/common/drf/renders/base.py +++ b/apps/common/drf/renders/base.py @@ -5,12 +5,13 @@ from datetime import datetime import pyzipper from django.conf import settings +from django.utils import timezone from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from rest_framework.renderers import BaseRenderer from rest_framework.utils import encoders, json -from common.serializers.fields import ObjectRelatedField, LabeledChoiceField +from common.serializers import fields as common_fields from common.utils import get_logger logger = get_logger(__file__) @@ -38,8 +39,10 @@ class BaseFileRenderer(BaseRenderer): filename_prefix = serializer.Meta.model.__name__.lower() else: filename_prefix = 'download' - now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") - filename = "{}_{}.{}".format(filename_prefix, now, self.format) + suffix = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + if self.template == 'import': + suffix = 'template' + filename = "{}_{}.{}".format(filename_prefix, suffix, self.format) disposition = 'attachment; filename="{}"'.format(filename) response['Content-Disposition'] = disposition @@ -105,10 +108,10 @@ class BaseFileRenderer(BaseRenderer): value = field.to_file_representation(value) elif isinstance(value, bool): value = 'Yes' if value else 'No' - elif isinstance(field, LabeledChoiceField): + elif isinstance(field, common_fields.LabeledChoiceField): value = value or {} value = '{}({})'.format(value.get('label'), value.get('value')) - elif isinstance(field, ObjectRelatedField): + elif isinstance(field, common_fields.ObjectRelatedField): if field.many: value = [self.to_id_name(v) for v in value] else: @@ -126,6 +129,53 @@ class BaseFileRenderer(BaseRenderer): value = json.dumps(value, cls=encoders.JSONEncoder, ensure_ascii=False) return str(value) + def get_field_help_text(self, field): + text = '' + if hasattr(field, 'get_render_help_text'): + text = field.get_render_help_text() + elif isinstance(field, serializers.BooleanField): + text = _('Yes/No') + elif isinstance(field, serializers.CharField): + if field.max_length: + text = _('Text, max length {}').format(field.max_length) + else: + text = _("Long text, no length limit") + elif isinstance(field, serializers.IntegerField): + text = _('Number, min {} max {}').format(field.min_value, field.max_value) + text = text.replace('min None', '').replace('max None', '') + elif isinstance(field, serializers.DateTimeField): + text = _('Datetime format {}').format(timezone.now().strftime(settings.REST_FRAMEWORK['DATETIME_FORMAT'])) + elif isinstance(field, serializers.IPAddressField): + text = _('IP') + elif isinstance(field, serializers.ChoiceField): + choices = [str(v) for v in field.choices.keys()] + if isinstance(field, common_fields.LabeledChoiceField): + text = _("Choices, format name(value), name is optional for human read," + " value is requisite, options {}").format(','.join(choices)) + else: + text = _("Choices, options {}").format(",".join(choices)) + elif isinstance(field, common_fields.PhoneField): + text = _("Phone number, format +8612345678901") + elif isinstance(field, common_fields.LabeledChoiceField): + text = _('Label, format ["key:value"]') + elif isinstance(field, common_fields.ObjectRelatedField): + text = _("Object, format name(id), name is optional for human read, id is requisite") + elif isinstance(field, serializers.PrimaryKeyRelatedField): + text = _('Object, format id') + elif isinstance(field, serializers.ManyRelatedField): + child_relation_class_name = field.child_relation.__class__.__name__ + if child_relation_class_name == "ObjectRelatedField": + text = _('Objects, format ["name(id)", ...], name is optional for human read, id is requisite') + elif child_relation_class_name == "LabelRelatedField": + text = _('Labels, format ["key:value", ...], if label not exists, will create it') + else: + text = _('Objects, format ["id", ...]') + elif isinstance(field, serializers.ListSerializer): + child = field.child + if hasattr(child, 'get_render_help_text'): + text = child.get_render_help_text() + return text + def generate_rows(self, data, render_fields): for item in data: row = [] @@ -135,6 +185,17 @@ class BaseFileRenderer(BaseRenderer): row.append(value) yield row + def write_help_text_if_need(self): + if self.template == 'export': + return + fields = self.get_rendered_fields() + row = [] + for f in fields: + text = self.get_field_help_text(f) + row.append(text) + row[0] = '#Help ' + str(row[0]) + self.write_row(row) + @abc.abstractmethod def initial_writer(self): raise NotImplementedError @@ -184,6 +245,7 @@ class BaseFileRenderer(BaseRenderer): rows = self.generate_rows(data, rendered_fields) self.initial_writer() self.write_column_titles(column_titles) + self.write_help_text_if_need() self.write_rows(rows) self.after_render() value = self.get_rendered_value() diff --git a/apps/common/drf/renders/csv.py b/apps/common/drf/renders/csv.py index a8729294b..8c676b60f 100644 --- a/apps/common/drf/renders/csv.py +++ b/apps/common/drf/renders/csv.py @@ -2,17 +2,17 @@ # import codecs + import unicodecsv from six import BytesIO from .base import BaseFileRenderer from ..const import CSV_FILE_ESCAPE_CHARS -class CSVFileRenderer(BaseFileRenderer): +class CSVFileRenderer(BaseFileRenderer): media_type = 'text/csv' format = 'csv' - writer = None buffer = None diff --git a/apps/i18n/core/en/LC_MESSAGES/django.po b/apps/i18n/core/en/LC_MESSAGES/django.po index 7b49ffcde..d758149da 100644 --- a/apps/i18n/core/en/LC_MESSAGES/django.po +++ b/apps/i18n/core/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-30 15:08+0800\n" +"POT-Creation-Date: 2024-09-03 15:26+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -655,7 +655,7 @@ msgstr "" #: audits/models.py:92 audits/serializers.py:84 #: authentication/serializers/connect_token_secret.py:119 #: authentication/templates/authentication/_access_key_modal.html:34 -#: perms/serializers/permission.py:41 perms/serializers/permission.py:63 +#: perms/serializers/permission.py:52 perms/serializers/permission.py:74 #: tickets/serializers/ticket/ticket.py:21 msgid "Action" msgstr "" @@ -703,7 +703,7 @@ msgstr "" #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 #: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153 -#: assets/serializers/platform.py:273 +#: assets/serializers/platform.py:282 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 #: authentication/serializers/connect_token_secret.py:113 @@ -845,8 +845,8 @@ msgstr "" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: assets/models/platform.py:95 assets/serializers/asset/common.py:125 -#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 -#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 +#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:177 +#: assets/serializers/platform.py:283 perms/serializers/user_permission.py:26 #: settings/models.py:36 tickets/models/ticket/apply_application.py:13 #: users/models/preference.py:12 msgid "Category" @@ -857,7 +857,7 @@ msgstr "" #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 #: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155 -#: assets/serializers/platform.py:167 audits/serializers.py:53 +#: assets/serializers/platform.py:176 audits/serializers.py:53 #: audits/serializers.py:170 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 #: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 @@ -897,7 +897,7 @@ msgstr "" #: assets/serializers/platform.py:176 assets/serializers/platform.py:208 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 -#: perms/serializers/permission.py:35 +#: perms/serializers/permission.py:46 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:83 msgid "Assets" @@ -919,7 +919,7 @@ msgstr "" #: accounts/serializers/account/account.py:458 #: accounts/serializers/account/base.py:93 #: accounts/serializers/account/template.py:72 -#: assets/serializers/asset/common.py:387 +#: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "" @@ -1048,7 +1048,7 @@ msgid "" msgstr "" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "" @@ -1252,15 +1252,15 @@ msgstr "" msgid "Active" msgstr "Active" -#: acls/models/base.py:81 perms/serializers/permission.py:31 +#: acls/models/base.py:81 perms/serializers/permission.py:42 #: tickets/models/flow.py:23 users/models/preference.py:16 #: users/serializers/group.py:21 users/serializers/user.py:424 msgid "Users" msgstr "" #: acls/models/base.py:98 assets/models/automations/base.py:17 -#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 -#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 +#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148 +#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55 #: perms/serializers/user_permission.py:75 rbac/tree.py:35 msgid "Accounts" msgstr "" @@ -1392,7 +1392,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:147 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "" @@ -1809,12 +1809,12 @@ msgstr "" msgid "Port" msgstr "" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150 +#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "" -#: assets/models/asset/common.py:162 assets/models/platform.py:149 +#: assets/models/asset/common.py:161 assets/models/platform.py:138 #: authentication/backends/passkey/models.py:12 #: authentication/serializers/connect_token_secret.py:118 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385 @@ -1825,7 +1825,7 @@ msgstr "" msgid "Zone" msgstr "" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "" @@ -2169,38 +2169,58 @@ msgid "" "type" msgstr "" -#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:36 +msgid "Protocols, format is [\"protocol/port\"]" +msgstr "" + +#: assets/serializers/asset/common.py:38 +msgid "Protocol, format is name/port" +msgstr "" + +#: assets/serializers/asset/common.py:107 +msgid "" +"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" +msgstr "" + +#: assets/serializers/asset/common.py:135 +msgid "" +"Node path, format [\"/org_name/node_name\"], if node not exist, will create " +"it" +msgstr "" + +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 -#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45 +#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388 #: xpack/plugins/cloud/serializers/task.py:35 msgid "Protocols" msgstr "" -#: assets/serializers/asset/common.py:129 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:149 +#: assets/serializers/asset/common.py:171 msgid "Node path" msgstr "" -#: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:389 +#: assets/serializers/asset/common.py:168 +#: assets/serializers/asset/common.py:409 msgid "Auto info" msgstr "" -#: assets/serializers/asset/common.py:245 +#: assets/serializers/asset/common.py:265 msgid "Platform not exist" msgstr "" -#: assets/serializers/asset/common.py:281 +#: assets/serializers/asset/common.py:301 msgid "port out of range (0-65535)" msgstr "" -#: assets/serializers/asset/common.py:288 +#: assets/serializers/asset/common.py:308 msgid "Protocol is required: {}" msgstr "" -#: assets/serializers/asset/common.py:316 +#: assets/serializers/asset/common.py:336 msgid "Invalid data" msgstr "" @@ -2286,7 +2306,7 @@ msgid "" "the zone, the connection is routed through the gateway." msgstr "" -#: assets/serializers/domain.py:24 assets/serializers/platform.py:177 +#: assets/serializers/domain.py:24 assets/serializers/platform.py:186 #: orgs/serializers.py:13 perms/serializers/permission.py:39 msgid "Assets amount" msgstr "" @@ -2645,7 +2665,7 @@ msgid "Resource" msgstr "" #: audits/models.py:101 audits/models.py:147 audits/models.py:177 -#: terminal/serializers/command.py:75 +#: common/drf/renders/base.py:145 terminal/serializers/command.py:75 msgid "Datetime" msgstr "" @@ -3402,7 +3422,7 @@ msgid "Actions" msgstr "" #: authentication/serializers/connection_token.py:42 -#: perms/serializers/permission.py:43 perms/serializers/permission.py:64 +#: perms/serializers/permission.py:54 perms/serializers/permission.py:75 #: users/serializers/user.py:127 users/serializers/user.py:273 msgid "Is expired" msgstr "Expired" @@ -3444,8 +3464,8 @@ msgstr "" msgid "Access IP" msgstr "" -#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 -#: perms/serializers/permission.py:65 users/serializers/user.py:128 +#: authentication/serializers/token.py:92 perms/serializers/permission.py:53 +#: perms/serializers/permission.py:76 users/serializers/user.py:128 #: users/serializers/user.py:270 msgid "Is valid" msgstr "Is Valid" @@ -3953,7 +3973,7 @@ msgstr "Organization ID" msgid "The file content overflowed (The maximum length `{}` bytes)" msgstr "" -#: common/drf/parsers/base.py:199 +#: common/drf/parsers/base.py:207 msgid "Parse file error: {}" msgstr "" @@ -3961,7 +3981,65 @@ msgstr "" msgid "Invalid excel file" msgstr "" -#: common/drf/renders/base.py:208 +#: common/drf/renders/base.py:135 +msgid "Yes/No" +msgstr "" + +#: common/drf/renders/base.py:138 +msgid "Text, max length {}" +msgstr "" + +#: common/drf/renders/base.py:140 +msgid "Long text, no length limit" +msgstr "" + +#: common/drf/renders/base.py:142 +msgid "Number, min {} max {}" +msgstr "" + +#: common/drf/renders/base.py:153 +msgid "" +"Choices, format name(value), name is optional for human read, value is " +"requisite, options {}" +msgstr "" + +#: common/drf/renders/base.py:156 +msgid "Choices, options {}" +msgstr "" + +#: common/drf/renders/base.py:158 +msgid "Phone number, format +8612345678901" +msgstr "" + +#: common/drf/renders/base.py:160 +msgid "Label, format [\"key:value\"]" +msgstr "" + +#: common/drf/renders/base.py:162 +msgid "" +"Object, format name(id), name is optional for human read, id is requisite" +msgstr "" + +#: common/drf/renders/base.py:164 +msgid "Object, format id" +msgstr "" + +#: common/drf/renders/base.py:168 +msgid "" +"Objects, format [\"name(id)\", ...], name is optional for human read, id is " +"requisite" +msgstr "" + +#: common/drf/renders/base.py:170 +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "" + +#: common/drf/renders/base.py:172 +msgid "Objects, format [\"id\", ...]" +msgstr "" + +#: common/drf/renders/base.py:270 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -4776,7 +4854,7 @@ msgstr "" msgid "Can not delete virtual org" msgstr "" -#: orgs/serializers.py:10 perms/serializers/permission.py:37 +#: orgs/serializers.py:10 perms/serializers/permission.py:48 #: rbac/serializers/role.py:27 users/serializers/group.py:54 msgid "Users amount" msgstr "" @@ -4785,7 +4863,7 @@ msgstr "" msgid "User groups amount" msgstr "" -#: orgs/serializers.py:14 perms/serializers/permission.py:40 +#: orgs/serializers.py:14 perms/serializers/permission.py:51 msgid "Nodes amount" msgstr "" @@ -4902,11 +4980,21 @@ msgstr "" msgid "asset permissions of organization {}" msgstr "" -#: perms/serializers/permission.py:33 users/serializers/user.py:257 -msgid "Groups" +#: perms/serializers/permission.py:32 +msgid "" +"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " +"choices: @ALL, @SPEC, @USER, @ANON, @INPUT" msgstr "" #: perms/serializers/permission.py:38 +msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" +msgstr "" + +#: perms/serializers/permission.py:44 users/serializers/user.py:257 +msgid "Groups" +msgstr "" + +#: perms/serializers/permission.py:49 msgid "Groups amount" msgstr "" @@ -5483,9 +5571,9 @@ msgstr "" #: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " -"cache" +"effectively improve the speed of user authentication., 0 means no " +"cache
If the user OU structure has been adjusted, click Submit to clear " +"the user DN cache" msgstr "" #: settings/serializers/auth/ldap.py:97 @@ -6574,12 +6662,12 @@ msgstr "" msgid "Authentication success: {}" msgstr "" -#: settings/ws.py:203 +#: settings/ws.py:195 msgid "No LDAP user was found" msgstr "" -#: settings/ws.py:209 -msgid "Total {}, success {}, failure {}" +#: settings/ws.py:201 +msgid "Imported total: {} new: {}, failed: {} Organization: {}" msgstr "" #: templates/_csv_import_export.html:8 diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index 2122b2a80..5a4da3d87 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-06 10:29+0800\n" +"POT-Creation-Date: 2024-08-15 14:04+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -655,7 +655,7 @@ msgstr "トリガー方式" #: audits/models.py:92 audits/serializers.py:84 #: authentication/serializers/connect_token_secret.py:119 #: authentication/templates/authentication/_access_key_modal.html:34 -#: perms/serializers/permission.py:41 perms/serializers/permission.py:63 +#: perms/serializers/permission.py:52 perms/serializers/permission.py:74 #: tickets/serializers/ticket/ticket.py:21 msgid "Action" msgstr "アクション" @@ -702,7 +702,7 @@ msgstr "パスワードルール" #: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153 +#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153 #: assets/serializers/platform.py:273 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 @@ -854,7 +854,7 @@ msgid "Exist policy" msgstr "アカウントの存在ポリシー" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 -#: assets/models/platform.py:95 assets/serializers/asset/common.py:125 +#: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 #: settings/models.py:36 tickets/models/ticket/apply_application.py:13 @@ -866,7 +866,7 @@ msgstr "カテゴリ" #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 -#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155 +#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 @@ -907,7 +907,7 @@ msgstr "編集済み" #: assets/serializers/platform.py:176 assets/serializers/platform.py:208 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 -#: perms/serializers/permission.py:35 +#: perms/serializers/permission.py:46 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:83 msgid "Assets" @@ -929,7 +929,7 @@ msgstr "アカウントはすでに存在しています" #: accounts/serializers/account/account.py:458 #: accounts/serializers/account/base.py:93 #: accounts/serializers/account/template.py:72 -#: assets/serializers/asset/common.py:387 +#: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "特別情報" @@ -1064,7 +1064,7 @@ msgstr "" "ください。 " #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "ノード" @@ -1278,15 +1278,15 @@ msgstr "レビュー担当者" msgid "Active" msgstr "アクティブ" -#: acls/models/base.py:81 perms/serializers/permission.py:31 +#: acls/models/base.py:81 perms/serializers/permission.py:42 #: tickets/models/flow.py:23 users/models/preference.py:16 #: users/serializers/group.py:21 users/serializers/user.py:424 msgid "Users" msgstr "ユーザー" #: acls/models/base.py:98 assets/models/automations/base.py:17 -#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 -#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 +#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148 +#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55 #: perms/serializers/user_permission.py:75 rbac/tree.py:35 msgid "Accounts" msgstr "アカウント" @@ -1423,7 +1423,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:147 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "IP" @@ -1856,7 +1856,7 @@ msgstr "クラウド サービス" msgid "Port" msgstr "ポート" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150 +#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "アドレス" @@ -1872,7 +1872,7 @@ msgstr "プラットフォーム" msgid "Zone" msgstr "ゾーン" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "資産ハードウェア情報の収集" @@ -2218,38 +2218,58 @@ msgstr "" "プラットフォームタイプがスキップされた資産に合致しない、資産内の一括更新プ" "ラットフォーム" -#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:36 +msgid "Protocols, format is [\"protocol/port\"]" +msgstr "" + +#: assets/serializers/asset/common.py:38 +msgid "Protocol, format is name/port" +msgstr "" + +#: assets/serializers/asset/common.py:107 +msgid "" +"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" +msgstr "" + +#: assets/serializers/asset/common.py:135 +msgid "" +"Node path, format [\"/org_name/node_name\"], if node not exist, will create " +"it" +msgstr "" + +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 -#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45 +#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388 #: xpack/plugins/cloud/serializers/task.py:35 msgid "Protocols" msgstr "プロトコル" -#: assets/serializers/asset/common.py:129 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:149 +#: assets/serializers/asset/common.py:171 msgid "Node path" msgstr "ノードパスです" -#: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:389 +#: assets/serializers/asset/common.py:168 +#: assets/serializers/asset/common.py:409 msgid "Auto info" msgstr "自動情報" -#: assets/serializers/asset/common.py:245 +#: assets/serializers/asset/common.py:265 msgid "Platform not exist" msgstr "プラットフォームが存在しません" -#: assets/serializers/asset/common.py:281 +#: assets/serializers/asset/common.py:301 msgid "port out of range (0-65535)" msgstr "ポート番号が範囲外です (0-65535)" -#: assets/serializers/asset/common.py:288 +#: assets/serializers/asset/common.py:308 msgid "Protocol is required: {}" msgstr "プロトコルが必要です: {}" -#: assets/serializers/asset/common.py:316 +#: assets/serializers/asset/common.py:336 msgid "Invalid data" msgstr "無効なデータ" @@ -2340,7 +2360,7 @@ msgstr "" "る際には、接続はゲートウェイを通してルーティングされます。" #: assets/serializers/domain.py:24 assets/serializers/platform.py:177 -#: orgs/serializers.py:13 perms/serializers/permission.py:39 +#: orgs/serializers.py:13 perms/serializers/permission.py:50 msgid "Assets amount" msgstr "資産数量" @@ -2708,7 +2728,7 @@ msgid "Resource" msgstr "リソース" #: audits/models.py:101 audits/models.py:147 audits/models.py:177 -#: terminal/serializers/command.py:75 +#: common/drf/renders/base.py:145 terminal/serializers/command.py:75 msgid "Datetime" msgstr "時間" @@ -3491,7 +3511,7 @@ msgid "Actions" msgstr "アクション" #: authentication/serializers/connection_token.py:42 -#: perms/serializers/permission.py:43 perms/serializers/permission.py:64 +#: perms/serializers/permission.py:54 perms/serializers/permission.py:75 #: users/serializers/user.py:127 users/serializers/user.py:273 msgid "Is expired" msgstr "期限切れです" @@ -3535,8 +3555,8 @@ msgstr "有効なssh公開鍵ではありません" msgid "Access IP" msgstr "Access IP" -#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 -#: perms/serializers/permission.py:65 users/serializers/user.py:128 +#: authentication/serializers/token.py:92 perms/serializers/permission.py:53 +#: perms/serializers/permission.py:76 users/serializers/user.py:128 #: users/serializers/user.py:270 msgid "Is valid" msgstr "有効です" @@ -4063,7 +4083,7 @@ msgstr "組織 ID" msgid "The file content overflowed (The maximum length `{}` bytes)" msgstr "ファイルの内容がオーバーフローしました (最大長 '{}' バイト)" -#: common/drf/parsers/base.py:199 +#: common/drf/parsers/base.py:207 msgid "Parse file error: {}" msgstr "解析ファイルエラー: {}" @@ -4071,7 +4091,67 @@ msgstr "解析ファイルエラー: {}" msgid "Invalid excel file" msgstr "無効 excel 書類" -#: common/drf/renders/base.py:208 +#: common/drf/renders/base.py:135 +msgid "Yes/No" +msgstr "" + +#: common/drf/renders/base.py:138 +msgid "Text, max length {}" +msgstr "" + +#: common/drf/renders/base.py:140 +msgid "Long text, no length limit" +msgstr "" + +#: common/drf/renders/base.py:142 +msgid "Number, min {} max {}" +msgstr "" + +#: common/drf/renders/base.py:153 +msgid "" +"Choices, format name(value), name is optional for human read, value is " +"requisite, options {}" +msgstr "" + +#: common/drf/renders/base.py:156 +#, fuzzy +#| msgid "Connect options" +msgid "Choices, options {}" +msgstr "接続アイテム" + +#: common/drf/renders/base.py:158 +msgid "Phone number, format +8612345678901" +msgstr "" + +#: common/drf/renders/base.py:160 +msgid "Label, format [\"key:value\"]" +msgstr "" + +#: common/drf/renders/base.py:162 +msgid "" +"Object, format name(id), name is optional for human read, id is requisite" +msgstr "" + +#: common/drf/renders/base.py:164 +msgid "Object, format id" +msgstr "" + +#: common/drf/renders/base.py:168 +msgid "" +"Objects, format [\"name(id)\", ...], name is optional for human read, id is " +"requisite" +msgstr "" + +#: common/drf/renders/base.py:170 +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "" + +#: common/drf/renders/base.py:172 +msgid "Objects, format [\"id\", ...]" +msgstr "" + +#: common/drf/renders/base.py:270 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -4906,7 +4986,7 @@ msgstr "参加しているすべての組織を表示できます" msgid "Can not delete virtual org" msgstr "仮想組織を削除できませんでした" -#: orgs/serializers.py:10 perms/serializers/permission.py:37 +#: orgs/serializers.py:10 perms/serializers/permission.py:48 #: rbac/serializers/role.py:27 users/serializers/group.py:54 msgid "Users amount" msgstr "ユーザー数" @@ -4915,7 +4995,7 @@ msgstr "ユーザー数" msgid "User groups amount" msgstr "ユーザーグループの数" -#: orgs/serializers.py:14 perms/serializers/permission.py:40 +#: orgs/serializers.py:14 perms/serializers/permission.py:51 msgid "Nodes amount" msgstr "ノード数" @@ -5032,11 +5112,21 @@ msgstr "資産権限の有効期限が近づいています" msgid "asset permissions of organization {}" msgstr "組織 {} の資産権限" -#: perms/serializers/permission.py:33 users/serializers/user.py:257 +#: perms/serializers/permission.py:32 +msgid "" +"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " +"choices: @ALL, @SPEC, @USER, @ANON, @INPUT" +msgstr "" + +#: perms/serializers/permission.py:38 +msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" +msgstr "" + +#: perms/serializers/permission.py:44 users/serializers/user.py:257 msgid "Groups" msgstr "ユーザーグループ" -#: perms/serializers/permission.py:38 +#: perms/serializers/permission.py:49 msgid "Groups amount" msgstr "ユーザーグループの数" @@ -5639,9 +5729,9 @@ msgstr "User DN キャッシュの有効期限 (秒)" #: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " -"cache" +"effectively improve the speed of user authentication., 0 means no " +"cache
If the user OU structure has been adjusted, click Submit to clear " +"the user DN cache" msgstr "" "ユーザーログイン認証時に取得したユーザー DN をキャッシュすることで、ユーザー" "認証の速度を効果的に向上させることができます
ユーザー OU 構造が調整された" @@ -6827,11 +6917,11 @@ msgstr "認証に失敗しました (不明): {}" msgid "Authentication success: {}" msgstr "認証成功: {}" -#: settings/ws.py:203 +#: settings/ws.py:198 msgid "No LDAP user was found" msgstr "LDAPユーザーが取得されませんでした" -#: settings/ws.py:209 +#: settings/ws.py:204 msgid "Total {}, success {}, failure {}" msgstr "合計 {},成功 {},失敗 {}" @@ -9977,3 +10067,8 @@ msgstr "エンタープライズプロフェッショナル版" #: xpack/plugins/license/models.py:86 msgid "Ultimate edition" msgstr "エンタープライズ・フラッグシップ・エディション" + +#, fuzzy +#~| msgid "Help text" +#~ msgid "#Help: " +#~ msgstr "ヘルプ" diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index ac1f04910..e3d0ea417 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-06 10:29+0800\n" +"POT-Creation-Date: 2024-09-03 15:26+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -654,7 +654,7 @@ msgstr "触发方式" #: audits/models.py:92 audits/serializers.py:84 #: authentication/serializers/connect_token_secret.py:119 #: authentication/templates/authentication/_access_key_modal.html:34 -#: perms/serializers/permission.py:41 perms/serializers/permission.py:63 +#: perms/serializers/permission.py:52 perms/serializers/permission.py:74 #: tickets/serializers/ticket/ticket.py:21 msgid "Action" msgstr "动作" @@ -701,7 +701,7 @@ msgstr "密码规则" #: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153 +#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153 #: assets/serializers/platform.py:273 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 @@ -852,7 +852,7 @@ msgid "Exist policy" msgstr "账号存在策略" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 -#: assets/models/platform.py:95 assets/serializers/asset/common.py:125 +#: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 #: settings/models.py:36 tickets/models/ticket/apply_application.py:13 @@ -864,7 +864,7 @@ msgstr "类别" #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 -#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155 +#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 @@ -905,7 +905,7 @@ msgstr "已修改" #: assets/serializers/platform.py:176 assets/serializers/platform.py:208 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 -#: perms/serializers/permission.py:35 +#: perms/serializers/permission.py:46 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:83 msgid "Assets" @@ -927,7 +927,7 @@ msgstr "账号已存在" #: accounts/serializers/account/account.py:458 #: accounts/serializers/account/base.py:93 #: accounts/serializers/account/template.py:72 -#: assets/serializers/asset/common.py:387 +#: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "特殊信息" @@ -1061,7 +1061,7 @@ msgstr "" "CACHE_LOGIN_PASSWORD_ENABLED=true,重启服务才能开启" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "节点" @@ -1268,15 +1268,15 @@ msgstr "审批人" msgid "Active" msgstr "激活中" -#: acls/models/base.py:81 perms/serializers/permission.py:31 +#: acls/models/base.py:81 perms/serializers/permission.py:42 #: tickets/models/flow.py:23 users/models/preference.py:16 #: users/serializers/group.py:21 users/serializers/user.py:424 msgid "Users" msgstr "用户" #: acls/models/base.py:98 assets/models/automations/base.py:17 -#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 -#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 +#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148 +#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55 #: perms/serializers/user_permission.py:75 rbac/tree.py:35 msgid "Accounts" msgstr "账号" @@ -1412,7 +1412,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:147 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "IP" @@ -1838,7 +1838,7 @@ msgstr "云服务" msgid "Port" msgstr "端口" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150 +#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "地址" @@ -1854,7 +1854,7 @@ msgstr "平台" msgid "Zone" msgstr "网域" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "收集资产硬件信息" @@ -2200,38 +2200,60 @@ msgid "" "type" msgstr "资产中批量更新平台,不符合平台类型跳过的资产" -#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:36 +msgid "Protocols, format is [\"protocol/port\"]" +msgstr "协议,格式为 [\"协议/端口\"]" + +#: assets/serializers/asset/common.py:38 +msgid "Protocol, format is name/port" +msgstr "协议,格式为 名称/端口" + +#: assets/serializers/asset/common.py:107 +msgid "" +"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" +msgstr "" +"账号,格式为 [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" + +#: assets/serializers/asset/common.py:135 +msgid "" +"Node path, format [\"/org_name/node_name\"], if node not exist, will create " +"it" +msgstr "节点路径,格式为 [\"/组织/节点名\"], 如果节点不存在,将创建它" + +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 -#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45 +#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388 #: xpack/plugins/cloud/serializers/task.py:35 msgid "Protocols" msgstr "协议组" -#: assets/serializers/asset/common.py:129 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:149 +#: assets/serializers/asset/common.py:171 msgid "Node path" msgstr "节点路径" -#: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:389 +#: assets/serializers/asset/common.py:168 +#: assets/serializers/asset/common.py:409 msgid "Auto info" msgstr "自动化信息" -#: assets/serializers/asset/common.py:245 +#: assets/serializers/asset/common.py:265 msgid "Platform not exist" msgstr "平台不存在" -#: assets/serializers/asset/common.py:281 +#: assets/serializers/asset/common.py:301 msgid "port out of range (0-65535)" msgstr "端口超出范围 (0-65535)" -#: assets/serializers/asset/common.py:288 +#: assets/serializers/asset/common.py:308 msgid "Protocol is required: {}" msgstr "协议是必填的: {}" -#: assets/serializers/asset/common.py:316 +#: assets/serializers/asset/common.py:336 msgid "Invalid data" msgstr "无效的数据" @@ -2320,7 +2342,7 @@ msgid "" msgstr "网关是网域的网络代理,当连接网域内的资产时,连接将通过网关进行路由。" #: assets/serializers/domain.py:24 assets/serializers/platform.py:177 -#: orgs/serializers.py:13 perms/serializers/permission.py:39 +#: orgs/serializers.py:13 perms/serializers/permission.py:50 msgid "Assets amount" msgstr "资产数量" @@ -2680,7 +2702,7 @@ msgid "Resource" msgstr "资源" #: audits/models.py:101 audits/models.py:147 audits/models.py:177 -#: terminal/serializers/command.py:75 +#: common/drf/renders/base.py:145 terminal/serializers/command.py:75 msgid "Datetime" msgstr "日期" @@ -3448,7 +3470,7 @@ msgid "Actions" msgstr "动作" #: authentication/serializers/connection_token.py:42 -#: perms/serializers/permission.py:43 perms/serializers/permission.py:64 +#: perms/serializers/permission.py:54 perms/serializers/permission.py:75 #: users/serializers/user.py:127 users/serializers/user.py:273 msgid "Is expired" msgstr "已过期" @@ -3490,8 +3512,8 @@ msgstr "SSH密钥不合法" msgid "Access IP" msgstr "IP 白名单" -#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 -#: perms/serializers/permission.py:65 users/serializers/user.py:128 +#: authentication/serializers/token.py:92 perms/serializers/permission.py:53 +#: perms/serializers/permission.py:76 users/serializers/user.py:128 #: users/serializers/user.py:270 msgid "Is valid" msgstr "是否有效" @@ -4005,7 +4027,7 @@ msgstr "组织 ID" msgid "The file content overflowed (The maximum length `{}` bytes)" msgstr "文件内容太大 (最大长度 `{}` 字节)" -#: common/drf/parsers/base.py:199 +#: common/drf/parsers/base.py:207 msgid "Parse file error: {}" msgstr "解析文件错误: {}" @@ -4013,7 +4035,66 @@ msgstr "解析文件错误: {}" msgid "Invalid excel file" msgstr "无效的 excel 文件" -#: common/drf/renders/base.py:208 +#: common/drf/renders/base.py:135 +msgid "Yes/No" +msgstr "" + +#: common/drf/renders/base.py:138 +msgid "Text, max length {}" +msgstr "文本,最大长度 {}" + +#: common/drf/renders/base.py:140 +msgid "Long text, no length limit" +msgstr "长文本,无长度限制" + +#: common/drf/renders/base.py:142 +msgid "Number, min {} max {}" +msgstr "数字,最小 {} 最大 {}" + +#: common/drf/renders/base.py:153 +msgid "" +"Choices, format name(value), name is optional for human read, value is " +"requisite, options {}" +msgstr "选项,格式: 名称(值),名称是可选的,方便阅读,值是必填的,可选项有 {}" + +#: common/drf/renders/base.py:156 +msgid "Choices, options {}" +msgstr "选项,可选项有 {}" + +#: common/drf/renders/base.py:158 +msgid "Phone number, format +8612345678901" +msgstr "手机号,格式 +8612345678901" + +#: common/drf/renders/base.py:160 +msgid "Label, format [\"key:value\"]" +msgstr "标签,格式: [\"键:值\"]" + +#: common/drf/renders/base.py:162 +msgid "" +"Object, format name(id), name is optional for human read, id is requisite" +msgstr "关联项,格式: 名称(id), 名称是可选的,方便阅读,id 是必填的" + +#: common/drf/renders/base.py:164 +msgid "Object, format id" +msgstr "关联项,格式是 id" + +#: common/drf/renders/base.py:168 +msgid "" +"Objects, format [\"name(id)\", ...], name is optional for human read, id is " +"requisite" +msgstr "" +"多关联项,格式: [\"名称(id)\", ...], 名称是可选的,方便阅读,id 是必填的" + +#: common/drf/renders/base.py:170 +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "标签,格式: [\"键:值\", ...], 如果标签不存在,将创建它" + +#: common/drf/renders/base.py:172 +msgid "Objects, format [\"id\", ...]" +msgstr "多关联项,格式是 [\"id\", ...]" + +#: common/drf/renders/base.py:270 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -4835,7 +4916,7 @@ msgstr "可以查看所有加入的组织" msgid "Can not delete virtual org" msgstr "无法删除虚拟组织" -#: orgs/serializers.py:10 perms/serializers/permission.py:37 +#: orgs/serializers.py:10 perms/serializers/permission.py:48 #: rbac/serializers/role.py:27 users/serializers/group.py:54 msgid "Users amount" msgstr "用户数量" @@ -4844,7 +4925,7 @@ msgstr "用户数量" msgid "User groups amount" msgstr "用户组数量" -#: orgs/serializers.py:14 perms/serializers/permission.py:40 +#: orgs/serializers.py:14 perms/serializers/permission.py:51 msgid "Nodes amount" msgstr "节点数量" @@ -4961,11 +5042,21 @@ msgstr "资产授权规则将要过期" msgid "asset permissions of organization {}" msgstr "组织 ({}) 的资产授权" -#: perms/serializers/permission.py:33 users/serializers/user.py:257 +#: perms/serializers/permission.py:32 +msgid "" +"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " +"choices: @ALL, @SPEC, @USER, @ANON, @INPUT" +msgstr "账号,格式 [\"@虚拟账号\", \"root\", \"%模版id\"], 虚拟选项: @ALL, @SPEC, @USER, @ANON, @INPUT" + +#: perms/serializers/permission.py:38 +msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" +msgstr "协议,格式为 [\"ssh\", \"rdp\", \"vnc\"] 或 [\"all\"]" + +#: perms/serializers/permission.py:44 users/serializers/user.py:257 msgid "Groups" msgstr "用户组" -#: perms/serializers/permission.py:38 +#: perms/serializers/permission.py:49 msgid "Groups amount" msgstr "用户组数量" @@ -5560,9 +5651,9 @@ msgstr "User DN 缓存超时时间 (秒)" #: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " -"cache" +"effectively improve the speed of user authentication., 0 means no " +"cache
If the user OU structure has been adjusted, click Submit to clear " +"the user DN cache" msgstr "" "对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度
如果" "用户 OU 架构有调整,点击提交即可清除用户 DN 缓存" @@ -6696,11 +6787,11 @@ msgstr "认证失败: (未知): {}" msgid "Authentication success: {}" msgstr "认证成功: {}" -#: settings/ws.py:203 +#: settings/ws.py:198 msgid "No LDAP user was found" msgstr "没有获取到 LDAP 用户" -#: settings/ws.py:209 +#: settings/ws.py:204 msgid "Total {}, success {}, failure {}" msgstr "总共 {},成功 {},失败 {}" @@ -9792,3 +9883,9 @@ msgstr "企业专业版" #: xpack/plugins/license/models.py:86 msgid "Ultimate edition" msgstr "企业旗舰版" + +#~ msgid "None" +#~ msgstr "无" + +#~ msgid "Yes,No" +#~ msgstr "Yes,No" diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index 5a9357fda..f7eab1398 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-06 10:29+0800\n" +"POT-Creation-Date: 2024-08-15 14:04+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -656,7 +656,7 @@ msgstr "觸發方式" #: audits/models.py:92 audits/serializers.py:84 #: authentication/serializers/connect_token_secret.py:119 #: authentication/templates/authentication/_access_key_modal.html:34 -#: perms/serializers/permission.py:41 perms/serializers/permission.py:63 +#: perms/serializers/permission.py:52 perms/serializers/permission.py:74 #: tickets/serializers/ticket/ticket.py:21 msgid "Action" msgstr "動作" @@ -703,7 +703,7 @@ msgstr "密碼規則" #: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 #: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/platform.py:15 assets/models/platform.py:94 -#: assets/serializers/asset/common.py:149 assets/serializers/platform.py:153 +#: assets/serializers/asset/common.py:169 assets/serializers/platform.py:153 #: assets/serializers/platform.py:273 #: authentication/backends/passkey/models.py:10 #: authentication/models/ssh_key.py:12 @@ -854,7 +854,7 @@ msgid "Exist policy" msgstr "帳號存在策略" #: accounts/serializers/account/account.py:206 assets/models/label.py:21 -#: assets/models/platform.py:95 assets/serializers/asset/common.py:125 +#: assets/models/platform.py:95 assets/serializers/asset/common.py:145 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 #: settings/models.py:36 tickets/models/ticket/apply_application.py:13 @@ -866,7 +866,7 @@ msgstr "類別" #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: assets/models/cmd_filter.py:74 assets/models/platform.py:96 -#: assets/serializers/asset/common.py:126 assets/serializers/platform.py:155 +#: assets/serializers/asset/common.py:146 assets/serializers/platform.py:155 #: assets/serializers/platform.py:167 audits/serializers.py:53 #: audits/serializers.py:170 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 @@ -907,7 +907,7 @@ msgstr "已修改" #: assets/serializers/platform.py:176 assets/serializers/platform.py:208 #: authentication/api/connection_token.py:410 ops/models/base.py:17 #: ops/models/job.py:152 ops/serializers/job.py:19 -#: perms/serializers/permission.py:35 +#: perms/serializers/permission.py:46 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 #: xpack/plugins/cloud/manager.py:83 msgid "Assets" @@ -929,7 +929,7 @@ msgstr "帳號已存在" #: accounts/serializers/account/account.py:458 #: accounts/serializers/account/base.py:93 #: accounts/serializers/account/template.py:72 -#: assets/serializers/asset/common.py:387 +#: assets/serializers/asset/common.py:407 msgid "Spec info" msgstr "特殊資訊" @@ -1063,7 +1063,7 @@ msgstr "" "CACHE_LOGIN_PASSWORD_ENABLED=true,重啟服務才能開啟" #: accounts/serializers/automations/base.py:23 -#: assets/models/asset/common.py:169 assets/serializers/asset/common.py:152 +#: assets/models/asset/common.py:164 assets/serializers/asset/common.py:152 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36 msgid "Nodes" msgstr "節點" @@ -1269,15 +1269,15 @@ msgstr "審批人" msgid "Active" msgstr "啟用中" -#: acls/models/base.py:81 perms/serializers/permission.py:31 +#: acls/models/base.py:81 perms/serializers/permission.py:42 #: tickets/models/flow.py:23 users/models/preference.py:16 #: users/serializers/group.py:21 users/serializers/user.py:424 msgid "Users" msgstr "用戶管理" #: acls/models/base.py:98 assets/models/automations/base.py:17 -#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 -#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 +#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148 +#: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55 #: perms/serializers/user_permission.py:75 rbac/tree.py:35 msgid "Accounts" msgstr "帳號管理" @@ -1413,7 +1413,7 @@ msgstr "" #: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_public_key_success.html:8 -#: xpack/plugins/cloud/models.py:390 +#: common/drf/renders/base.py:147 xpack/plugins/cloud/models.py:390 msgid "IP" msgstr "IP" @@ -1839,7 +1839,7 @@ msgstr "雲服務" msgid "Port" msgstr "埠" -#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:150 +#: assets/models/asset/common.py:160 assets/serializers/asset/common.py:170 #: settings/serializers/terminal.py:10 msgid "Address" msgstr "地址" @@ -1855,7 +1855,7 @@ msgstr "系統平台" msgid "Zone" msgstr "網域" -#: assets/models/asset/common.py:172 assets/serializers/asset/common.py:388 +#: assets/models/asset/common.py:166 assets/serializers/asset/common.py:388 #: assets/serializers/asset/host.py:11 msgid "Gathered info" msgstr "收集資產硬體資訊" @@ -2201,38 +2201,58 @@ msgid "" "type" msgstr "資產中批次更新平台,不符合平台類型跳過的資產" -#: assets/serializers/asset/common.py:127 assets/serializers/platform.py:169 +#: assets/serializers/asset/common.py:36 +msgid "Protocols, format is [\"protocol/port\"]" +msgstr "" + +#: assets/serializers/asset/common.py:38 +msgid "Protocol, format is name/port" +msgstr "" + +#: assets/serializers/asset/common.py:107 +msgid "" +"Accounts, format [{\"name\": \"x\", \"username\": \"x\", \"secret\": \"x\", " +"\"secret_type\": \"password\"}]" +msgstr "" + +#: assets/serializers/asset/common.py:135 +msgid "" +"Node path, format [\"/org_name/node_name\"], if node not exist, will create " +"it" +msgstr "" + +#: assets/serializers/asset/common.py:147 assets/serializers/platform.py:169 #: authentication/serializers/connect_token_secret.py:30 #: authentication/serializers/connect_token_secret.py:75 -#: perms/models/asset_permission.py:76 perms/serializers/permission.py:45 +#: perms/models/asset_permission.py:76 perms/serializers/permission.py:56 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388 #: xpack/plugins/cloud/serializers/task.py:35 msgid "Protocols" msgstr "協議組" -#: assets/serializers/asset/common.py:129 -#: assets/serializers/asset/common.py:151 +#: assets/serializers/asset/common.py:149 +#: assets/serializers/asset/common.py:171 msgid "Node path" msgstr "節點路徑" -#: assets/serializers/asset/common.py:148 -#: assets/serializers/asset/common.py:389 +#: assets/serializers/asset/common.py:168 +#: assets/serializers/asset/common.py:409 msgid "Auto info" msgstr "自動化資訊" -#: assets/serializers/asset/common.py:245 +#: assets/serializers/asset/common.py:265 msgid "Platform not exist" msgstr "平台不存在" -#: assets/serializers/asset/common.py:281 +#: assets/serializers/asset/common.py:301 msgid "port out of range (0-65535)" msgstr "埠超出範圍 (0-65535)" -#: assets/serializers/asset/common.py:288 +#: assets/serializers/asset/common.py:308 msgid "Protocol is required: {}" msgstr "協議是必填的: {}" -#: assets/serializers/asset/common.py:316 +#: assets/serializers/asset/common.py:336 msgid "Invalid data" msgstr "無效的數據" @@ -2321,7 +2341,7 @@ msgid "" msgstr "網關是網域的網路代理,當連接網域內的資產時,連接將由網關進行路由。" #: assets/serializers/domain.py:24 assets/serializers/platform.py:177 -#: orgs/serializers.py:13 perms/serializers/permission.py:39 +#: orgs/serializers.py:13 perms/serializers/permission.py:50 msgid "Assets amount" msgstr "資產數量" @@ -2681,7 +2701,7 @@ msgid "Resource" msgstr "資源" #: audits/models.py:101 audits/models.py:147 audits/models.py:177 -#: terminal/serializers/command.py:75 +#: common/drf/renders/base.py:145 terminal/serializers/command.py:75 msgid "Datetime" msgstr "日期" @@ -3449,7 +3469,7 @@ msgid "Actions" msgstr "動作" #: authentication/serializers/connection_token.py:42 -#: perms/serializers/permission.py:43 perms/serializers/permission.py:64 +#: perms/serializers/permission.py:54 perms/serializers/permission.py:75 #: users/serializers/user.py:127 users/serializers/user.py:273 msgid "Is expired" msgstr "已過期" @@ -3491,8 +3511,8 @@ msgstr "SSH金鑰不合法" msgid "Access IP" msgstr "IP 白名單" -#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 -#: perms/serializers/permission.py:65 users/serializers/user.py:128 +#: authentication/serializers/token.py:92 perms/serializers/permission.py:53 +#: perms/serializers/permission.py:76 users/serializers/user.py:128 #: users/serializers/user.py:270 msgid "Is valid" msgstr "是否有效" @@ -4006,7 +4026,7 @@ msgstr "組織 ID" msgid "The file content overflowed (The maximum length `{}` bytes)" msgstr "文件內容太大 (最大長度 `{}` 位元組)" -#: common/drf/parsers/base.py:199 +#: common/drf/parsers/base.py:207 msgid "Parse file error: {}" msgstr "解析文件錯誤: {}" @@ -4014,7 +4034,67 @@ msgstr "解析文件錯誤: {}" msgid "Invalid excel file" msgstr "無效的 excel 文件" -#: common/drf/renders/base.py:208 +#: common/drf/renders/base.py:135 +msgid "Yes/No" +msgstr "" + +#: common/drf/renders/base.py:138 +msgid "Text, max length {}" +msgstr "" + +#: common/drf/renders/base.py:140 +msgid "Long text, no length limit" +msgstr "" + +#: common/drf/renders/base.py:142 +msgid "Number, min {} max {}" +msgstr "" + +#: common/drf/renders/base.py:153 +msgid "" +"Choices, format name(value), name is optional for human read, value is " +"requisite, options {}" +msgstr "" + +#: common/drf/renders/base.py:156 +#, fuzzy +#| msgid "Connect options" +msgid "Choices, options {}" +msgstr "連接項" + +#: common/drf/renders/base.py:158 +msgid "Phone number, format +8612345678901" +msgstr "" + +#: common/drf/renders/base.py:160 +msgid "Label, format [\"key:value\"]" +msgstr "" + +#: common/drf/renders/base.py:162 +msgid "" +"Object, format name(id), name is optional for human read, id is requisite" +msgstr "" + +#: common/drf/renders/base.py:164 +msgid "Object, format id" +msgstr "" + +#: common/drf/renders/base.py:168 +msgid "" +"Objects, format [\"name(id)\", ...], name is optional for human read, id is " +"requisite" +msgstr "" + +#: common/drf/renders/base.py:170 +msgid "" +"Labels, format [\"key:value\", ...], if label not exists, will create it" +msgstr "" + +#: common/drf/renders/base.py:172 +msgid "Objects, format [\"id\", ...]" +msgstr "" + +#: common/drf/renders/base.py:270 msgid "" "{} - The encryption password has not been set - please go to personal " "information -> file encryption password to set the encryption password" @@ -4837,7 +4917,7 @@ msgstr "可以查看所有加入的組織" msgid "Can not delete virtual org" msgstr "無法刪除虛擬組織" -#: orgs/serializers.py:10 perms/serializers/permission.py:37 +#: orgs/serializers.py:10 perms/serializers/permission.py:48 #: rbac/serializers/role.py:27 users/serializers/group.py:54 msgid "Users amount" msgstr "用戶數量" @@ -4846,7 +4926,7 @@ msgstr "用戶數量" msgid "User groups amount" msgstr "用戶組數量" -#: orgs/serializers.py:14 perms/serializers/permission.py:40 +#: orgs/serializers.py:14 perms/serializers/permission.py:51 msgid "Nodes amount" msgstr "節點數量" @@ -4963,11 +5043,21 @@ msgstr "資產授權規則將要過期" msgid "asset permissions of organization {}" msgstr "組織 ({}) 的資產授權" -#: perms/serializers/permission.py:33 users/serializers/user.py:257 +#: perms/serializers/permission.py:32 +msgid "" +"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual " +"choices: @ALL, @SPEC, @USER, @ANON, @INPUT" +msgstr "" + +#: perms/serializers/permission.py:38 +msgid "Protocols, format [\"ssh\", \"rdp\", \"vnc\"] or [\"all\"]" +msgstr "" + +#: perms/serializers/permission.py:44 users/serializers/user.py:257 msgid "Groups" msgstr "使用者群組" -#: perms/serializers/permission.py:38 +#: perms/serializers/permission.py:49 msgid "Groups amount" msgstr "使用者組數量" @@ -5562,9 +5652,9 @@ msgstr "快取逾時時間 (秒)" #: settings/serializers/auth/ldap.py:91 msgid "" "Caching the User DN obtained during user login authentication can " -"effectivelyimprove the speed of user authentication., 0 means no cache
If " -"the user OU structure has been adjusted, click Submit to clear the user DN " -"cache" +"effectively improve the speed of user authentication., 0 means no " +"cache
If the user OU structure has been adjusted, click Submit to clear " +"the user DN cache" msgstr "" "對於使用者登錄認證時查詢的使用者 DN 進行快取,可以有效提高使用者認證的速度" "
如果使用者 OU 架構已調整,請點擊提交以清除使用者 DN 快取" @@ -6698,11 +6788,11 @@ msgstr "認證失敗: (未知): {}" msgid "Authentication success: {}" msgstr "認證成功: {}" -#: settings/ws.py:203 +#: settings/ws.py:198 msgid "No LDAP user was found" msgstr "沒有取得到 LDAP 用戶" -#: settings/ws.py:209 +#: settings/ws.py:204 msgid "Total {}, success {}, failure {}" msgstr "總共 {},成功 {},失敗 {}" @@ -9807,3 +9897,8 @@ msgstr "企業專業版" #: xpack/plugins/license/models.py:86 msgid "Ultimate edition" msgstr "企業旗艦版" + +#, fuzzy +#~| msgid "Help text" +#~ msgid "#Help: " +#~ msgstr "幫助" diff --git a/apps/orgs/mixins/serializers.py b/apps/orgs/mixins/serializers.py index 558dac282..5f60c1318 100644 --- a/apps/orgs/mixins/serializers.py +++ b/apps/orgs/mixins/serializers.py @@ -23,7 +23,7 @@ class OrgResourceSerializerMixin(serializers.Serializer): 但是coco需要资产的org_id字段,所以修改为CharField类型 """ org_id = serializers.ReadOnlyField(default=get_current_org_id_for_serializer, label=_("Organization")) - org_name = serializers.ReadOnlyField(label=_("Org name")) + org_name = serializers.CharField(label=_("Org name"), read_only=True) add_org_fields = True def get_validators(self): diff --git a/apps/perms/serializers/permission.py b/apps/perms/serializers/permission.py index 38a32a29d..de0421e66 100644 --- a/apps/perms/serializers/permission.py +++ b/apps/perms/serializers/permission.py @@ -27,6 +27,17 @@ class ActionChoicesField(BitChoicesField): return data +class PermAccountsSerializer(serializers.ListField): + def get_render_help_text(self): + return _('Accounts, format ["@virtual", "root", "%template_id"], ' + 'virtual choices: @ALL, @SPEC, @USER, @ANON, @INPUT') + + +class PermProtocolsSerializer(serializers.ListField): + def get_render_help_text(self): + return _('Protocols, format ["ssh", "rdp", "vnc"] or ["all"]') + + class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer): users = ObjectRelatedField(queryset=User.objects, many=True, required=False, label=_('Users')) user_groups = ObjectRelatedField( @@ -41,8 +52,8 @@ class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSeriali actions = ActionChoicesField(required=False, allow_null=True, label=_("Action")) is_valid = serializers.BooleanField(read_only=True, label=_("Is valid")) is_expired = serializers.BooleanField(read_only=True, label=_("Is expired")) - accounts = serializers.ListField(label=_("Accounts"), required=False) - protocols = serializers.ListField(label=_("Protocols"), required=False) + accounts = PermAccountsSerializer(label=_("Accounts"), required=False) + protocols = PermProtocolsSerializer(label=_("Protocols"), required=False) template_accounts = AccountTemplate.objects.none() diff --git a/apps/settings/serializers/auth/ldap.py b/apps/settings/serializers/auth/ldap.py index c835cf011..be022a659 100644 --- a/apps/settings/serializers/auth/ldap.py +++ b/apps/settings/serializers/auth/ldap.py @@ -88,7 +88,7 @@ class LDAPSettingSerializer(serializers.Serializer): default=3600 * 24 * 30, required=False, label=_('User DN cache timeout (s)'), help_text=_( - 'Caching the User DN obtained during user login authentication can effectively' + 'Caching the User DN obtained during user login authentication can effectively ' 'improve the speed of user authentication., 0 means no cache
' 'If the user OU structure has been adjusted, click Submit to clear the user DN cache' )