perf: finish this feat (#14079)

* perf: basic finished

* perf: finish this feat

* perf: add datetime demo

---------

Co-authored-by: ibuler <ibuler@qq.com>
pull/14106/head^2
fit2bot 2024-09-09 11:26:24 +08:00 committed by GitHub
parent cf1dc79c68
commit 763fe778d5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 660 additions and 178 deletions

View File

@ -31,6 +31,12 @@ __all__ = [
class AssetProtocolsSerializer(serializers.ModelSerializer): class AssetProtocolsSerializer(serializers.ModelSerializer):
port = serializers.IntegerField(required=False, allow_null=True, max_value=65535, min_value=0) 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): def to_file_representation(self, data):
return '{name}/{port}'.format(**data) return '{name}/{port}'.format(**data)
@ -97,6 +103,9 @@ class AssetAccountSerializer(AccountSerializer):
attrs = super().validate(attrs) attrs = super().validate(attrs)
return self.set_secret(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): class Meta(AccountSerializer.Meta):
fields = [ fields = [
f for f in 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): class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, WritableNestedModelSerializer):
category = LabeledChoiceField(choices=Category.choices, read_only=True, label=_('Category')) category = LabeledChoiceField(choices=Category.choices, read_only=True, label=_('Category'))
type = LabeledChoiceField(choices=AllTypes.choices(), read_only=True, label=_('Type')) type = LabeledChoiceField(choices=AllTypes.choices(), read_only=True, label=_('Type'))
protocols = AssetProtocolsSerializer(many=True, required=False, label=_('Protocols'), default=()) protocols = AssetProtocolsSerializer(many=True, required=False, label=_('Protocols'), default=())
accounts = AssetAccountSerializer(many=True, required=False, allow_null=True, write_only=True, label=_('Accounts')) 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 _accounts = None
class Meta: class Meta:

View File

@ -38,9 +38,15 @@ class SuggestionMixin:
class RenderToJsonMixin: class RenderToJsonMixin:
@action(methods=[POST, PUT], detail=False, url_path='render-to-json') @action(methods=[POST, PUT], detail=False, url_path='render-to-json')
def render_to_json(self, request: Request, *args, **kwargs): 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 = { data = {
'title': (), 'title': (),
'data': request.data, 'data': rows,
} }
jms_context = getattr(request, 'jms_context', {}) jms_context = getattr(request, 'jms_context', {})

View File

@ -119,8 +119,6 @@ class BaseFileParser(BaseParser):
value = field.to_file_internal_value(value) value = field.to_file_internal_value(value)
elif isinstance(field, serializers.BooleanField): elif isinstance(field, serializers.BooleanField):
value = value.lower() in ['true', '1', 'yes'] value = value.lower() in ['true', '1', 'yes']
elif isinstance(field, serializers.ChoiceField):
value = value
elif isinstance(field, ObjectRelatedField): elif isinstance(field, ObjectRelatedField):
if field.many: if field.many:
value = [self.id_name_to_obj(v) for v in value] value = [self.id_name_to_obj(v) for v in value]
@ -164,6 +162,15 @@ class BaseFileParser(BaseParser):
data.append(row_data) data.append(row_data)
return 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): def parse(self, stream, media_type=None, parser_context=None):
assert parser_context is not None, '`parser_context` should not be `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 = {}
request.jms_context['column_title_field_pairs'] = column_title_field_pairs 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) data = self.generate_data(field_names, rows)
return data return data
except Exception as e: except Exception as e:

View File

@ -5,12 +5,13 @@ from datetime import datetime
import pyzipper import pyzipper
from django.conf import settings from django.conf import settings
from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from rest_framework.renderers import BaseRenderer from rest_framework.renderers import BaseRenderer
from rest_framework.utils import encoders, json 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 from common.utils import get_logger
logger = get_logger(__file__) logger = get_logger(__file__)
@ -38,8 +39,10 @@ class BaseFileRenderer(BaseRenderer):
filename_prefix = serializer.Meta.model.__name__.lower() filename_prefix = serializer.Meta.model.__name__.lower()
else: else:
filename_prefix = 'download' filename_prefix = 'download'
now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") suffix = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
filename = "{}_{}.{}".format(filename_prefix, now, self.format) if self.template == 'import':
suffix = 'template'
filename = "{}_{}.{}".format(filename_prefix, suffix, self.format)
disposition = 'attachment; filename="{}"'.format(filename) disposition = 'attachment; filename="{}"'.format(filename)
response['Content-Disposition'] = disposition response['Content-Disposition'] = disposition
@ -105,10 +108,10 @@ class BaseFileRenderer(BaseRenderer):
value = field.to_file_representation(value) value = field.to_file_representation(value)
elif isinstance(value, bool): elif isinstance(value, bool):
value = 'Yes' if value else 'No' value = 'Yes' if value else 'No'
elif isinstance(field, LabeledChoiceField): elif isinstance(field, common_fields.LabeledChoiceField):
value = value or {} value = value or {}
value = '{}({})'.format(value.get('label'), value.get('value')) value = '{}({})'.format(value.get('label'), value.get('value'))
elif isinstance(field, ObjectRelatedField): elif isinstance(field, common_fields.ObjectRelatedField):
if field.many: if field.many:
value = [self.to_id_name(v) for v in value] value = [self.to_id_name(v) for v in value]
else: else:
@ -126,6 +129,53 @@ class BaseFileRenderer(BaseRenderer):
value = json.dumps(value, cls=encoders.JSONEncoder, ensure_ascii=False) value = json.dumps(value, cls=encoders.JSONEncoder, ensure_ascii=False)
return str(value) 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): def generate_rows(self, data, render_fields):
for item in data: for item in data:
row = [] row = []
@ -135,6 +185,17 @@ class BaseFileRenderer(BaseRenderer):
row.append(value) row.append(value)
yield row 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 @abc.abstractmethod
def initial_writer(self): def initial_writer(self):
raise NotImplementedError raise NotImplementedError
@ -184,6 +245,7 @@ class BaseFileRenderer(BaseRenderer):
rows = self.generate_rows(data, rendered_fields) rows = self.generate_rows(data, rendered_fields)
self.initial_writer() self.initial_writer()
self.write_column_titles(column_titles) self.write_column_titles(column_titles)
self.write_help_text_if_need()
self.write_rows(rows) self.write_rows(rows)
self.after_render() self.after_render()
value = self.get_rendered_value() value = self.get_rendered_value()

View File

