mirror of https://github.com/jumpserver/jumpserver
perf: 账号管理中查看密码记录日志 (#8157)
parent
c56179e9e4
commit
e151548701
|
@ -6,6 +6,7 @@ from django.db.models import F, Q
|
|||
|
||||
from common.drf.filters import BaseFilterSet
|
||||
from common.drf.api import JMSBulkModelViewSet
|
||||
from common.mixins import RecordViewLogMixin
|
||||
from rbac.permissions import RBACPermission
|
||||
from assets.models import SystemUser
|
||||
from ..models import Account
|
||||
|
@ -54,7 +55,7 @@ class SystemUserAppRelationViewSet(ApplicationAccountViewSet):
|
|||
perm_model = SystemUser
|
||||
|
||||
|
||||
class ApplicationAccountSecretViewSet(ApplicationAccountViewSet):
|
||||
class ApplicationAccountSecretViewSet(RecordViewLogMixin, ApplicationAccountViewSet):
|
||||
serializer_class = serializers.AppAccountSecretSerializer
|
||||
permission_classes = [RBACPermission, NeedMFAVerify]
|
||||
http_method_names = ['get', 'options']
|
||||
|
|
|
@ -8,6 +8,7 @@ from rest_framework.generics import CreateAPIView
|
|||
from orgs.mixins.api import OrgBulkModelViewSet
|
||||
from rbac.permissions import RBACPermission
|
||||
from common.drf.filters import BaseFilterSet
|
||||
from common.mixins import RecordViewLogMixin
|
||||
from common.permissions import NeedMFAVerify
|
||||
from ..tasks.account_connectivity import test_accounts_connectivity_manual
|
||||
from ..models import AuthBook, Node
|
||||
|
@ -79,7 +80,7 @@ class AccountViewSet(OrgBulkModelViewSet):
|
|||
return Response(data={'task': task.id})
|
||||
|
||||
|
||||
class AccountSecretsViewSet(AccountViewSet):
|
||||
class AccountSecretsViewSet(RecordViewLogMixin, AccountViewSet):
|
||||
"""
|
||||
因为可能要导出所有账号,所以单独建立了一个 viewset
|
||||
"""
|
||||
|
|
|
@ -3,3 +3,23 @@
|
|||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
DEFAULT_CITY = _("Unknown")
|
||||
|
||||
MODELS_NEED_RECORD = (
|
||||
# users
|
||||
'User', 'UserGroup',
|
||||
# acls
|
||||
'LoginACL', 'LoginAssetACL', 'LoginConfirmSetting',
|
||||
# assets
|
||||
'Asset', 'Node', 'AdminUser', 'SystemUser', 'Domain', 'Gateway', 'CommandFilterRule',
|
||||
'CommandFilter', 'Platform', 'AuthBook',
|
||||
# applications
|
||||
'Application',
|
||||
# orgs
|
||||
'Organization',
|
||||
# settings
|
||||
'Setting',
|
||||
# perms
|
||||
'AssetPermission', 'ApplicationPermission',
|
||||
# xpack
|
||||
'License', 'Account', 'SyncInstanceTask', 'ChangeAuthPlan', 'GatherUserTask',
|
||||
)
|
||||
|
|
|
@ -49,10 +49,12 @@ class FTPLog(OrgModelMixin):
|
|||
|
||||
class OperateLog(OrgModelMixin):
|
||||
ACTION_CREATE = 'create'
|
||||
ACTION_VIEW = 'view'
|
||||
ACTION_UPDATE = 'update'
|
||||
ACTION_DELETE = 'delete'
|
||||
ACTION_CHOICES = (
|
||||
(ACTION_CREATE, _("Create")),
|
||||
(ACTION_VIEW, _("View")),
|
||||
(ACTION_UPDATE, _("Update")),
|
||||
(ACTION_DELETE, _("Delete"))
|
||||
)
|
||||
|
|
|
@ -21,7 +21,7 @@ from jumpserver.utils import current_request
|
|||
from users.models import User
|
||||
from users.signals import post_user_change_password
|
||||
from terminal.models import Session, Command
|
||||
from .utils import write_login_log
|
||||
from .utils import write_login_log, create_operate_log
|
||||
from . import models, serializers
|
||||
from .models import OperateLog
|
||||
from orgs.utils import current_org
|
||||
|
@ -36,26 +36,6 @@ logger = get_logger(__name__)
|
|||
sys_logger = get_syslogger(__name__)
|
||||
json_render = JSONRenderer()
|
||||
|
||||
MODELS_NEED_RECORD = (
|
||||
# users
|
||||
'User', 'UserGroup',
|
||||
# acls
|
||||
'LoginACL', 'LoginAssetACL', 'LoginConfirmSetting',
|
||||
# assets
|
||||
'Asset', 'Node', 'AdminUser', 'SystemUser', 'Domain', 'Gateway', 'CommandFilterRule',
|
||||
'CommandFilter', 'Platform', 'AuthBook',
|
||||
# applications
|
||||
'Application',
|
||||
# orgs
|
||||
'Organization',
|
||||
# settings
|
||||
'Setting',
|
||||
# perms
|
||||
'AssetPermission', 'ApplicationPermission',
|
||||
# xpack
|
||||
'License', 'Account', 'SyncInstanceTask', 'ChangeAuthPlan', 'GatherUserTask',
|
||||
)
|
||||
|
||||
|
||||
class AuthBackendLabelMapping(LazyObject):
|
||||
@staticmethod
|
||||
|
@ -80,28 +60,6 @@ class AuthBackendLabelMapping(LazyObject):
|
|||
AUTH_BACKEND_LABEL_MAPPING = AuthBackendLabelMapping()
|
||||
|
||||
|
||||
def create_operate_log(action, sender, resource):
|
||||
user = current_request.user if current_request else None
|
||||
if not user or not user.is_authenticated:
|
||||
return
|
||||
model_name = sender._meta.object_name
|
||||
if model_name not in MODELS_NEED_RECORD:
|
||||
return
|
||||
with translation.override('en'):
|
||||
resource_type = sender._meta.verbose_name
|
||||
remote_addr = get_request_ip(current_request)
|
||||
|
||||
data = {
|
||||
"user": str(user), 'action': action, 'resource_type': resource_type,
|
||||
'resource': str(resource), 'remote_addr': remote_addr,
|
||||
}
|
||||
with transaction.atomic():
|
||||
try:
|
||||
models.OperateLog.objects.create(**data)
|
||||
except Exception as e:
|
||||
logger.error("Create operate log error: {}".format(e))
|
||||
|
||||
|
||||
M2M_NEED_RECORD = {
|
||||
User.groups.through._meta.object_name: (
|
||||
_('User and Group'),
|
||||
|
|
|
@ -1,9 +1,17 @@
|
|||
import csv
|
||||
import codecs
|
||||
from django.http import HttpResponse
|
||||
|
||||
from .const import DEFAULT_CITY
|
||||
from common.utils import validate_ip, get_ip_city
|
||||
from django.http import HttpResponse
|
||||
from django.db import transaction
|
||||
from django.utils import translation
|
||||
|
||||
from audits.models import OperateLog
|
||||
from common.utils import validate_ip, get_ip_city, get_request_ip, get_logger
|
||||
from jumpserver.utils import current_request
|
||||
from .const import DEFAULT_CITY, MODELS_NEED_RECORD
|
||||
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
def get_excel_response(filename):
|
||||
|
@ -36,3 +44,25 @@ def write_login_log(*args, **kwargs):
|
|||
city = get_ip_city(ip) or DEFAULT_CITY
|
||||
kwargs.update({'ip': ip, 'city': city})
|
||||
UserLoginLog.objects.create(**kwargs)
|
||||
|
||||
|
||||
def create_operate_log(action, sender, resource):
|
||||
user = current_request.user if current_request else None
|
||||
if not user or not user.is_authenticated:
|
||||
return
|
||||
model_name = sender._meta.object_name
|
||||
if model_name not in MODELS_NEED_RECORD:
|
||||
return
|
||||
with translation.override('en'):
|
||||
resource_type = sender._meta.verbose_name
|
||||
remote_addr = get_request_ip(current_request)
|
||||
|
||||
data = {
|
||||
"user": str(user), 'action': action, 'resource_type': resource_type,
|
||||
'resource': str(resource), 'remote_addr': remote_addr,
|
||||
}
|
||||
with transaction.atomic():
|
||||
try:
|
||||
OperateLog.objects.create(**data)
|
||||
except Exception as e:
|
||||
logger.error("Create operate log error: {}".format(e))
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.contrib.auth.mixins import UserPassesTestMixin
|
||||
from rest_framework import permissions
|
||||
from rest_framework.decorators import action
|
||||
|
@ -7,8 +8,10 @@ from rest_framework.request import Request
|
|||
from rest_framework.response import Response
|
||||
|
||||
from common.permissions import IsValidUser
|
||||
from audits.utils import create_operate_log
|
||||
from audits.models import OperateLog
|
||||
|
||||
__all__ = ["PermissionsMixin"]
|
||||
__all__ = ["PermissionsMixin", "RecordViewLogMixin"]
|
||||
|
||||
|
||||
class PermissionsMixin(UserPassesTestMixin):
|
||||
|
@ -24,3 +27,35 @@ class PermissionsMixin(UserPassesTestMixin):
|
|||
if not permission_class().has_permission(self.request, self):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
class RecordViewLogMixin:
|
||||
ACTION = OperateLog.ACTION_VIEW
|
||||
|
||||
@staticmethod
|
||||
def get_resource_display(request):
|
||||
query_params = dict(request.query_params)
|
||||
if query_params.get('format'):
|
||||
query_params.pop('format')
|
||||
spm_filter = query_params.pop('spm') if query_params.get('spm') else None
|
||||
if not query_params and not spm_filter:
|
||||
display_message = _('Export all')
|
||||
elif spm_filter:
|
||||
display_message = _('Export only selected items')
|
||||
else:
|
||||
query = ','.join(
|
||||
['%s=%s' % (key, value) for key, value in query_params.items()]
|
||||
)
|
||||
display_message = _('Export filtered: %s') % query
|
||||
return display_message
|
||||
|
||||
def list(self, request, *args, **kwargs):
|
||||
response = super().list(request, *args, **kwargs)
|
||||
resource = self.get_resource_display(request)
|
||||
create_operate_log(self.ACTION, self.model, resource)
|
||||
return response
|
||||
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
response = super().retrieve(request, *args, **kwargs)
|
||||
create_operate_log(self.ACTION, self.model, self.get_object())
|
||||
return response
|
||||
|
|
|
@ -86,7 +86,7 @@ msgstr "ログイン確認"
|
|||
|
||||
#: acls/models/login_acl.py:24 acls/models/login_asset_acl.py:20
|
||||
#: assets/models/cmd_filter.py:30 assets/models/label.py:15 audits/models.py:37
|
||||
#: audits/models.py:60 audits/models.py:85 audits/serializers.py:100
|
||||
#: audits/models.py:62 audits/models.py:87 audits/serializers.py:100
|
||||
#: authentication/models.py:51 orgs/models.py:214 perms/models/base.py:84
|
||||
#: rbac/builtin.py:118 rbac/models/rolebinding.py:41
|
||||
#: terminal/backends/command/models.py:20
|
||||
|
@ -103,7 +103,7 @@ msgstr "ルール"
|
|||
|
||||
#: acls/models/login_acl.py:31 acls/models/login_asset_acl.py:26
|
||||
#: acls/serializers/login_acl.py:17 acls/serializers/login_asset_acl.py:75
|
||||
#: assets/models/cmd_filter.py:89 audits/models.py:61 audits/serializers.py:51
|
||||
#: assets/models/cmd_filter.py:89 audits/models.py:63 audits/serializers.py:51
|
||||
#: authentication/templates/authentication/_access_key_modal.html:34
|
||||
msgid "Action"
|
||||
msgstr "アクション"
|
||||
|
@ -152,7 +152,7 @@ msgstr "コンマ区切り文字列の形式。* はすべて一致すること
|
|||
|
||||
#: acls/serializers/login_acl.py:15 acls/serializers/login_asset_acl.py:17
|
||||
#: acls/serializers/login_asset_acl.py:51 assets/models/base.py:176
|
||||
#: assets/models/gathered_user.py:15 audits/models.py:119
|
||||
#: assets/models/gathered_user.py:15 audits/models.py:121
|
||||
#: authentication/forms.py:15 authentication/forms.py:17
|
||||
#: authentication/models.py:69
|
||||
#: authentication/templates/authentication/_msg_different_city.html:9
|
||||
|
@ -711,7 +711,7 @@ msgstr "アカウントのバックアップスナップショット"
|
|||
msgid "Trigger mode"
|
||||
msgstr "トリガーモード"
|
||||
|
||||
#: assets/models/backup.py:119 audits/models.py:125
|
||||
#: assets/models/backup.py:119 audits/models.py:127
|
||||
#: terminal/models/sharing.py:94
|
||||
#: xpack/plugins/change_auth_plan/models/base.py:201
|
||||
#: xpack/plugins/change_auth_plan/serializers/app.py:66
|
||||
|
@ -741,7 +741,7 @@ msgstr "不明"
|
|||
msgid "Ok"
|
||||
msgstr "OK"
|
||||
|
||||
#: assets/models/base.py:32 audits/models.py:116
|
||||
#: assets/models/base.py:32 audits/models.py:118
|
||||
#: xpack/plugins/change_auth_plan/serializers/app.py:88
|
||||
#: xpack/plugins/change_auth_plan/serializers/asset.py:198
|
||||
#: xpack/plugins/cloud/const.py:31
|
||||
|
@ -756,7 +756,7 @@ msgstr "接続性"
|
|||
msgid "Date verified"
|
||||
msgstr "確認済みの日付"
|
||||
|
||||
#: assets/models/base.py:177 audits/signal_handlers.py:68
|
||||
#: assets/models/base.py:177 audits/signal_handlers.py:48
|
||||
#: authentication/forms.py:22
|
||||
#: authentication/templates/authentication/login.html:181
|
||||
#: settings/serializers/auth/ldap.py:43 users/forms/profile.py:21
|
||||
|
@ -1358,7 +1358,7 @@ msgstr "一致する資産がない、タスクを停止"
|
|||
msgid "Audits"
|
||||
msgstr "監査"
|
||||
|
||||
#: audits/models.py:27 audits/models.py:57
|
||||
#: audits/models.py:27 audits/models.py:59
|
||||
#: authentication/templates/authentication/_access_key_modal.html:65
|
||||
#: rbac/tree.py:228
|
||||
msgid "Delete"
|
||||
|
@ -1388,7 +1388,7 @@ msgstr "Mkdir"
|
|||
msgid "Symlink"
|
||||
msgstr "Symlink"
|
||||
|
||||
#: audits/models.py:38 audits/models.py:64 audits/models.py:87
|
||||
#: audits/models.py:38 audits/models.py:66 audits/models.py:89
|
||||
#: terminal/models/session.py:51 terminal/models/sharing.py:82
|
||||
msgid "Remote addr"
|
||||
msgstr "リモートaddr"
|
||||
|
@ -1412,95 +1412,100 @@ msgstr "成功"
|
|||
msgid "File transfer log"
|
||||
msgstr "ファイル転送ログ"
|
||||
|
||||
#: audits/models.py:55
|
||||
#: audits/models.py:56
|
||||
#: authentication/templates/authentication/_access_key_modal.html:22
|
||||
#: rbac/tree.py:225
|
||||
msgid "Create"
|
||||
msgstr "作成"
|
||||
|
||||
#: audits/models.py:56 rbac/tree.py:227 templates/_csv_import_export.html:18
|
||||
#: audits/models.py:57 rbac/tree.py:226
|
||||
msgid "View"
|
||||
msgstr "表示"
|
||||
|
||||
#: audits/models.py:58 rbac/tree.py:227 templates/_csv_import_export.html:18
|
||||
#: templates/_csv_update_modal.html:6
|
||||
msgid "Update"
|
||||
msgstr "更新"
|
||||
|
||||
#: audits/models.py:62 audits/serializers.py:63
|
||||
#: audits/models.py:64 audits/serializers.py:63
|
||||
msgid "Resource Type"
|
||||
msgstr "リソースタイプ"
|
||||
|
||||
#: audits/models.py:63
|
||||
#: audits/models.py:65
|
||||
msgid "Resource"
|
||||
msgstr "リソース"
|
||||
|
||||
#: audits/models.py:65 audits/models.py:88
|
||||
#: audits/models.py:67 audits/models.py:90
|
||||
#: terminal/backends/command/serializers.py:39
|
||||
msgid "Datetime"
|
||||
msgstr "時間"
|
||||
|
||||
#: audits/models.py:80
|
||||
#: audits/models.py:82
|
||||
msgid "Operate log"
|
||||
msgstr "ログの操作"
|
||||
|
||||
#: audits/models.py:86
|
||||
#: audits/models.py:88
|
||||
msgid "Change by"
|
||||
msgstr "による変更"
|
||||
|
||||
#: audits/models.py:94
|
||||
#: audits/models.py:96
|
||||
msgid "Password change log"
|
||||
msgstr "パスワード変更ログ"
|
||||
|
||||
#: audits/models.py:109
|
||||
#: audits/models.py:111
|
||||
msgid "Disabled"
|
||||
msgstr "無効"
|
||||
|
||||
#: audits/models.py:110 settings/models.py:33
|
||||
#: audits/models.py:112 settings/models.py:33
|
||||
msgid "Enabled"
|
||||
msgstr "有効化"
|
||||
|
||||
#: audits/models.py:111
|
||||
#: audits/models.py:113
|
||||
msgid "-"
|
||||
msgstr "-"
|
||||
|
||||
#: audits/models.py:120
|
||||
#: audits/models.py:122
|
||||
msgid "Login type"
|
||||
msgstr "ログインタイプ"
|
||||
|
||||
#: audits/models.py:121
|
||||
#: audits/models.py:123
|
||||
#: tickets/serializers/ticket/meta/ticket_type/login_confirm.py:14
|
||||
msgid "Login ip"
|
||||
msgstr "ログインIP"
|
||||
|
||||
#: audits/models.py:122
|
||||
#: audits/models.py:124
|
||||
#: authentication/templates/authentication/_msg_different_city.html:11
|
||||
#: tickets/serializers/ticket/meta/ticket_type/login_confirm.py:17
|
||||
msgid "Login city"
|
||||
msgstr "ログイン都市"
|
||||
|
||||
#: audits/models.py:123 audits/serializers.py:44
|
||||
#: audits/models.py:125 audits/serializers.py:44
|
||||
msgid "User agent"
|
||||
msgstr "ユーザーエージェント"
|
||||
|
||||
#: audits/models.py:124
|
||||
#: audits/models.py:126
|
||||
#: authentication/templates/authentication/_mfa_confirm_modal.html:14
|
||||
#: users/forms/profile.py:64 users/models/user.py:684
|
||||
#: users/serializers/profile.py:121
|
||||
msgid "MFA"
|
||||
msgstr "MFA"
|
||||
|
||||
#: audits/models.py:126 terminal/models/status.py:33
|
||||
#: audits/models.py:128 terminal/models/status.py:33
|
||||
#: tickets/models/ticket.py:140 xpack/plugins/cloud/models.py:175
|
||||
#: xpack/plugins/cloud/models.py:227
|
||||
msgid "Status"
|
||||
msgstr "ステータス"
|
||||
|
||||
#: audits/models.py:127
|
||||
#: audits/models.py:129
|
||||
msgid "Date login"
|
||||
msgstr "日付ログイン"
|
||||
|
||||
#: audits/models.py:128 audits/serializers.py:46
|
||||
#: audits/models.py:130 audits/serializers.py:46
|
||||
msgid "Authentication backend"
|
||||
msgstr "認証バックエンド"
|
||||
|
||||
#: audits/models.py:167
|
||||
#: audits/models.py:169
|
||||
msgid "User login log"
|
||||
msgstr "ユーザーログインログ"
|
||||
|
||||
|
@ -1545,20 +1550,21 @@ msgstr "ディスプレイとして実行する"
|
|||
msgid "User display"
|
||||
msgstr "ユーザー表示"
|
||||
|
||||
#: audits/signal_handlers.py:67
|
||||
#: audits/signal_handlers.py:47
|
||||
msgid "SSH Key"
|
||||
msgstr "SSHキー"
|
||||
|
||||
#: audits/signal_handlers.py:69
|
||||
#: audits/signal_handlers.py:49
|
||||
msgid "SSO"
|
||||
msgstr "SSO"
|
||||
|
||||
#: audits/signal_handlers.py:70
|
||||
#: audits/signal_handlers.py:50
|
||||
msgid "Auth Token"
|
||||
msgstr "認証トークン"
|
||||
|
||||
#: audits/signal_handlers.py:71 authentication/notifications.py:73
|
||||
#: authentication/views/login.py:164 authentication/views/wecom.py:182
|
||||
#: audits/signal_handlers.py:51 authentication/notifications.py:73
|
||||
#: authentication/views/login.py:164 authentication/views/wecom.py:181
|
||||
#: notifications/backends/__init__.py:11 users/models/user.py:720
|
||||
msgid "WeCom"
|
||||
msgstr "企業微信"
|
||||
|
@ -1569,174 +1575,174 @@ msgstr "企業微信"
|
|||
msgid "DingTalk"
|
||||
msgstr "DingTalk"
|
||||
|
||||
#: audits/signal_handlers.py:73 authentication/models.py:76
|
||||
#: audits/signal_handlers.py:53 authentication/models.py:76
|
||||
msgid "Temporary token"
|
||||
msgstr "仮パスワード"
|
||||
|
||||
#: audits/signal_handlers.py:107
|
||||
#: audits/signal_handlers.py:65
|
||||
msgid "User and Group"
|
||||
msgstr "ユーザーとグループ"
|
||||
|
||||
#: audits/signal_handlers.py:108
|
||||
#: audits/signal_handlers.py:66
|
||||
#, python-brace-format
|
||||
msgid "{User} JOINED {UserGroup}"
|
||||
msgstr "{User} に参加 {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:109
|
||||
#: audits/signal_handlers.py:67
|
||||
#, python-brace-format
|
||||
msgid "{User} LEFT {UserGroup}"
|
||||
msgstr "{User} のそばを通る {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:112
|
||||
#: audits/signal_handlers.py:70
|
||||
msgid "Asset and SystemUser"
|
||||
msgstr "資産およびシステム・ユーザー"
|
||||
|
||||
#: audits/signal_handlers.py:113
|
||||
#: audits/signal_handlers.py:71
|
||||
#, python-brace-format
|
||||
msgid "{Asset} ADD {SystemUser}"
|
||||
msgstr "{Asset} 追加 {SystemUser}"
|
||||
|
||||
#: audits/signal_handlers.py:114
|
||||
#: audits/signal_handlers.py:72
|
||||
#, python-brace-format
|
||||
msgid "{Asset} REMOVE {SystemUser}"
|
||||
msgstr "{Asset} 削除 {SystemUser}"
|
||||
|
||||
#: audits/signal_handlers.py:117
|
||||
#: audits/signal_handlers.py:75
|
||||
msgid "Node and Asset"
|
||||
msgstr "ノードと資産"
|
||||
|
||||
#: audits/signal_handlers.py:118
|
||||
#: audits/signal_handlers.py:76
|
||||
#, python-brace-format
|
||||
msgid "{Node} ADD {Asset}"
|
||||
msgstr "{Node} 追加 {Asset}"
|
||||
|
||||
#: audits/signal_handlers.py:119
|
||||
#: audits/signal_handlers.py:77
|
||||
#, python-brace-format
|
||||
msgid "{Node} REMOVE {Asset}"
|
||||
msgstr "{Node} 削除 {Asset}"
|
||||
|
||||
#: audits/signal_handlers.py:122
|
||||
#: audits/signal_handlers.py:80
|
||||
msgid "User asset permissions"
|
||||
msgstr "ユーザー資産の権限"
|
||||
|
||||
#: audits/signal_handlers.py:123
|
||||
#: audits/signal_handlers.py:81
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} ADD {User}"
|
||||
msgstr "{AssetPermission} 追加 {User}"
|
||||
|
||||
#: audits/signal_handlers.py:124
|
||||
#: audits/signal_handlers.py:82
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} REMOVE {User}"
|
||||
msgstr "{AssetPermission} 削除 {User}"
|
||||
|
||||
#: audits/signal_handlers.py:127
|
||||
#: audits/signal_handlers.py:85
|
||||
msgid "User group asset permissions"
|
||||
msgstr "ユーザーグループの資産権限"
|
||||
|
||||
#: audits/signal_handlers.py:128
|
||||
#: audits/signal_handlers.py:86
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} ADD {UserGroup}"
|
||||
msgstr "{AssetPermission} 追加 {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:129
|
||||
#: audits/signal_handlers.py:87
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} REMOVE {UserGroup}"
|
||||
msgstr "{AssetPermission} 削除 {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:132 perms/models/asset_permission.py:29
|
||||
#: audits/signal_handlers.py:90 perms/models/asset_permission.py:29
|
||||
msgid "Asset permission"
|
||||
msgstr "資産権限"
|
||||
|
||||
#: audits/signal_handlers.py:133
|
||||
#: audits/signal_handlers.py:91
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} ADD {Asset}"
|
||||
msgstr "{AssetPermission} 追加 {Asset}"
|
||||
|
||||
#: audits/signal_handlers.py:134
|
||||
#: audits/signal_handlers.py:92
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} REMOVE {Asset}"
|
||||
msgstr "{AssetPermission} 削除 {Asset}"
|
||||
|
||||
#: audits/signal_handlers.py:137
|
||||
#: audits/signal_handlers.py:95
|
||||
msgid "Node permission"
|
||||
msgstr "ノード権限"
|
||||
|
||||
#: audits/signal_handlers.py:138
|
||||
#: audits/signal_handlers.py:96
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} ADD {Node}"
|
||||
msgstr "{AssetPermission} 追加 {Node}"
|
||||
|
||||
#: audits/signal_handlers.py:139
|
||||
#: audits/signal_handlers.py:97
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} REMOVE {Node}"
|
||||
msgstr "{AssetPermission} 削除 {Node}"
|
||||
|
||||
#: audits/signal_handlers.py:142
|
||||
#: audits/signal_handlers.py:100
|
||||
msgid "Asset permission and SystemUser"
|
||||
msgstr "資産権限とSystemUser"
|
||||
|
||||
#: audits/signal_handlers.py:143
|
||||
#: audits/signal_handlers.py:101
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} ADD {SystemUser}"
|
||||
msgstr "{AssetPermission} 追加 {SystemUser}"
|
||||
|
||||
#: audits/signal_handlers.py:144
|
||||
#: audits/signal_handlers.py:102
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} REMOVE {SystemUser}"
|
||||
msgstr "{AssetPermission} 削除 {SystemUser}"
|
||||
|
||||
#: audits/signal_handlers.py:147
|
||||
#: audits/signal_handlers.py:105
|
||||
msgid "User application permissions"
|
||||
msgstr "ユーザーアプリケーションの権限"
|
||||
|
||||
#: audits/signal_handlers.py:148
|
||||
#: audits/signal_handlers.py:106
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} ADD {User}"
|
||||
msgstr "{ApplicationPermission} 追加 {User}"
|
||||
|
||||
#: audits/signal_handlers.py:149
|
||||
#: audits/signal_handlers.py:107
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} REMOVE {User}"
|
||||
msgstr "{ApplicationPermission} 削除 {User}"
|
||||
|
||||
#: audits/signal_handlers.py:152
|
||||
#: audits/signal_handlers.py:110
|
||||
msgid "User group application permissions"
|
||||
msgstr "ユーザーグループアプリケーションの権限"
|
||||
|
||||
#: audits/signal_handlers.py:153
|
||||
#: audits/signal_handlers.py:111
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} ADD {UserGroup}"
|
||||
msgstr "{ApplicationPermission} 追加 {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:154
|
||||
#: audits/signal_handlers.py:112
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} REMOVE {UserGroup}"
|
||||
msgstr "{ApplicationPermission} 削除 {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:157 perms/models/application_permission.py:38
|
||||
#: audits/signal_handlers.py:115 perms/models/application_permission.py:38
|
||||
msgid "Application permission"
|
||||
msgstr "申請許可"
|
||||
|
||||
#: audits/signal_handlers.py:158
|
||||
#: audits/signal_handlers.py:116
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} ADD {Application}"
|
||||
msgstr "{ApplicationPermission} 追加 {Application}"
|
||||
|
||||
#: audits/signal_handlers.py:159
|
||||
#: audits/signal_handlers.py:117
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} REMOVE {Application}"
|
||||
msgstr "{ApplicationPermission} 削除 {Application}"
|
||||
|
||||
#: audits/signal_handlers.py:162
|
||||
#: audits/signal_handlers.py:120
|
||||
msgid "Application permission and SystemUser"
|
||||
msgstr "アプリケーション権限とSystemUser"
|
||||
|
||||
#: audits/signal_handlers.py:163
|
||||
#: audits/signal_handlers.py:121
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} ADD {SystemUser}"
|
||||
msgstr "{ApplicationPermission} 追加 {SystemUser}"
|
||||
|
||||
#: audits/signal_handlers.py:164
|
||||
#: audits/signal_handlers.py:122
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} REMOVE {SystemUser}"
|
||||
msgstr "{ApplicationPermission} 削除 {SystemUser}"
|
||||
|
@ -2580,6 +2586,19 @@ msgstr "は破棄されます"
|
|||
msgid "discard time"
|
||||
msgstr "時間を捨てる"
|
||||
|
||||
#: common/mixins/views.py:41
|
||||
msgid "Export all"
|
||||
msgstr "すべてエクスポート"
|
||||
|
||||
#: common/mixins/views.py:43
|
||||
msgid "Export only selected items"
|
||||
msgstr "選択項目のみエクスポート"
|
||||
|
||||
#: common/mixins/views.py:48
|
||||
#, python-format
|
||||
msgid "Export filtered: %s"
|
||||
msgstr "検索のエクスポート: %s"
|
||||
|
||||
#: common/sdk/im/exceptions.py:23
|
||||
msgid "Network error, please contact system administrator"
|
||||
msgstr "ネットワークエラー、システム管理者に連絡してください"
|
||||
|
@ -3330,10 +3349,6 @@ msgstr "権限ツリーの表示"
|
|||
msgid "Execute batch command"
|
||||
msgstr "バッチ実行コマンド"
|
||||
|
||||
#: rbac/tree.py:226
|
||||
msgid "View"
|
||||
msgstr "表示"
|
||||
|
||||
#: settings/api/alibaba_sms.py:31 settings/api/tencent_sms.py:35
|
||||
msgid "test_phone is required"
|
||||
msgstr "携帯番号をテストこのフィールドは必須です"
|
||||
|
|
|
@ -85,7 +85,7 @@ msgstr "登录复核"
|
|||
|
||||
#: acls/models/login_acl.py:24 acls/models/login_asset_acl.py:20
|
||||
#: assets/models/cmd_filter.py:30 assets/models/label.py:15 audits/models.py:37
|
||||
#: audits/models.py:60 audits/models.py:85 audits/serializers.py:100
|
||||
#: audits/models.py:62 audits/models.py:87 audits/serializers.py:100
|
||||
#: authentication/models.py:51 orgs/models.py:214 perms/models/base.py:84
|
||||
#: rbac/builtin.py:118 rbac/models/rolebinding.py:41
|
||||
#: terminal/backends/command/models.py:20
|
||||
|
@ -102,7 +102,7 @@ msgstr "规则"
|
|||
|
||||
#: acls/models/login_acl.py:31 acls/models/login_asset_acl.py:26
|
||||
#: acls/serializers/login_acl.py:17 acls/serializers/login_asset_acl.py:75
|
||||
#: assets/models/cmd_filter.py:89 audits/models.py:61 audits/serializers.py:51
|
||||
#: assets/models/cmd_filter.py:89 audits/models.py:63 audits/serializers.py:51
|
||||
#: authentication/templates/authentication/_access_key_modal.html:34
|
||||
msgid "Action"
|
||||
msgstr "动作"
|
||||
|
@ -151,7 +151,7 @@ msgstr "格式为逗号分隔的字符串, * 表示匹配所有. "
|
|||
|
||||
#: acls/serializers/login_acl.py:15 acls/serializers/login_asset_acl.py:17
|
||||
#: acls/serializers/login_asset_acl.py:51 assets/models/base.py:176
|
||||
#: assets/models/gathered_user.py:15 audits/models.py:119
|
||||
#: assets/models/gathered_user.py:15 audits/models.py:121
|
||||
#: authentication/forms.py:15 authentication/forms.py:17
|
||||
#: authentication/models.py:69
|
||||
#: authentication/templates/authentication/_msg_different_city.html:9
|
||||
|
@ -706,7 +706,7 @@ msgstr "账号备份快照"
|
|||
msgid "Trigger mode"
|
||||
msgstr "触发模式"
|
||||
|
||||
#: assets/models/backup.py:119 audits/models.py:125
|
||||
#: assets/models/backup.py:119 audits/models.py:127
|
||||
#: terminal/models/sharing.py:94
|
||||
#: xpack/plugins/change_auth_plan/models/base.py:201
|
||||
#: xpack/plugins/change_auth_plan/serializers/app.py:66
|
||||
|
@ -736,7 +736,7 @@ msgstr "未知"
|
|||
msgid "Ok"
|
||||
msgstr "成功"
|
||||
|
||||
#: assets/models/base.py:32 audits/models.py:116
|
||||
#: assets/models/base.py:32 audits/models.py:118
|
||||
#: xpack/plugins/change_auth_plan/serializers/app.py:88
|
||||
#: xpack/plugins/change_auth_plan/serializers/asset.py:198
|
||||
#: xpack/plugins/cloud/const.py:31
|
||||
|
@ -751,7 +751,7 @@ msgstr "可连接性"
|
|||
msgid "Date verified"
|
||||
msgstr "校验日期"
|
||||
|
||||
#: assets/models/base.py:177 audits/signal_handlers.py:68
|
||||
#: assets/models/base.py:177 audits/signal_handlers.py:48
|
||||
#: authentication/forms.py:22
|
||||
#: authentication/templates/authentication/login.html:181
|
||||
#: settings/serializers/auth/ldap.py:43 users/forms/profile.py:21
|
||||
|
@ -1346,7 +1346,7 @@ msgstr "没有匹配到资产,结束任务"
|
|||
msgid "Audits"
|
||||
msgstr "日志审计"
|
||||
|
||||
#: audits/models.py:27 audits/models.py:57
|
||||
#: audits/models.py:27 audits/models.py:59
|
||||
#: authentication/templates/authentication/_access_key_modal.html:65
|
||||
#: rbac/tree.py:228
|
||||
msgid "Delete"
|
||||
|
@ -1376,7 +1376,7 @@ msgstr "创建目录"
|
|||
msgid "Symlink"
|
||||
msgstr "建立软链接"
|
||||
|
||||
#: audits/models.py:38 audits/models.py:64 audits/models.py:87
|
||||
#: audits/models.py:38 audits/models.py:66 audits/models.py:89
|
||||
#: terminal/models/session.py:51 terminal/models/sharing.py:82
|
||||
msgid "Remote addr"
|
||||
msgstr "远端地址"
|
||||
|
@ -1400,7 +1400,7 @@ msgstr "成功"
|
|||
msgid "File transfer log"
|
||||
msgstr "文件管理"
|
||||
|
||||
#: audits/models.py:55
|
||||
#: audits/models.py:56
|
||||
#: authentication/templates/authentication/_access_key_modal.html:22
|
||||
#: rbac/tree.py:225
|
||||
msgid "Create"
|
||||
|
@ -1411,84 +1411,84 @@ msgstr "创建"
|
|||
msgid "Update"
|
||||
msgstr "更新"
|
||||
|
||||
#: audits/models.py:62 audits/serializers.py:63
|
||||
#: audits/models.py:64 audits/serializers.py:63
|
||||
msgid "Resource Type"
|
||||
msgstr "资源类型"
|
||||
|
||||
#: audits/models.py:63
|
||||
#: audits/models.py:65
|
||||
msgid "Resource"
|
||||
msgstr "资源"
|
||||
|
||||
#: audits/models.py:65 audits/models.py:88
|
||||
#: audits/models.py:67 audits/models.py:90
|
||||
#: terminal/backends/command/serializers.py:39
|
||||
msgid "Datetime"
|
||||
msgstr "日期"
|
||||
|
||||
#: audits/models.py:80
|
||||
#: audits/models.py:82
|
||||
msgid "Operate log"
|
||||
msgstr "操作日志"
|
||||
|
||||
#: audits/models.py:86
|
||||
#: audits/models.py:88
|
||||
msgid "Change by"
|
||||
msgstr "修改者"
|
||||
|
||||
#: audits/models.py:94
|
||||
#: audits/models.py:96
|
||||
msgid "Password change log"
|
||||
msgstr "改密日志"
|
||||
|
||||
#: audits/models.py:109
|
||||
#: audits/models.py:111
|
||||
msgid "Disabled"
|
||||
msgstr "禁用"
|
||||
|
||||
#: audits/models.py:110 settings/models.py:33
|
||||
#: audits/models.py:112 settings/models.py:33
|
||||
msgid "Enabled"
|
||||
msgstr "启用"
|
||||
|
||||
#: audits/models.py:111
|
||||
#: audits/models.py:113
|
||||
msgid "-"
|
||||
msgstr "-"
|
||||
|
||||
#: audits/models.py:120
|
||||
#: audits/models.py:122
|
||||
msgid "Login type"
|
||||
msgstr "登录方式"
|
||||
|
||||
#: audits/models.py:121
|
||||
#: audits/models.py:123
|
||||
#: tickets/serializers/ticket/meta/ticket_type/login_confirm.py:14
|
||||
msgid "Login ip"
|
||||
msgstr "登录IP"
|
||||
|
||||
#: audits/models.py:122
|
||||
#: audits/models.py:124
|
||||
#: authentication/templates/authentication/_msg_different_city.html:11
|
||||
#: tickets/serializers/ticket/meta/ticket_type/login_confirm.py:17
|
||||
msgid "Login city"
|
||||
msgstr "登录城市"
|
||||
|
||||
#: audits/models.py:123 audits/serializers.py:44
|
||||
#: audits/models.py:125 audits/serializers.py:44
|
||||
msgid "User agent"
|
||||
msgstr "用户代理"
|
||||
|
||||
#: audits/models.py:124
|
||||
#: audits/models.py:126
|
||||
#: authentication/templates/authentication/_mfa_confirm_modal.html:14
|
||||
#: users/forms/profile.py:64 users/models/user.py:684
|
||||
#: users/serializers/profile.py:121
|
||||
msgid "MFA"
|
||||
msgstr "MFA"
|
||||
|
||||
#: audits/models.py:126 terminal/models/status.py:33
|
||||
#: audits/models.py:128 terminal/models/status.py:33
|
||||
#: tickets/models/ticket.py:140 xpack/plugins/cloud/models.py:175
|
||||
#: xpack/plugins/cloud/models.py:227
|
||||
msgid "Status"
|
||||
msgstr "状态"
|
||||
|
||||
#: audits/models.py:127
|
||||
#: audits/models.py:129
|
||||
msgid "Date login"
|
||||
msgstr "登录日期"
|
||||
|
||||
#: audits/models.py:128 audits/serializers.py:46
|
||||
#: audits/models.py:130 audits/serializers.py:46
|
||||
msgid "Authentication backend"
|
||||
msgstr "认证方式"
|
||||
|
||||
#: audits/models.py:167
|
||||
#: audits/models.py:169
|
||||
msgid "User login log"
|
||||
msgstr "用户登录日志"
|
||||
|
||||
|
@ -1533,15 +1533,15 @@ msgstr "运行用户名称"
|
|||
msgid "User display"
|
||||
msgstr "用户名称"
|
||||
|
||||
#: audits/signal_handlers.py:67
|
||||
#: audits/signal_handlers.py:47
|
||||
msgid "SSH Key"
|
||||
msgstr "SSH 密钥"
|
||||
|
||||
#: audits/signal_handlers.py:69
|
||||
#: audits/signal_handlers.py:49
|
||||
msgid "SSO"
|
||||
msgstr "SSO"
|
||||
|
||||
#: audits/signal_handlers.py:70
|
||||
#: audits/signal_handlers.py:50
|
||||
msgid "Auth Token"
|
||||
msgstr "认证令牌"
|
||||
|
||||
|
@ -1557,174 +1557,174 @@ msgstr "企业微信"
|
|||
msgid "DingTalk"
|
||||
msgstr "钉钉"
|
||||
|
||||
#: audits/signal_handlers.py:73 authentication/models.py:76
|
||||
#: audits/signal_handlers.py:53 authentication/models.py:76
|
||||
msgid "Temporary token"
|
||||
msgstr "临时密码"
|
||||
|
||||
#: audits/signal_handlers.py:107
|
||||
#: audits/signal_handlers.py:65
|
||||
msgid "User and Group"
|
||||
msgstr "用户与用户组"
|
||||
|
||||
#: audits/signal_handlers.py:108
|
||||
#: audits/signal_handlers.py:66
|
||||
#, python-brace-format
|
||||
msgid "{User} JOINED {UserGroup}"
|
||||
msgstr "{User} 加入 {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:109
|
||||
#: audits/signal_handlers.py:67
|
||||
#, python-brace-format
|
||||
msgid "{User} LEFT {UserGroup}"
|
||||
msgstr "{User} 离开 {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:112
|
||||
#: audits/signal_handlers.py:70
|
||||
msgid "Asset and SystemUser"
|
||||
msgstr "资产与系统用户"
|
||||
|
||||
#: audits/signal_handlers.py:113
|
||||
#: audits/signal_handlers.py:71
|
||||
#, python-brace-format
|
||||
msgid "{Asset} ADD {SystemUser}"
|
||||
msgstr "{Asset} 添加 {SystemUser}"
|
||||
|
||||
#: audits/signal_handlers.py:114
|
||||
#: audits/signal_handlers.py:72
|
||||
#, python-brace-format
|
||||
msgid "{Asset} REMOVE {SystemUser}"
|
||||
msgstr "{Asset} 移除 {SystemUser}"
|
||||
|
||||
#: audits/signal_handlers.py:117
|
||||
#: audits/signal_handlers.py:75
|
||||
msgid "Node and Asset"
|
||||
msgstr "节点与资产"
|
||||
|
||||
#: audits/signal_handlers.py:118
|
||||
#: audits/signal_handlers.py:76
|
||||
#, python-brace-format
|
||||
msgid "{Node} ADD {Asset}"
|
||||
msgstr "{Node} 添加 {Asset}"
|
||||
|
||||
#: audits/signal_handlers.py:119
|
||||
#: audits/signal_handlers.py:77
|
||||
#, python-brace-format
|
||||
msgid "{Node} REMOVE {Asset}"
|
||||
msgstr "{Node} 移除 {Asset}"
|
||||
|
||||
#: audits/signal_handlers.py:122
|
||||
#: audits/signal_handlers.py:80
|
||||
msgid "User asset permissions"
|
||||
msgstr "用户资产授权"
|
||||
|
||||
#: audits/signal_handlers.py:123
|
||||
#: audits/signal_handlers.py:81
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} ADD {User}"
|
||||
msgstr "{AssetPermission} 添加 {User}"
|
||||
|
||||
#: audits/signal_handlers.py:124
|
||||
#: audits/signal_handlers.py:82
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} REMOVE {User}"
|
||||
msgstr "{AssetPermission} 移除 {User}"
|
||||
|
||||
#: audits/signal_handlers.py:127
|
||||
#: audits/signal_handlers.py:85
|
||||
msgid "User group asset permissions"
|
||||
msgstr "用户组资产授权"
|
||||
|
||||
#: audits/signal_handlers.py:128
|
||||
#: audits/signal_handlers.py:86
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} ADD {UserGroup}"
|
||||
msgstr "{AssetPermission} 添加 {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:129
|
||||
#: audits/signal_handlers.py:87
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} REMOVE {UserGroup}"
|
||||
msgstr "{AssetPermission} 移除 {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:132 perms/models/asset_permission.py:29
|
||||
#: audits/signal_handlers.py:90 perms/models/asset_permission.py:29
|
||||
msgid "Asset permission"
|
||||
msgstr "资产授权"
|
||||
|
||||
#: audits/signal_handlers.py:133
|
||||
#: audits/signal_handlers.py:91
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} ADD {Asset}"
|
||||
msgstr "{AssetPermission} 添加 {Asset}"
|
||||
|
||||
#: audits/signal_handlers.py:134
|
||||
#: audits/signal_handlers.py:92
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} REMOVE {Asset}"
|
||||
msgstr "{AssetPermission} 移除 {Asset}"
|
||||
|
||||
#: audits/signal_handlers.py:137
|
||||
#: audits/signal_handlers.py:95
|
||||
msgid "Node permission"
|
||||
msgstr "节点授权"
|
||||
|
||||
#: audits/signal_handlers.py:138
|
||||
#: audits/signal_handlers.py:96
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} ADD {Node}"
|
||||
msgstr "{AssetPermission} 添加 {Node}"
|
||||
|
||||
#: audits/signal_handlers.py:139
|
||||
#: audits/signal_handlers.py:97
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} REMOVE {Node}"
|
||||
msgstr "{AssetPermission} 移除 {Node}"
|
||||
|
||||
#: audits/signal_handlers.py:142
|
||||
#: audits/signal_handlers.py:100
|
||||
msgid "Asset permission and SystemUser"
|
||||
msgstr "资产授权与系统用户"
|
||||
|
||||
#: audits/signal_handlers.py:143
|
||||
#: audits/signal_handlers.py:101
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} ADD {SystemUser}"
|
||||
msgstr "{AssetPermission} 添加 {SystemUser}"
|
||||
|
||||
#: audits/signal_handlers.py:144
|
||||
#: audits/signal_handlers.py:102
|
||||
#, python-brace-format
|
||||
msgid "{AssetPermission} REMOVE {SystemUser}"
|
||||
msgstr "{AssetPermission} 移除 {SystemUser}"
|
||||
|
||||
#: audits/signal_handlers.py:147
|
||||
#: audits/signal_handlers.py:105
|
||||
msgid "User application permissions"
|
||||
msgstr "用户应用授权"
|
||||
|
||||
#: audits/signal_handlers.py:148
|
||||
#: audits/signal_handlers.py:106
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} ADD {User}"
|
||||
msgstr "{ApplicationPermission} 添加 {User}"
|
||||
|
||||
#: audits/signal_handlers.py:149
|
||||
#: audits/signal_handlers.py:107
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} REMOVE {User}"
|
||||
msgstr "{ApplicationPermission} 移除 {User}"
|
||||
|
||||
#: audits/signal_handlers.py:152
|
||||
#: audits/signal_handlers.py:110
|
||||
msgid "User group application permissions"
|
||||
msgstr "用户组应用授权"
|
||||
|
||||
#: audits/signal_handlers.py:153
|
||||
#: audits/signal_handlers.py:111
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} ADD {UserGroup}"
|
||||
msgstr "{ApplicationPermission} 添加 {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:154
|
||||
#: audits/signal_handlers.py:112
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} REMOVE {UserGroup}"
|
||||
msgstr "{ApplicationPermission} 移除 {UserGroup}"
|
||||
|
||||
#: audits/signal_handlers.py:157 perms/models/application_permission.py:38
|
||||
#: audits/signal_handlers.py:115 perms/models/application_permission.py:38
|
||||
msgid "Application permission"
|
||||
msgstr "应用授权"
|
||||
|
||||
#: audits/signal_handlers.py:158
|
||||
#: audits/signal_handlers.py:116
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} ADD {Application}"
|
||||
msgstr "{ApplicationPermission} 添加 {Application}"
|
||||
|
||||
#: audits/signal_handlers.py:159
|
||||
#: audits/signal_handlers.py:117
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} REMOVE {Application}"
|
||||
msgstr "{ApplicationPermission} 移除 {Application}"
|
||||
|
||||
#: audits/signal_handlers.py:162
|
||||
#: audits/signal_handlers.py:120
|
||||
msgid "Application permission and SystemUser"
|
||||
msgstr "应用授权与系统用户"
|
||||
|
||||
#: audits/signal_handlers.py:163
|
||||
#: audits/signal_handlers.py:121
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} ADD {SystemUser}"
|
||||
msgstr "{ApplicationPermission} 添加 {SystemUser}"
|
||||
|
||||
#: audits/signal_handlers.py:164
|
||||
#: audits/signal_handlers.py:122
|
||||
#, python-brace-format
|
||||
msgid "{ApplicationPermission} REMOVE {SystemUser}"
|
||||
msgstr "{ApplicationPermission} 移除 {SystemUser}"
|
||||
|
@ -2550,6 +2550,19 @@ msgstr "忽略的"
|
|||
msgid "discard time"
|
||||
msgstr "忽略时间"
|
||||
|
||||
#: common/mixins/views.py:41
|
||||
msgid "Export all"
|
||||
msgstr "导出所有"
|
||||
|
||||
#: common/mixins/views.py:43
|
||||
msgid "Export only selected items"
|
||||
msgstr "仅导出选择项"
|
||||
|
||||
#: common/mixins/views.py:48
|
||||
#, python-format
|
||||
msgid "Export filtered: %s"
|
||||
msgstr "导出搜素: %s"
|
||||
|
||||
#: common/sdk/im/exceptions.py:23
|
||||
msgid "Network error, please contact system administrator"
|
||||
msgstr "网络错误,请联系系统管理员"
|
||||
|
|
Loading…
Reference in New Issue