@ -2,17 +2,17 @@
# #
import codecs import codecs
import unicodecsv import unicodecsv
from six import BytesIO from six import BytesIO
from .base import BaseFileRenderer from .base import BaseFileRenderer
from ..const import CSV_FILE_ESCAPE_CHARS from ..const import CSV_FILE_ESCAPE_CHARS
class CSVFileRenderer(BaseFileRenderer):
class CSVFileRenderer(BaseFileRenderer):
media_type = 'text/csv' media_type = 'text/csv'
format = 'csv' format = 'csv'
writer = None writer = None
buffer = None buffer = None

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -655,7 +655,7 @@ msgstr ""
#: audits/models.py:92 audits/serializers.py:84 #: audits/models.py:92 audits/serializers.py:84
#: authentication/serializers/connect_token_secret.py:119 #: authentication/serializers/connect_token_secret.py:119
#: authentication/templates/authentication/_access_key_modal.html:34 #: 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 #: tickets/serializers/ticket/ticket.py:21
msgid "Action" msgid "Action"
msgstr "" msgstr ""
@ -703,7 +703,7 @@ msgstr ""
#: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/domain.py:19 assets/models/label.py:18
#: assets/models/platform.py:15 assets/models/platform.py:94 #: 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:149 assets/serializers/platform.py:153
#: assets/serializers/platform.py:273 #: assets/serializers/platform.py:282
#: authentication/backends/passkey/models.py:10 #: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 #: authentication/models/ssh_key.py:12
#: authentication/serializers/connect_token_secret.py:113 #: authentication/serializers/connect_token_secret.py:113
@ -845,8 +845,8 @@ msgstr ""
#: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: 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:125
#: assets/serializers/cagegory.py:12 assets/serializers/platform.py:168 #: assets/serializers/cagegory.py:12 assets/serializers/platform.py:177
#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 #: assets/serializers/platform.py:283 perms/serializers/user_permission.py:26
#: settings/models.py:36 tickets/models/ticket/apply_application.py:13 #: settings/models.py:36 tickets/models/ticket/apply_application.py:13
#: users/models/preference.py:12 #: users/models/preference.py:12
msgid "Category" msgid "Category"
@ -857,7 +857,7 @@ msgstr ""
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20
#: assets/models/cmd_filter.py:74 assets/models/platform.py:96 #: 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: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 #: audits/serializers.py:170
#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 #: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150
#: perms/serializers/user_permission.py:27 terminal/models/applet/applet.py:40 #: 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 #: assets/serializers/platform.py:176 assets/serializers/platform.py:208
#: authentication/api/connection_token.py:410 ops/models/base.py:17 #: authentication/api/connection_token.py:410 ops/models/base.py:17
#: ops/models/job.py:152 ops/serializers/job.py:19 #: 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 #: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/cloud/manager.py:83 #: xpack/plugins/cloud/manager.py:83
msgid "Assets" msgid "Assets"
@ -919,7 +919,7 @@ msgstr ""
#: accounts/serializers/account/account.py:458 #: accounts/serializers/account/account.py:458
#: accounts/serializers/account/base.py:93 #: accounts/serializers/account/base.py:93
#: accounts/serializers/account/template.py:72 #: accounts/serializers/account/template.py:72
#: assets/serializers/asset/common.py:387 #: assets/serializers/asset/common.py:407
msgid "Spec info" msgid "Spec info"
msgstr "" msgstr ""
@ -1048,7 +1048,7 @@ msgid ""
msgstr "" msgstr ""
#: accounts/serializers/automations/base.py:23 #: 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 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36
msgid "Nodes" msgid "Nodes"
msgstr "" msgstr ""
@ -1252,15 +1252,15 @@ msgstr ""
msgid "Active" msgid "Active"
msgstr "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 #: tickets/models/flow.py:23 users/models/preference.py:16
#: users/serializers/group.py:21 users/serializers/user.py:424 #: users/serializers/group.py:21 users/serializers/user.py:424
msgid "Users" msgid "Users"
msgstr "" msgstr ""
#: acls/models/base.py:98 assets/models/automations/base.py:17 #: acls/models/base.py:98 assets/models/automations/base.py:17
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 #: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 #: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55
#: perms/serializers/user_permission.py:75 rbac/tree.py:35 #: perms/serializers/user_permission.py:75 rbac/tree.py:35
msgid "Accounts" msgid "Accounts"
msgstr "" msgstr ""
@ -1392,7 +1392,7 @@ msgstr ""
#: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_oauth_bind.html:12
#: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_password_success.html:8
#: authentication/templates/authentication/_msg_rest_public_key_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" msgid "IP"
msgstr "" msgstr ""
@ -1809,12 +1809,12 @@ msgstr ""
msgid "Port" msgid "Port"
msgstr "" 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 #: settings/serializers/terminal.py:10
msgid "Address" msgid "Address"
msgstr "" 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/backends/passkey/models.py:12
#: authentication/serializers/connect_token_secret.py:118 #: authentication/serializers/connect_token_secret.py:118
#: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385 #: perms/serializers/user_permission.py:25 xpack/plugins/cloud/models.py:385
@ -1825,7 +1825,7 @@ msgstr ""
msgid "Zone" msgid "Zone"
msgstr "" 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 #: assets/serializers/asset/host.py:11
msgid "Gathered info" msgid "Gathered info"
msgstr "" msgstr ""
@ -2169,38 +2169,58 @@ msgid ""
"type" "type"
msgstr "" 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:30
#: authentication/serializers/connect_token_secret.py:75 #: 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 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388
#: xpack/plugins/cloud/serializers/task.py:35 #: xpack/plugins/cloud/serializers/task.py:35
msgid "Protocols" msgid "Protocols"
msgstr "" msgstr ""
#: assets/serializers/asset/common.py:129 #: assets/serializers/asset/common.py:149
#: assets/serializers/asset/common.py:151 #: assets/serializers/asset/common.py:171
msgid "Node path" msgid "Node path"
msgstr "" msgstr ""
#: assets/serializers/asset/common.py:148 #: assets/serializers/asset/common.py:168
#: assets/serializers/asset/common.py:389 #: assets/serializers/asset/common.py:409
msgid "Auto info" msgid "Auto info"
msgstr "" msgstr ""
#: assets/serializers/asset/common.py:245 #: assets/serializers/asset/common.py:265
msgid "Platform not exist" msgid "Platform not exist"
msgstr "" msgstr ""
#: assets/serializers/asset/common.py:281 #: assets/serializers/asset/common.py:301
msgid "port out of range (0-65535)" msgid "port out of range (0-65535)"
msgstr "" msgstr ""
#: assets/serializers/asset/common.py:288 #: assets/serializers/asset/common.py:308
msgid "Protocol is required: {}" msgid "Protocol is required: {}"
msgstr "" msgstr ""
#: assets/serializers/asset/common.py:316 #: assets/serializers/asset/common.py:336
msgid "Invalid data" msgid "Invalid data"
msgstr "" msgstr ""
@ -2286,7 +2306,7 @@ msgid ""
"the zone, the connection is routed through the gateway." "the zone, the connection is routed through the gateway."
msgstr "" 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 #: orgs/serializers.py:13 perms/serializers/permission.py:39
msgid "Assets amount" msgid "Assets amount"
msgstr "" msgstr ""
@ -2645,7 +2665,7 @@ msgid "Resource"
msgstr "" msgstr ""
#: audits/models.py:101 audits/models.py:147 audits/models.py:177 #: 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" msgid "Datetime"
msgstr "" msgstr ""
@ -3402,7 +3422,7 @@ msgid "Actions"
msgstr "" msgstr ""
#: authentication/serializers/connection_token.py:42 #: 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 #: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired" msgid "Is expired"
msgstr "Expired" msgstr "Expired"
@ -3444,8 +3464,8 @@ msgstr ""
msgid "Access IP" msgid "Access IP"
msgstr "" msgstr ""
#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 #: authentication/serializers/token.py:92 perms/serializers/permission.py:53
#: perms/serializers/permission.py:65 users/serializers/user.py:128 #: perms/serializers/permission.py:76 users/serializers/user.py:128
#: users/serializers/user.py:270 #: users/serializers/user.py:270
msgid "Is valid" msgid "Is valid"
msgstr "Is Valid" msgstr "Is Valid"
@ -3953,7 +3973,7 @@ msgstr "Organization ID"
msgid "The file content overflowed (The maximum length `{}` bytes)" msgid "The file content overflowed (The maximum length `{}` bytes)"
msgstr "" msgstr ""
#: common/drf/parsers/base.py:199 #: common/drf/parsers/base.py:207
msgid "Parse file error: {}" msgid "Parse file error: {}"
msgstr "" msgstr ""
@ -3961,7 +3981,65 @@ msgstr ""
msgid "Invalid excel file" msgid "Invalid excel file"
msgstr "" 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 "" msgid ""
"{} - The encryption password has not been set - please go to personal " "{} - The encryption password has not been set - please go to personal "
"information -> file encryption password to set the encryption password" "information -> file encryption password to set the encryption password"
@ -4776,7 +4854,7 @@ msgstr ""
msgid "Can not delete virtual org" msgid "Can not delete virtual org"
msgstr "" 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 #: rbac/serializers/role.py:27 users/serializers/group.py:54
msgid "Users amount" msgid "Users amount"
msgstr "" msgstr ""
@ -4785,7 +4863,7 @@ msgstr ""
msgid "User groups amount" msgid "User groups amount"
msgstr "" msgstr ""
#: orgs/serializers.py:14 perms/serializers/permission.py:40 #: orgs/serializers.py:14 perms/serializers/permission.py:51
msgid "Nodes amount" msgid "Nodes amount"
msgstr "" msgstr ""
@ -4902,11 +4980,21 @@ msgstr ""
msgid "asset permissions of organization {}" msgid "asset permissions of organization {}"
msgstr "" msgstr ""
#: perms/serializers/permission.py:33 users/serializers/user.py:257 #: perms/serializers/permission.py:32
msgid "Groups" msgid ""
"Accounts, format [\"@virtual\", \"root\", \"%template_id\"], virtual "
"choices: @ALL, @SPEC, @USER, @ANON, @INPUT"
msgstr "" msgstr ""
#: perms/serializers/permission.py:38 #: 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" msgid "Groups amount"
msgstr "" msgstr ""
@ -5483,9 +5571,9 @@ msgstr ""
#: settings/serializers/auth/ldap.py:91 #: settings/serializers/auth/ldap.py:91
msgid "" msgid ""
"Caching the User DN obtained during user login authentication can " "Caching the User DN obtained during user login authentication can "
"effectivelyimprove the speed of user authentication., 0 means no cache<br>If " "effectively improve the speed of user authentication., 0 means no "
"the user OU structure has been adjusted, click Submit to clear the user DN " "cache<br>If the user OU structure has been adjusted, click Submit to clear "
"cache" "the user DN cache"
msgstr "" msgstr ""
#: settings/serializers/auth/ldap.py:97 #: settings/serializers/auth/ldap.py:97
@ -6574,12 +6662,12 @@ msgstr ""
msgid "Authentication success: {}" msgid "Authentication success: {}"
msgstr "" msgstr ""
#: settings/ws.py:203 #: settings/ws.py:195
msgid "No LDAP user was found" msgid "No LDAP user was found"
msgstr "" msgstr ""
#: settings/ws.py:209 #: settings/ws.py:201
msgid "Total {}, success {}, failure {}" msgid "Imported total: {} new: {}, failed: {} Organization: {}"
msgstr "" msgstr ""
#: templates/_csv_import_export.html:8 #: templates/_csv_import_export.html:8

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -655,7 +655,7 @@ msgstr "トリガー方式"
#: audits/models.py:92 audits/serializers.py:84 #: audits/models.py:92 audits/serializers.py:84
#: authentication/serializers/connect_token_secret.py:119 #: authentication/serializers/connect_token_secret.py:119
#: authentication/templates/authentication/_access_key_modal.html:34 #: 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 #: tickets/serializers/ticket/ticket.py:21
msgid "Action" msgid "Action"
msgstr "アクション" msgstr "アクション"
@ -702,7 +702,7 @@ msgstr "パスワードルール"
#: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 #: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21
#: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/domain.py:19 assets/models/label.py:18
#: assets/models/platform.py:15 assets/models/platform.py:94 #: 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 #: assets/serializers/platform.py:273
#: authentication/backends/passkey/models.py:10 #: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 #: authentication/models/ssh_key.py:12
@ -854,7 +854,7 @@ msgid "Exist policy"
msgstr "アカウントの存在ポリシー" msgstr "アカウントの存在ポリシー"
#: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: 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/cagegory.py:12 assets/serializers/platform.py:168
#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26
#: settings/models.py:36 tickets/models/ticket/apply_application.py:13 #: 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 #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20
#: assets/models/cmd_filter.py:74 assets/models/platform.py:96 #: 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 #: assets/serializers/platform.py:167 audits/serializers.py:53
#: audits/serializers.py:170 #: audits/serializers.py:170
#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 #: 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 #: assets/serializers/platform.py:176 assets/serializers/platform.py:208
#: authentication/api/connection_token.py:410 ops/models/base.py:17 #: authentication/api/connection_token.py:410 ops/models/base.py:17
#: ops/models/job.py:152 ops/serializers/job.py:19 #: 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 #: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/cloud/manager.py:83 #: xpack/plugins/cloud/manager.py:83
msgid "Assets" msgid "Assets"
@ -929,7 +929,7 @@ msgstr "アカウントはすでに存在しています"
#: accounts/serializers/account/account.py:458 #: accounts/serializers/account/account.py:458
#: accounts/serializers/account/base.py:93 #: accounts/serializers/account/base.py:93
#: accounts/serializers/account/template.py:72 #: accounts/serializers/account/template.py:72
#: assets/serializers/asset/common.py:387 #: assets/serializers/asset/common.py:407
msgid "Spec info" msgid "Spec info"
msgstr "特別情報" msgstr "特別情報"
@ -1064,7 +1064,7 @@ msgstr ""
"ください。 " "ください。 "
#: accounts/serializers/automations/base.py:23 #: 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 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36
msgid "Nodes" msgid "Nodes"
msgstr "ノード" msgstr "ノード"
@ -1278,15 +1278,15 @@ msgstr "レビュー担当者"
msgid "Active" msgid "Active"
msgstr "アクティブ" 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 #: tickets/models/flow.py:23 users/models/preference.py:16
#: users/serializers/group.py:21 users/serializers/user.py:424 #: users/serializers/group.py:21 users/serializers/user.py:424
msgid "Users" msgid "Users"
msgstr "ユーザー" msgstr "ユーザー"
#: acls/models/base.py:98 assets/models/automations/base.py:17 #: acls/models/base.py:98 assets/models/automations/base.py:17
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 #: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 #: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55
#: perms/serializers/user_permission.py:75 rbac/tree.py:35 #: perms/serializers/user_permission.py:75 rbac/tree.py:35
msgid "Accounts" msgid "Accounts"
msgstr "アカウント" msgstr "アカウント"
@ -1423,7 +1423,7 @@ msgstr ""
#: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_oauth_bind.html:12
#: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_password_success.html:8
#: authentication/templates/authentication/_msg_rest_public_key_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" msgid "IP"
msgstr "IP" msgstr "IP"
@ -1856,7 +1856,7 @@ msgstr "クラウド サービス"
msgid "Port" msgid "Port"
msgstr "ポート" 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 #: settings/serializers/terminal.py:10
msgid "Address" msgid "Address"
msgstr "アドレス" msgstr "アドレス"
@ -1872,7 +1872,7 @@ msgstr "プラットフォーム"
msgid "Zone" msgid "Zone"
msgstr "ゾーン" 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 #: assets/serializers/asset/host.py:11
msgid "Gathered info" msgid "Gathered info"
msgstr "資産ハードウェア情報の収集" 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:30
#: authentication/serializers/connect_token_secret.py:75 #: 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 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388
#: xpack/plugins/cloud/serializers/task.py:35 #: xpack/plugins/cloud/serializers/task.py:35
msgid "Protocols" msgid "Protocols"
msgstr "プロトコル" msgstr "プロトコル"
#: assets/serializers/asset/common.py:129 #: assets/serializers/asset/common.py:149
#: assets/serializers/asset/common.py:151 #: assets/serializers/asset/common.py:171
msgid "Node path" msgid "Node path"
msgstr "ノードパスです" msgstr "ノードパスです"
#: assets/serializers/asset/common.py:148 #: assets/serializers/asset/common.py:168
#: assets/serializers/asset/common.py:389 #: assets/serializers/asset/common.py:409
msgid "Auto info" msgid "Auto info"
msgstr "自動情報" msgstr "自動情報"
#: assets/serializers/asset/common.py:245 #: assets/serializers/asset/common.py:265
msgid "Platform not exist" msgid "Platform not exist"
msgstr "プラットフォームが存在しません" msgstr "プラットフォームが存在しません"
#: assets/serializers/asset/common.py:281 #: assets/serializers/asset/common.py:301
msgid "port out of range (0-65535)" msgid "port out of range (0-65535)"
msgstr "ポート番号が範囲外です (0-65535)" msgstr "ポート番号が範囲外です (0-65535)"
#: assets/serializers/asset/common.py:288 #: assets/serializers/asset/common.py:308
msgid "Protocol is required: {}" msgid "Protocol is required: {}"
msgstr "プロトコルが必要です: {}" msgstr "プロトコルが必要です: {}"
#: assets/serializers/asset/common.py:316 #: assets/serializers/asset/common.py:336
msgid "Invalid data" msgid "Invalid data"
msgstr "無効なデータ" msgstr "無効なデータ"
@ -2340,7 +2360,7 @@ msgstr ""
"る際には、接続はゲートウェイを通してルーティングされます。" "る際には、接続はゲートウェイを通してルーティングされます。"
#: assets/serializers/domain.py:24 assets/serializers/platform.py:177 #: 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" msgid "Assets amount"
msgstr "資産数量" msgstr "資産数量"
@ -2708,7 +2728,7 @@ msgid "Resource"
msgstr "リソース" msgstr "リソース"
#: audits/models.py:101 audits/models.py:147 audits/models.py:177 #: 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" msgid "Datetime"
msgstr "時間" msgstr "時間"
@ -3491,7 +3511,7 @@ msgid "Actions"
msgstr "アクション" msgstr "アクション"
#: authentication/serializers/connection_token.py:42 #: 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 #: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired" msgid "Is expired"
msgstr "期限切れです" msgstr "期限切れです"
@ -3535,8 +3555,8 @@ msgstr "有効なssh公開鍵ではありません"
msgid "Access IP" msgid "Access IP"
msgstr "Access IP" msgstr "Access IP"
#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 #: authentication/serializers/token.py:92 perms/serializers/permission.py:53
#: perms/serializers/permission.py:65 users/serializers/user.py:128 #: perms/serializers/permission.py:76 users/serializers/user.py:128
#: users/serializers/user.py:270 #: users/serializers/user.py:270
msgid "Is valid" msgid "Is valid"
msgstr "有効です" msgstr "有効です"
@ -4063,7 +4083,7 @@ msgstr "組織 ID"
msgid "The file content overflowed (The maximum length `{}` bytes)" msgid "The file content overflowed (The maximum length `{}` bytes)"
msgstr "ファイルの内容がオーバーフローしました (最大長 '{}' バイト)" msgstr "ファイルの内容がオーバーフローしました (最大長 '{}' バイト)"
#: common/drf/parsers/base.py:199 #: common/drf/parsers/base.py:207
msgid "Parse file error: {}" msgid "Parse file error: {}"
msgstr "解析ファイルエラー: {}" msgstr "解析ファイルエラー: {}"
@ -4071,7 +4091,67 @@ msgstr "解析ファイルエラー: {}"
msgid "Invalid excel file" msgid "Invalid excel file"
msgstr "無効 excel 書類" 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 "" msgid ""
"{} - The encryption password has not been set - please go to personal " "{} - The encryption password has not been set - please go to personal "
"information -> file encryption password to set the encryption password" "information -> file encryption password to set the encryption password"
@ -4906,7 +4986,7 @@ msgstr "参加しているすべての組織を表示できます"
msgid "Can not delete virtual org" msgid "Can not delete virtual org"
msgstr "仮想組織を削除できませんでした" 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 #: rbac/serializers/role.py:27 users/serializers/group.py:54
msgid "Users amount" msgid "Users amount"
msgstr "ユーザー数" msgstr "ユーザー数"
@ -4915,7 +4995,7 @@ msgstr "ユーザー数"
msgid "User groups amount" msgid "User groups amount"
msgstr "ユーザーグループの数" msgstr "ユーザーグループの数"
#: orgs/serializers.py:14 perms/serializers/permission.py:40 #: orgs/serializers.py:14 perms/serializers/permission.py:51
msgid "Nodes amount" msgid "Nodes amount"
msgstr "ノード数" msgstr "ノード数"
@ -5032,11 +5112,21 @@ msgstr "資産権限の有効期限が近づいています"
msgid "asset permissions of organization {}" msgid "asset permissions of organization {}"
msgstr "組織 {} の資産権限" 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" msgid "Groups"
msgstr "ユーザーグループ" msgstr "ユーザーグループ"
#: perms/serializers/permission.py:38 #: perms/serializers/permission.py:49
msgid "Groups amount" msgid "Groups amount"
msgstr "ユーザーグループの数" msgstr "ユーザーグループの数"
@ -5639,9 +5729,9 @@ msgstr "User DN キャッシュの有効期限 (秒)"
#: settings/serializers/auth/ldap.py:91 #: settings/serializers/auth/ldap.py:91
msgid "" msgid ""
"Caching the User DN obtained during user login authentication can " "Caching the User DN obtained during user login authentication can "
"effectivelyimprove the speed of user authentication., 0 means no cache<br>If " "effectively improve the speed of user authentication., 0 means no "
"the user OU structure has been adjusted, click Submit to clear the user DN " "cache<br>If the user OU structure has been adjusted, click Submit to clear "
"cache" "the user DN cache"
msgstr "" msgstr ""
"ユーザーログイン認証時に取得したユーザー DN をキャッシュすることで、ユーザー" "ユーザーログイン認証時に取得したユーザー DN をキャッシュすることで、ユーザー"
"認証の速度を効果的に向上させることができます<br>ユーザー OU 構造が調整された" "認証の速度を効果的に向上させることができます<br>ユーザー OU 構造が調整された"
@ -6827,11 +6917,11 @@ msgstr "認証に失敗しました (不明): {}"
msgid "Authentication success: {}" msgid "Authentication success: {}"
msgstr "認証成功: {}" msgstr "認証成功: {}"
#: settings/ws.py:203 #: settings/ws.py:198
msgid "No LDAP user was found" msgid "No LDAP user was found"
msgstr "LDAPユーザーが取得されませんでした" msgstr "LDAPユーザーが取得されませんでした"
#: settings/ws.py:209 #: settings/ws.py:204
msgid "Total {}, success {}, failure {}" msgid "Total {}, success {}, failure {}"
msgstr "合計 {},成功 {},失敗 {}" msgstr "合計 {},成功 {},失敗 {}"
@ -9977,3 +10067,8 @@ msgstr "エンタープライズプロフェッショナル版"
#: xpack/plugins/license/models.py:86 #: xpack/plugins/license/models.py:86
msgid "Ultimate edition" msgid "Ultimate edition"
msgstr "エンタープライズ・フラッグシップ・エディション" msgstr "エンタープライズ・フラッグシップ・エディション"
#, fuzzy
#~| msgid "Help text"
#~ msgid "#Help: "
#~ msgstr "ヘルプ"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n" "Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler <ibuler@qq.com>\n" "Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n" "Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -654,7 +654,7 @@ msgstr "触发方式"
#: audits/models.py:92 audits/serializers.py:84 #: audits/models.py:92 audits/serializers.py:84
#: authentication/serializers/connect_token_secret.py:119 #: authentication/serializers/connect_token_secret.py:119
#: authentication/templates/authentication/_access_key_modal.html:34 #: 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 #: tickets/serializers/ticket/ticket.py:21
msgid "Action" msgid "Action"
msgstr "动作" msgstr "动作"
@ -701,7 +701,7 @@ msgstr "密码规则"
#: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 #: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21
#: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/domain.py:19 assets/models/label.py:18
#: assets/models/platform.py:15 assets/models/platform.py:94 #: 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 #: assets/serializers/platform.py:273
#: authentication/backends/passkey/models.py:10 #: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 #: authentication/models/ssh_key.py:12
@ -852,7 +852,7 @@ msgid "Exist policy"
msgstr "账号存在策略" msgstr "账号存在策略"
#: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: 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/cagegory.py:12 assets/serializers/platform.py:168
#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26
#: settings/models.py:36 tickets/models/ticket/apply_application.py:13 #: 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 #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20
#: assets/models/cmd_filter.py:74 assets/models/platform.py:96 #: 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 #: assets/serializers/platform.py:167 audits/serializers.py:53
#: audits/serializers.py:170 #: audits/serializers.py:170
#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 #: 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 #: assets/serializers/platform.py:176 assets/serializers/platform.py:208
#: authentication/api/connection_token.py:410 ops/models/base.py:17 #: authentication/api/connection_token.py:410 ops/models/base.py:17
#: ops/models/job.py:152 ops/serializers/job.py:19 #: 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 #: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/cloud/manager.py:83 #: xpack/plugins/cloud/manager.py:83
msgid "Assets" msgid "Assets"
@ -927,7 +927,7 @@ msgstr "账号已存在"
#: accounts/serializers/account/account.py:458 #: accounts/serializers/account/account.py:458
#: accounts/serializers/account/base.py:93 #: accounts/serializers/account/base.py:93
#: accounts/serializers/account/template.py:72 #: accounts/serializers/account/template.py:72
#: assets/serializers/asset/common.py:387 #: assets/serializers/asset/common.py:407
msgid "Spec info" msgid "Spec info"
msgstr "特殊信息" msgstr "特殊信息"
@ -1061,7 +1061,7 @@ msgstr ""
"CACHE_LOGIN_PASSWORD_ENABLED=true重启服务才能开启" "CACHE_LOGIN_PASSWORD_ENABLED=true重启服务才能开启"
#: accounts/serializers/automations/base.py:23 #: 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 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36
msgid "Nodes" msgid "Nodes"
msgstr "节点" msgstr "节点"
@ -1268,15 +1268,15 @@ msgstr "审批人"
msgid "Active" msgid "Active"
msgstr "激活中" 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 #: tickets/models/flow.py:23 users/models/preference.py:16
#: users/serializers/group.py:21 users/serializers/user.py:424 #: users/serializers/group.py:21 users/serializers/user.py:424
msgid "Users" msgid "Users"
msgstr "用户" msgstr "用户"
#: acls/models/base.py:98 assets/models/automations/base.py:17 #: acls/models/base.py:98 assets/models/automations/base.py:17
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 #: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 #: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55
#: perms/serializers/user_permission.py:75 rbac/tree.py:35 #: perms/serializers/user_permission.py:75 rbac/tree.py:35
msgid "Accounts" msgid "Accounts"
msgstr "账号" msgstr "账号"
@ -1412,7 +1412,7 @@ msgstr ""
#: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_oauth_bind.html:12
#: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_password_success.html:8
#: authentication/templates/authentication/_msg_rest_public_key_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" msgid "IP"
msgstr "IP" msgstr "IP"
@ -1838,7 +1838,7 @@ msgstr "云服务"
msgid "Port" msgid "Port"
msgstr "端口" 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 #: settings/serializers/terminal.py:10
msgid "Address" msgid "Address"
msgstr "地址" msgstr "地址"
@ -1854,7 +1854,7 @@ msgstr "平台"
msgid "Zone" msgid "Zone"
msgstr "网域" 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 #: assets/serializers/asset/host.py:11
msgid "Gathered info" msgid "Gathered info"
msgstr "收集资产硬件信息" msgstr "收集资产硬件信息"
@ -2200,38 +2200,60 @@ msgid ""
"type" "type"
msgstr "资产中批量更新平台,不符合平台类型跳过的资产" 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:30
#: authentication/serializers/connect_token_secret.py:75 #: 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 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388
#: xpack/plugins/cloud/serializers/task.py:35 #: xpack/plugins/cloud/serializers/task.py:35
msgid "Protocols" msgid "Protocols"
msgstr "协议组" msgstr "协议组"
#: assets/serializers/asset/common.py:129 #: assets/serializers/asset/common.py:149
#: assets/serializers/asset/common.py:151 #: assets/serializers/asset/common.py:171
msgid "Node path" msgid "Node path"
msgstr "节点路径" msgstr "节点路径"
#: assets/serializers/asset/common.py:148 #: assets/serializers/asset/common.py:168
#: assets/serializers/asset/common.py:389 #: assets/serializers/asset/common.py:409
msgid "Auto info" msgid "Auto info"
msgstr "自动化信息" msgstr "自动化信息"
#: assets/serializers/asset/common.py:245 #: assets/serializers/asset/common.py:265
msgid "Platform not exist" msgid "Platform not exist"
msgstr "平台不存在" msgstr "平台不存在"
#: assets/serializers/asset/common.py:281 #: assets/serializers/asset/common.py:301
msgid "port out of range (0-65535)" msgid "port out of range (0-65535)"
msgstr "端口超出范围 (0-65535)" msgstr "端口超出范围 (0-65535)"
#: assets/serializers/asset/common.py:288 #: assets/serializers/asset/common.py:308
msgid "Protocol is required: {}" msgid "Protocol is required: {}"
msgstr "协议是必填的: {}" msgstr "协议是必填的: {}"
#: assets/serializers/asset/common.py:316 #: assets/serializers/asset/common.py:336
msgid "Invalid data" msgid "Invalid data"
msgstr "无效的数据" msgstr "无效的数据"
@ -2320,7 +2342,7 @@ msgid ""
msgstr "网关是网域的网络代理,当连接网域内的资产时,连接将通过网关进行路由。" msgstr "网关是网域的网络代理,当连接网域内的资产时,连接将通过网关进行路由。"
#: assets/serializers/domain.py:24 assets/serializers/platform.py:177 #: 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" msgid "Assets amount"
msgstr "资产数量" msgstr "资产数量"
@ -2680,7 +2702,7 @@ msgid "Resource"
msgstr "资源" msgstr "资源"
#: audits/models.py:101 audits/models.py:147 audits/models.py:177 #: 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" msgid "Datetime"
msgstr "日期" msgstr "日期"
@ -3448,7 +3470,7 @@ msgid "Actions"
msgstr "动作" msgstr "动作"
#: authentication/serializers/connection_token.py:42 #: 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 #: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired" msgid "Is expired"
msgstr "已过期" msgstr "已过期"
@ -3490,8 +3512,8 @@ msgstr "SSH密钥不合法"
msgid "Access IP" msgid "Access IP"
msgstr "IP 白名单" msgstr "IP 白名单"
#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 #: authentication/serializers/token.py:92 perms/serializers/permission.py:53
#: perms/serializers/permission.py:65 users/serializers/user.py:128 #: perms/serializers/permission.py:76 users/serializers/user.py:128
#: users/serializers/user.py:270 #: users/serializers/user.py:270
msgid "Is valid" msgid "Is valid"
msgstr "是否有效" msgstr "是否有效"
@ -4005,7 +4027,7 @@ msgstr "组织 ID"
msgid "The file content overflowed (The maximum length `{}` bytes)" msgid "The file content overflowed (The maximum length `{}` bytes)"
msgstr "文件内容太大 (最大长度 `{}` 字节)" msgstr "文件内容太大 (最大长度 `{}` 字节)"
#: common/drf/parsers/base.py:199 #: common/drf/parsers/base.py:207
msgid "Parse file error: {}" msgid "Parse file error: {}"
msgstr "解析文件错误: {}" msgstr "解析文件错误: {}"
@ -4013,7 +4035,66 @@ msgstr "解析文件错误: {}"
msgid "Invalid excel file" msgid "Invalid excel file"
msgstr "无效的 excel 文件" 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 "" msgid ""
"{} - The encryption password has not been set - please go to personal " "{} - The encryption password has not been set - please go to personal "
"information -> file encryption password to set the encryption password" "information -> file encryption password to set the encryption password"
@ -4835,7 +4916,7 @@ msgstr "可以查看所有加入的组织"
msgid "Can not delete virtual org" msgid "Can not delete virtual org"
msgstr "无法删除虚拟组织" 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 #: rbac/serializers/role.py:27 users/serializers/group.py:54
msgid "Users amount" msgid "Users amount"
msgstr "用户数量" msgstr "用户数量"
@ -4844,7 +4925,7 @@ msgstr "用户数量"
msgid "User groups amount" msgid "User groups amount"
msgstr "用户组数量" msgstr "用户组数量"
#: orgs/serializers.py:14 perms/serializers/permission.py:40 #: orgs/serializers.py:14 perms/serializers/permission.py:51
msgid "Nodes amount" msgid "Nodes amount"
msgstr "节点数量" msgstr "节点数量"
@ -4961,11 +5042,21 @@ msgstr "资产授权规则将要过期"
msgid "asset permissions of organization {}" msgid "asset permissions of organization {}"
msgstr "组织 ({}) 的资产授权" 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" msgid "Groups"
msgstr "用户组" msgstr "用户组"
#: perms/serializers/permission.py:38 #: perms/serializers/permission.py:49
msgid "Groups amount" msgid "Groups amount"
msgstr "用户组数量" msgstr "用户组数量"
@ -5560,9 +5651,9 @@ msgstr "User DN 缓存超时时间 (秒)"
#: settings/serializers/auth/ldap.py:91 #: settings/serializers/auth/ldap.py:91
msgid "" msgid ""
"Caching the User DN obtained during user login authentication can " "Caching the User DN obtained during user login authentication can "
"effectivelyimprove the speed of user authentication., 0 means no cache<br>If " "effectively improve the speed of user authentication., 0 means no "
"the user OU structure has been adjusted, click Submit to clear the user DN " "cache<br>If the user OU structure has been adjusted, click Submit to clear "
"cache" "the user DN cache"
msgstr "" msgstr ""
"对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度<br>如果" "对用户登录认证时查询出的 User DN 进行缓存,可以有效提高用户认证的速度<br>如果"
"用户 OU 架构有调整,点击提交即可清除用户 DN 缓存" "用户 OU 架构有调整,点击提交即可清除用户 DN 缓存"
@ -6696,11 +6787,11 @@ msgstr "认证失败: (未知): {}"
msgid "Authentication success: {}" msgid "Authentication success: {}"
msgstr "认证成功: {}" msgstr "认证成功: {}"
#: settings/ws.py:203 #: settings/ws.py:198
msgid "No LDAP user was found" msgid "No LDAP user was found"
msgstr "没有获取到 LDAP 用户" msgstr "没有获取到 LDAP 用户"
#: settings/ws.py:209 #: settings/ws.py:204
msgid "Total {}, success {}, failure {}" msgid "Total {}, success {}, failure {}"
msgstr "总共 {},成功 {},失败 {}" msgstr "总共 {},成功 {},失败 {}"
@ -9792,3 +9883,9 @@ msgstr "企业专业版"
#: xpack/plugins/license/models.py:86 #: xpack/plugins/license/models.py:86
msgid "Ultimate edition" msgid "Ultimate edition"
msgstr "企业旗舰版" msgstr "企业旗舰版"
#~ msgid "None"
#~ msgstr "无"
#~ msgid "Yes,No"
#~ msgstr "YesNo"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: JumpServer 0.3.3\n" "Project-Id-Version: JumpServer 0.3.3\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: 2021-05-20 10:54+0800\n"
"Last-Translator: ibuler <ibuler@qq.com>\n" "Last-Translator: ibuler <ibuler@qq.com>\n"
"Language-Team: JumpServer team<ibuler@qq.com>\n" "Language-Team: JumpServer team<ibuler@qq.com>\n"
@ -656,7 +656,7 @@ msgstr "觸發方式"
#: audits/models.py:92 audits/serializers.py:84 #: audits/models.py:92 audits/serializers.py:84
#: authentication/serializers/connect_token_secret.py:119 #: authentication/serializers/connect_token_secret.py:119
#: authentication/templates/authentication/_access_key_modal.html:34 #: 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 #: tickets/serializers/ticket/ticket.py:21
msgid "Action" msgid "Action"
msgstr "動作" msgstr "動作"
@ -703,7 +703,7 @@ msgstr "密碼規則"
#: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21 #: assets/models/asset/common.py:159 assets/models/cmd_filter.py:21
#: assets/models/domain.py:19 assets/models/label.py:18 #: assets/models/domain.py:19 assets/models/label.py:18
#: assets/models/platform.py:15 assets/models/platform.py:94 #: 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 #: assets/serializers/platform.py:273
#: authentication/backends/passkey/models.py:10 #: authentication/backends/passkey/models.py:10
#: authentication/models/ssh_key.py:12 #: authentication/models/ssh_key.py:12
@ -854,7 +854,7 @@ msgid "Exist policy"
msgstr "帳號存在策略" msgstr "帳號存在策略"
#: accounts/serializers/account/account.py:206 assets/models/label.py:21 #: 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/cagegory.py:12 assets/serializers/platform.py:168
#: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26 #: assets/serializers/platform.py:274 perms/serializers/user_permission.py:26
#: settings/models.py:36 tickets/models/ticket/apply_application.py:13 #: 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 #: accounts/serializers/automations/base.py:55 acls/models/command_acl.py:24
#: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20 #: acls/serializers/command_acl.py:19 assets/models/automations/base.py:20
#: assets/models/cmd_filter.py:74 assets/models/platform.py:96 #: 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 #: assets/serializers/platform.py:167 audits/serializers.py:53
#: audits/serializers.py:170 #: audits/serializers.py:170
#: authentication/serializers/connect_token_secret.py:126 ops/models/job.py:150 #: 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 #: assets/serializers/platform.py:176 assets/serializers/platform.py:208
#: authentication/api/connection_token.py:410 ops/models/base.py:17 #: authentication/api/connection_token.py:410 ops/models/base.py:17
#: ops/models/job.py:152 ops/serializers/job.py:19 #: 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 #: terminal/templates/terminal/_msg_command_execute_alert.html:16
#: xpack/plugins/cloud/manager.py:83 #: xpack/plugins/cloud/manager.py:83
msgid "Assets" msgid "Assets"
@ -929,7 +929,7 @@ msgstr "帳號已存在"
#: accounts/serializers/account/account.py:458 #: accounts/serializers/account/account.py:458
#: accounts/serializers/account/base.py:93 #: accounts/serializers/account/base.py:93
#: accounts/serializers/account/template.py:72 #: accounts/serializers/account/template.py:72
#: assets/serializers/asset/common.py:387 #: assets/serializers/asset/common.py:407
msgid "Spec info" msgid "Spec info"
msgstr "特殊資訊" msgstr "特殊資訊"
@ -1063,7 +1063,7 @@ msgstr ""
"CACHE_LOGIN_PASSWORD_ENABLED=true重啟服務才能開啟" "CACHE_LOGIN_PASSWORD_ENABLED=true重啟服務才能開啟"
#: accounts/serializers/automations/base.py:23 #: 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 #: assets/serializers/automations/base.py:21 perms/serializers/permission.py:36
msgid "Nodes" msgid "Nodes"
msgstr "節點" msgstr "節點"
@ -1269,15 +1269,15 @@ msgstr "審批人"
msgid "Active" msgid "Active"
msgstr "啟用中" 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 #: tickets/models/flow.py:23 users/models/preference.py:16
#: users/serializers/group.py:21 users/serializers/user.py:424 #: users/serializers/group.py:21 users/serializers/user.py:424
msgid "Users" msgid "Users"
msgstr "用戶管理" msgstr "用戶管理"
#: acls/models/base.py:98 assets/models/automations/base.py:17 #: acls/models/base.py:98 assets/models/automations/base.py:17
#: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:128 #: assets/models/cmd_filter.py:38 assets/serializers/asset/common.py:148
#: assets/serializers/asset/common.py:386 perms/serializers/permission.py:44 #: assets/serializers/asset/common.py:406 perms/serializers/permission.py:55
#: perms/serializers/user_permission.py:75 rbac/tree.py:35 #: perms/serializers/user_permission.py:75 rbac/tree.py:35
msgid "Accounts" msgid "Accounts"
msgstr "帳號管理" msgstr "帳號管理"
@ -1413,7 +1413,7 @@ msgstr ""
#: authentication/templates/authentication/_msg_oauth_bind.html:12 #: authentication/templates/authentication/_msg_oauth_bind.html:12
#: authentication/templates/authentication/_msg_rest_password_success.html:8 #: authentication/templates/authentication/_msg_rest_password_success.html:8
#: authentication/templates/authentication/_msg_rest_public_key_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" msgid "IP"
msgstr "IP" msgstr "IP"
@ -1839,7 +1839,7 @@ msgstr "雲服務"
msgid "Port" msgid "Port"
msgstr "埠" 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 #: settings/serializers/terminal.py:10
msgid "Address" msgid "Address"
msgstr "地址" msgstr "地址"
@ -1855,7 +1855,7 @@ msgstr "系統平台"
msgid "Zone" msgid "Zone"
msgstr "網域" 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 #: assets/serializers/asset/host.py:11
msgid "Gathered info" msgid "Gathered info"
msgstr "收集資產硬體資訊" msgstr "收集資產硬體資訊"
@ -2201,38 +2201,58 @@ msgid ""
"type" "type"
msgstr "資產中批次更新平台,不符合平台類型跳過的資產" 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:30
#: authentication/serializers/connect_token_secret.py:75 #: 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 #: perms/serializers/user_permission.py:74 xpack/plugins/cloud/models.py:388
#: xpack/plugins/cloud/serializers/task.py:35 #: xpack/plugins/cloud/serializers/task.py:35
msgid "Protocols" msgid "Protocols"
msgstr "協議組" msgstr "協議組"
#: assets/serializers/asset/common.py:129 #: assets/serializers/asset/common.py:149
#: assets/serializers/asset/common.py:151 #: assets/serializers/asset/common.py:171
msgid "Node path" msgid "Node path"
msgstr "節點路徑" msgstr "節點路徑"
#: assets/serializers/asset/common.py:148 #: assets/serializers/asset/common.py:168
#: assets/serializers/asset/common.py:389 #: assets/serializers/asset/common.py:409
msgid "Auto info" msgid "Auto info"
msgstr "自動化資訊" msgstr "自動化資訊"
#: assets/serializers/asset/common.py:245 #: assets/serializers/asset/common.py:265
msgid "Platform not exist" msgid "Platform not exist"
msgstr "平台不存在" msgstr "平台不存在"
#: assets/serializers/asset/common.py:281 #: assets/serializers/asset/common.py:301
msgid "port out of range (0-65535)" msgid "port out of range (0-65535)"
msgstr "埠超出範圍 (0-65535)" msgstr "埠超出範圍 (0-65535)"
#: assets/serializers/asset/common.py:288 #: assets/serializers/asset/common.py:308
msgid "Protocol is required: {}" msgid "Protocol is required: {}"
msgstr "協議是必填的: {}" msgstr "協議是必填的: {}"
#: assets/serializers/asset/common.py:316 #: assets/serializers/asset/common.py:336
msgid "Invalid data" msgid "Invalid data"
msgstr "無效的數據" msgstr "無效的數據"
@ -2321,7 +2341,7 @@ msgid ""
msgstr "網關是網域的網路代理,當連接網域內的資產時,連接將由網關進行路由。" msgstr "網關是網域的網路代理,當連接網域內的資產時,連接將由網關進行路由。"
#: assets/serializers/domain.py:24 assets/serializers/platform.py:177 #: 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" msgid "Assets amount"
msgstr "資產數量" msgstr "資產數量"
@ -2681,7 +2701,7 @@ msgid "Resource"
msgstr "資源" msgstr "資源"
#: audits/models.py:101 audits/models.py:147 audits/models.py:177 #: 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" msgid "Datetime"
msgstr "日期" msgstr "日期"
@ -3449,7 +3469,7 @@ msgid "Actions"
msgstr "動作" msgstr "動作"
#: authentication/serializers/connection_token.py:42 #: 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 #: users/serializers/user.py:127 users/serializers/user.py:273
msgid "Is expired" msgid "Is expired"
msgstr "已過期" msgstr "已過期"
@ -3491,8 +3511,8 @@ msgstr "SSH金鑰不合法"
msgid "Access IP" msgid "Access IP"
msgstr "IP 白名單" msgstr "IP 白名單"
#: authentication/serializers/token.py:92 perms/serializers/permission.py:42 #: authentication/serializers/token.py:92 perms/serializers/permission.py:53
#: perms/serializers/permission.py:65 users/serializers/user.py:128 #: perms/serializers/permission.py:76 users/serializers/user.py:128
#: users/serializers/user.py:270 #: users/serializers/user.py:270
msgid "Is valid" msgid "Is valid"
msgstr "是否有效" msgstr "是否有效"
@ -4006,7 +4026,7 @@ msgstr "組織 ID"
msgid "The file content overflowed (The maximum length `{}` bytes)" msgid "The file content overflowed (The maximum length `{}` bytes)"
msgstr "文件內容太大 (最大長度 `{}` 位元組)" msgstr "文件內容太大 (最大長度 `{}` 位元組)"
#: common/drf/parsers/base.py:199 #: common/drf/parsers/base.py:207
msgid "Parse file error: {}" msgid "Parse file error: {}"
msgstr "解析文件錯誤: {}" msgstr "解析文件錯誤: {}"
@ -4014,7 +4034,67 @@ msgstr "解析文件錯誤: {}"
msgid "Invalid excel file" msgid "Invalid excel file"
msgstr "無效的 excel 文件" 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 "" msgid ""
"{} - The encryption password has not been set - please go to personal " "{} - The encryption password has not been set - please go to personal "
"information -> file encryption password to set the encryption password" "information -> file encryption password to set the encryption password"
@ -4837,7 +4917,7 @@ msgstr "可以查看所有加入的組織"
msgid "Can not delete virtual org" msgid "Can not delete virtual org"
msgstr "無法刪除虛擬組織" 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 #: rbac/serializers/role.py:27 users/serializers/group.py:54
msgid "Users amount" msgid "Users amount"
msgstr "用戶數量" msgstr "用戶數量"
@ -4846,7 +4926,7 @@ msgstr "用戶數量"
msgid "User groups amount" msgid "User groups amount"
msgstr "用戶組數量" msgstr "用戶組數量"
#: orgs/serializers.py:14 perms/serializers/permission.py:40 #: orgs/serializers.py:14 perms/serializers/permission.py:51
msgid "Nodes amount" msgid "Nodes amount"
msgstr "節點數量" msgstr "節點數量"
@ -4963,11 +5043,21 @@ msgstr "資產授權規則將要過期"
msgid "asset permissions of organization {}" msgid "asset permissions of organization {}"
msgstr "組織 ({}) 的資產授權" 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" msgid "Groups"
msgstr "使用者群組" msgstr "使用者群組"
#: perms/serializers/permission.py:38 #: perms/serializers/permission.py:49
msgid "Groups amount" msgid "Groups amount"
msgstr "使用者組數量" msgstr "使用者組數量"
@ -5562,9 +5652,9 @@ msgstr "快取逾時時間 (秒)"
#: settings/serializers/auth/ldap.py:91 #: settings/serializers/auth/ldap.py:91
msgid "" msgid ""
"Caching the User DN obtained during user login authentication can " "Caching the User DN obtained during user login authentication can "
"effectivelyimprove the speed of user authentication., 0 means no cache<br>If " "effectively improve the speed of user authentication., 0 means no "
"the user OU structure has been adjusted, click Submit to clear the user DN " "cache<br>If the user OU structure has been adjusted, click Submit to clear "
"cache" "the user DN cache"
msgstr "" msgstr ""
"對於使用者登錄認證時查詢的使用者 DN 進行快取,可以有效提高使用者認證的速度" "對於使用者登錄認證時查詢的使用者 DN 進行快取,可以有效提高使用者認證的速度"
"<br>如果使用者 OU 架構已調整,請點擊提交以清除使用者 DN 快取" "<br>如果使用者 OU 架構已調整,請點擊提交以清除使用者 DN 快取"
@ -6698,11 +6788,11 @@ msgstr "認證失敗: (未知): {}"
msgid "Authentication success: {}" msgid "Authentication success: {}"
msgstr "認證成功: {}" msgstr "認證成功: {}"
#: settings/ws.py:203 #: settings/ws.py:198
msgid "No LDAP user was found" msgid "No LDAP user was found"
msgstr "沒有取得到 LDAP 用戶" msgstr "沒有取得到 LDAP 用戶"
#: settings/ws.py:209 #: settings/ws.py:204
msgid "Total {}, success {}, failure {}" msgid "Total {}, success {}, failure {}"
msgstr "總共 {},成功 {},失敗 {}" msgstr "總共 {},成功 {},失敗 {}"
@ -9807,3 +9897,8 @@ msgstr "企業專業版"
#: xpack/plugins/license/models.py:86 #: xpack/plugins/license/models.py:86
msgid "Ultimate edition" msgid "Ultimate edition"
msgstr "企業旗艦版" msgstr "企業旗艦版"
#, fuzzy
#~| msgid "Help text"
#~ msgid "#Help: "
#~ msgstr "幫助"

View File

@ -23,7 +23,7 @@ class OrgResourceSerializerMixin(serializers.Serializer):
但是coco需要资产的org_id字段所以修改为CharField类型 但是coco需要资产的org_id字段所以修改为CharField类型
""" """
org_id = serializers.ReadOnlyField(default=get_current_org_id_for_serializer, label=_("Organization")) 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 add_org_fields = True
def get_validators(self): def get_validators(self):

View File

@ -27,6 +27,17 @@ class ActionChoicesField(BitChoicesField):
return data 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): class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
users = ObjectRelatedField(queryset=User.objects, many=True, required=False, label=_('Users')) users = ObjectRelatedField(queryset=User.objects, many=True, required=False, label=_('Users'))
user_groups = ObjectRelatedField( user_groups = ObjectRelatedField(
@ -41,8 +52,8 @@ class AssetPermissionSerializer(ResourceLabelsMixin, BulkOrgResourceModelSeriali
actions = ActionChoicesField(required=False, allow_null=True, label=_("Action")) actions = ActionChoicesField(required=False, allow_null=True, label=_("Action"))
is_valid = serializers.BooleanField(read_only=True, label=_("Is valid")) is_valid = serializers.BooleanField(read_only=True, label=_("Is valid"))
is_expired = serializers.BooleanField(read_only=True, label=_("Is expired")) is_expired = serializers.BooleanField(read_only=True, label=_("Is expired"))
accounts = serializers.ListField(label=_("Accounts"), required=False) accounts = PermAccountsSerializer(label=_("Accounts"), required=False)
protocols = serializers.ListField(label=_("Protocols"), required=False) protocols = PermProtocolsSerializer(label=_("Protocols"), required=False)
template_accounts = AccountTemplate.objects.none() template_accounts = AccountTemplate.objects.none()

View File

@ -88,7 +88,7 @@ class LDAPSettingSerializer(serializers.Serializer):
default=3600 * 24 * 30, default=3600 * 24 * 30,
required=False, label=_('User DN cache timeout (s)'), required=False, label=_('User DN cache timeout (s)'),
help_text=_( 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<br>' 'improve the speed of user authentication., 0 means no cache<br>'
'If the user OU structure has been adjusted, click Submit to clear the user DN cache' 'If the user OU structure has been adjusted, click Submit to clear the user DN cache'
) )