From af85d551ad99258d0c65e3c1c47d11c872039990 Mon Sep 17 00:00:00 2001 From: xinwen Date: Fri, 14 Aug 2020 17:09:23 +0800 Subject: [PATCH] =?UTF-8?q?fix(users):=20=E4=BF=AE=E6=94=B9=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=A7=92=E8=89=B2=E6=98=BE=E7=A4=BA=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 56654 -> 56727 bytes apps/locale/zh/LC_MESSAGES/django.po | 153 +++++++++--------- .../migrations/0029_auto_20200814_1650.py | 18 +++ apps/users/models/user.py | 4 +- apps/users/serializers/user.py | 7 +- 5 files changed, 105 insertions(+), 77 deletions(-) create mode 100644 apps/users/migrations/0029_auto_20200814_1650.py diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 27d124dbad066e7c581997b82e21ae13c5acb293..1c1c347551b3c911cf5ad7a019cd1313f60a8cbe 100644 GIT binary patch delta 16596 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 ZMYqxy`Qte&ZcN&EGh^JkHisWa{vQv=In)3E delta 16531 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\n" "Language-Team: JumpServer team\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: applications/const.py:52 +#: applications/const.py:53 msgid "Custom" msgstr "自定义" @@ -27,8 +27,8 @@ msgstr "自定义" #: assets/models/cmd_filter.py:21 assets/models/domain.py:20 #: assets/models/group.py:20 assets/models/label.py:18 ops/mixin.py:24 #: orgs/models.py:22 perms/models/base.py:48 settings/models.py:27 -#: terminal/models.py:26 terminal/models.py:342 terminal/models.py:374 -#: terminal/models.py:411 users/forms/profile.py:20 users/models/group.py:15 +#: terminal/models.py:27 terminal/models.py:344 terminal/models.py:376 +#: terminal/models.py:413 users/forms/profile.py:20 users/models/group.py:15 #: users/models/user.py:489 users/templates/users/_select_user_modal.html:13 #: users/templates/users/user_asset_permission.html:37 #: users/templates/users/user_asset_permission.html:154 @@ -47,7 +47,7 @@ msgid "Name" msgstr "名称" #: applications/models/database_app.py:22 applications/models/k8s_app.py:14 -#: assets/models/cmd_filter.py:52 terminal/models.py:376 terminal/models.py:413 +#: assets/models/cmd_filter.py:52 terminal/models.py:378 terminal/models.py:415 #: tickets/models/ticket.py:40 #: users/templates/users/user_granted_database_app.html:35 msgid "Type" @@ -77,8 +77,8 @@ msgstr "数据库" #: assets/models/cmd_filter.py:57 assets/models/domain.py:21 #: assets/models/domain.py:54 assets/models/group.py:23 #: assets/models/label.py:23 ops/models/adhoc.py:37 orgs/models.py:25 -#: perms/models/base.py:56 settings/models.py:32 terminal/models.py:36 -#: terminal/models.py:381 terminal/models.py:418 users/models/group.py:16 +#: perms/models/base.py:56 settings/models.py:32 terminal/models.py:37 +#: terminal/models.py:383 terminal/models.py:420 users/models/group.py:16 #: users/models/user.py:522 users/templates/users/user_detail.html:115 #: users/templates/users/user_granted_database_app.html:38 #: users/templates/users/user_granted_remote_app.html:37 @@ -116,11 +116,11 @@ msgstr "Kubernetes应用" #: applications/models/remote_app.py:23 assets/models/asset.py:352 #: assets/models/authbook.py:26 assets/models/gathered_user.py:14 #: assets/serializers/admin_user.py:32 assets/serializers/asset_user.py:47 -#: assets/serializers/asset_user.py:84 assets/serializers/system_user.py:44 -#: assets/serializers/system_user.py:176 audits/models.py:38 +#: assets/serializers/asset_user.py:84 assets/serializers/system_user.py:46 +#: assets/serializers/system_user.py:179 audits/models.py:38 #: perms/forms/asset_permission.py:89 perms/models/asset_permission.py:90 #: templates/index.html:82 terminal/backends/command/models.py:19 -#: terminal/backends/command/serializers.py:13 terminal/models.py:187 +#: terminal/backends/command/serializers.py:13 terminal/models.py:188 #: users/templates/users/user_asset_permission.html:40 #: users/templates/users/user_asset_permission.html:70 #: users/templates/users/user_granted_remote_app.html:36 @@ -233,7 +233,7 @@ msgid "Hostname" msgstr "主机名" #: assets/models/asset.py:190 assets/models/domain.py:52 -#: assets/models/user.py:116 terminal/serializers/session.py:29 +#: assets/models/user.py:117 terminal/serializers/session.py:29 msgid "Protocol" msgstr "协议" @@ -247,7 +247,7 @@ msgstr "协议组" msgid "Domain" msgstr "网域" -#: assets/models/asset.py:195 assets/models/user.py:111 +#: assets/models/asset.py:195 assets/models/user.py:112 #: perms/models/asset_permission.py:91 #: xpack/plugins/change_auth_plan/models.py:56 #: xpack/plugins/gathered_user/models.py:24 @@ -261,7 +261,7 @@ msgid "Is active" msgstr "激活" #: assets/models/asset.py:199 assets/models/cluster.py:19 -#: assets/models/user.py:65 templates/_nav.html:44 +#: assets/models/user.py:66 templates/_nav.html:44 #: xpack/plugins/cloud/models.py:133 xpack/plugins/cloud/serializers.py:83 msgid "Admin user" msgstr "管理用户" @@ -453,7 +453,7 @@ msgstr "北京电信" msgid "BGP full netcom" msgstr "BGP全网通" -#: assets/models/cmd_filter.py:33 assets/models/user.py:121 +#: assets/models/cmd_filter.py:33 assets/models/user.py:122 msgid "Command filter" msgstr "命令过滤器" @@ -462,7 +462,7 @@ msgid "Regex" msgstr "正则表达式" #: assets/models/cmd_filter.py:41 ops/models/command.py:23 -#: terminal/backends/command/serializers.py:15 terminal/models.py:196 +#: terminal/backends/command/serializers.py:15 terminal/models.py:197 msgid "Command" msgstr "命令" @@ -478,7 +478,7 @@ msgstr "允许" msgid "Filter" msgstr "过滤器" -#: assets/models/cmd_filter.py:53 assets/models/user.py:115 +#: assets/models/cmd_filter.py:53 assets/models/user.py:116 msgid "Priority" msgstr "优先级" @@ -551,7 +551,7 @@ msgstr "默认资产组" #: perms/forms/asset_permission.py:83 perms/forms/database_app_permission.py:38 #: perms/forms/remote_app_permission.py:40 perms/models/base.py:49 #: templates/index.html:78 terminal/backends/command/models.py:18 -#: terminal/backends/command/serializers.py:12 terminal/models.py:185 +#: terminal/backends/command/serializers.py:12 terminal/models.py:186 #: tickets/models/ticket.py:30 tickets/models/ticket.py:137 #: tickets/serializers/request_asset_perm.py:65 #: tickets/serializers/ticket.py:31 users/forms/group.py:15 @@ -597,8 +597,8 @@ msgstr "收藏夹" msgid "Key" msgstr "键" -#: assets/models/node.py:511 assets/serializers/system_user.py:43 -#: assets/serializers/system_user.py:175 perms/forms/asset_permission.py:92 +#: assets/models/node.py:511 assets/serializers/system_user.py:45 +#: assets/serializers/system_user.py:178 perms/forms/asset_permission.py:92 #: perms/forms/asset_permission.py:99 #: users/templates/users/user_asset_permission.html:41 #: users/templates/users/user_asset_permission.html:73 @@ -607,65 +607,73 @@ msgstr "键" msgid "Node" msgstr "节点" -#: assets/models/user.py:107 +#: assets/models/user.py:108 msgid "Automatic login" msgstr "自动登录" -#: assets/models/user.py:108 +#: assets/models/user.py:109 msgid "Manually login" msgstr "手动登录" -#: assets/models/user.py:110 +#: assets/models/user.py:111 msgid "Username same with user" msgstr "用户名与用户相同" -#: assets/models/user.py:112 templates/_nav.html:39 +#: assets/models/user.py:113 templates/_nav.html:39 #: xpack/plugins/change_auth_plan/models.py:52 msgid "Assets" msgstr "资产管理" -#: assets/models/user.py:113 templates/_nav.html:17 +#: assets/models/user.py:114 templates/_nav.html:17 #: users/views/profile/password.py:42 users/views/profile/pubkey.py:36 msgid "Users" msgstr "用户管理" -#: assets/models/user.py:114 users/templates/users/user_group_list.html:90 +#: assets/models/user.py:115 users/templates/users/user_group_list.html:90 #: users/templates/users/user_profile.html:124 msgid "User groups" msgstr "用户组" -#: assets/models/user.py:117 +#: assets/models/user.py:118 msgid "Auto push" msgstr "自动推送" -#: assets/models/user.py:118 +#: assets/models/user.py:119 msgid "Sudo" msgstr "Sudo" -#: assets/models/user.py:119 +#: assets/models/user.py:120 msgid "Shell" msgstr "Shell" -#: assets/models/user.py:120 +#: assets/models/user.py:121 msgid "Login mode" msgstr "登录模式" -#: assets/models/user.py:122 +#: assets/models/user.py:123 msgid "SFTP Root" msgstr "SFTP根路径" -#: assets/models/user.py:123 authentication/models.py:88 +#: assets/models/user.py:124 authentication/models.py:88 msgid "Token" msgstr "" -#: assets/models/user.py:198 audits/models.py:39 +#: assets/models/user.py:125 +msgid "Home" +msgstr "家目录" + +#: assets/models/user.py:126 +msgid "System groups" +msgstr "用户组" + +#: assets/models/user.py:201 audits/models.py:39 #: perms/forms/asset_permission.py:95 perms/forms/remote_app_permission.py:49 #: perms/models/asset_permission.py:92 #: perms/models/database_app_permission.py:22 #: perms/models/k8s_app_permission.py:22 #: perms/models/remote_app_permission.py:16 templates/_nav.html:45 #: terminal/backends/command/models.py:20 -#: terminal/backends/command/serializers.py:14 terminal/models.py:189 +#: terminal/backends/command/serializers.py:14 terminal/models.py:190 #: tickets/serializers/request_asset_perm.py:27 #: users/templates/users/_granted_assets.html:27 #: users/templates/users/user_asset_permission.html:42 @@ -753,23 +761,23 @@ msgstr "值" msgid "The same level node name cannot be the same" msgstr "同级别节点名字不能重复" -#: assets/serializers/system_user.py:45 assets/serializers/system_user.py:177 +#: assets/serializers/system_user.py:47 assets/serializers/system_user.py:180 msgid "Login mode display" msgstr "登录模式显示" -#: assets/serializers/system_user.py:85 +#: assets/serializers/system_user.py:87 msgid "Username same with user with protocol {} only allow 1" msgstr "用户名和用户相同的一种协议只允许存在一个" -#: assets/serializers/system_user.py:98 +#: assets/serializers/system_user.py:100 msgid "* Automatic login mode must fill in the username." msgstr "自动登录模式,必须填写用户名" -#: assets/serializers/system_user.py:106 +#: assets/serializers/system_user.py:108 msgid "Path should starts with /" msgstr "路径应该以 / 开头" -#: assets/serializers/system_user.py:117 +#: assets/serializers/system_user.py:119 msgid "Password or private key required" msgstr "密码或密钥密码需要一个" @@ -821,25 +829,25 @@ msgstr "更新节点资产硬件信息: {}" msgid "Gather assets users" msgstr "收集资产上的用户" -#: assets/tasks/push_system_user.py:148 +#: assets/tasks/push_system_user.py:176 #: assets/tasks/system_user_connectivity.py:89 msgid "System user is dynamic: {}" msgstr "系统用户是动态的: {}" -#: assets/tasks/push_system_user.py:179 +#: assets/tasks/push_system_user.py:207 msgid "Start push system user for platform: [{}]" msgstr "推送系统用户到平台: [{}]" -#: assets/tasks/push_system_user.py:180 +#: assets/tasks/push_system_user.py:208 #: assets/tasks/system_user_connectivity.py:81 msgid "Hosts count: {}" msgstr "主机数量: {}" -#: assets/tasks/push_system_user.py:197 assets/tasks/push_system_user.py:213 +#: assets/tasks/push_system_user.py:225 assets/tasks/push_system_user.py:241 msgid "Push system users to assets: {}" msgstr "推送系统用户到入资产: {}" -#: assets/tasks/push_system_user.py:205 +#: assets/tasks/push_system_user.py:233 msgid "Push system users to asset: {}({}) => {}" msgstr "推送系统用户到入资产: {}({}) => {}" @@ -919,7 +927,7 @@ msgid "Symlink" msgstr "建立软链接" #: audits/models.py:37 audits/models.py:60 audits/models.py:71 -#: terminal/models.py:192 +#: terminal/models.py:193 msgid "Remote addr" msgstr "远端地址" @@ -937,7 +945,7 @@ msgid "Success" msgstr "成功" #: audits/models.py:43 ops/models/command.py:28 perms/models/base.py:52 -#: terminal/models.py:199 tickets/serializers/request_asset_perm.py:29 +#: terminal/models.py:200 tickets/serializers/request_asset_perm.py:29 #: xpack/plugins/change_auth_plan/models.py:177 #: xpack/plugins/change_auth_plan/models.py:308 #: xpack/plugins/gathered_user/models.py:76 @@ -1191,7 +1199,7 @@ msgstr "登录复核 {}" msgid "SSO auth closed" msgstr "SSO 认证关闭了" -#: authentication/errors.py:218 authentication/views/login.py:237 +#: authentication/errors.py:218 authentication/views/login.py:243 msgid "Your password is too simple, please change it for security" msgstr "你的密码过于简单,为了安全,请修改" @@ -1374,11 +1382,11 @@ msgstr "复制成功" msgid "Welcome back, please enter username and password to login" msgstr "欢迎回来,请输入用户名和密码登录" -#: authentication/views/login.py:83 +#: authentication/views/login.py:84 msgid "Please enable cookies and try again." msgstr "设置你的浏览器支持cookie" -#: authentication/views/login.py:183 +#: authentication/views/login.py:189 msgid "" "Wait for {} confirm, You also can copy link to her/him
\n" " Don't close this page" @@ -1386,19 +1394,19 @@ msgstr "" "等待 {} 确认, 你也可以复制链接发给他/她
\n" " 不要关闭本页面" -#: authentication/views/login.py:188 +#: authentication/views/login.py:194 msgid "No ticket found" msgstr "没有发现工单" -#: authentication/views/login.py:220 +#: authentication/views/login.py:226 msgid "Logout success" msgstr "退出登录成功" -#: authentication/views/login.py:221 +#: authentication/views/login.py:227 msgid "Logout success, return login page" msgstr "退出登录成功,返回到登录页面" -#: authentication/views/login.py:236 +#: authentication/views/login.py:242 msgid "Please change your password" msgstr "请修改密码" @@ -2469,63 +2477,63 @@ msgstr "风险等级" msgid "Bulk create not support" msgstr "不支持批量创建" -#: terminal/models.py:27 +#: terminal/models.py:28 msgid "Remote Address" msgstr "远端地址" -#: terminal/models.py:28 +#: terminal/models.py:29 msgid "SSH Port" msgstr "SSH端口" -#: terminal/models.py:29 +#: terminal/models.py:30 msgid "HTTP Port" msgstr "HTTP端口" -#: terminal/models.py:30 +#: terminal/models.py:31 msgid "Command storage" msgstr "命令存储" -#: terminal/models.py:31 +#: terminal/models.py:32 msgid "Replay storage" msgstr "录像存储" -#: terminal/models.py:154 +#: terminal/models.py:155 msgid "Session Online" msgstr "在线会话" -#: terminal/models.py:155 +#: terminal/models.py:156 msgid "CPU Usage" msgstr "CPU使用" -#: terminal/models.py:156 +#: terminal/models.py:157 msgid "Memory Used" msgstr "内存使用" -#: terminal/models.py:157 +#: terminal/models.py:158 msgid "Connections" msgstr "连接数" -#: terminal/models.py:158 +#: terminal/models.py:159 msgid "Threads" msgstr "线程数" -#: terminal/models.py:159 +#: terminal/models.py:160 msgid "Boot Time" msgstr "运行时间" -#: terminal/models.py:191 +#: terminal/models.py:192 msgid "Login from" msgstr "登录来源" -#: terminal/models.py:195 +#: terminal/models.py:196 msgid "Replay" msgstr "回放" -#: terminal/models.py:200 +#: terminal/models.py:201 msgid "Date end" msgstr "结束日期" -#: terminal/models.py:343 +#: terminal/models.py:345 msgid "Args" msgstr "参数" @@ -2863,12 +2871,12 @@ msgid "Password strategy" msgstr "密码策略" #: users/models/user.py:156 -msgid "Super administrator" -msgstr "超级管理员" +msgid "System administrator" +msgstr "系统管理员" #: users/models/user.py:158 -msgid "Super auditor" -msgstr "超级审计员" +msgid "System auditor" +msgstr "系统审计员" #: users/models/user.py:159 msgid "Application" @@ -4489,9 +4497,6 @@ msgstr "旗舰版" #~ msgid "Have existed: " #~ msgstr "已经存在: " -#~ msgid "Home" -#~ msgstr "家目录" - #~ msgid "Uid" #~ msgstr "Uid" diff --git a/apps/users/migrations/0029_auto_20200814_1650.py b/apps/users/migrations/0029_auto_20200814_1650.py new file mode 100644 index 000000000..c6cf3517b --- /dev/null +++ b/apps/users/migrations/0029_auto_20200814_1650.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.13 on 2020-08-14 08:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0028_auto_20200728_1805'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='role', + field=models.CharField(blank=True, choices=[('Admin', 'System administrator'), ('User', 'User'), ('Auditor', 'System auditor'), ('App', 'Application')], default='User', max_length=10, verbose_name='Role'), + ), + ] diff --git a/apps/users/models/user.py b/apps/users/models/user.py index 6bda75b0a..b496f17bd 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -153,9 +153,9 @@ class AuthMixin: class RoleMixin: class ROLE(ChoiceSet): - ADMIN = choices.ADMIN, _('Super administrator') + ADMIN = choices.ADMIN, _('System administrator') USER = choices.USER, _('User') - AUDITOR = choices.AUDITOR, _('Super auditor') + AUDITOR = choices.AUDITOR, _('System auditor') APP = 'App', _('Application') role = ROLE.USER diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index 908978d75..e246ba203 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -111,7 +111,12 @@ class UserSerializer(CommonBulkSerializerMixin, serializers.ModelSerializer): role._choices = choices def get_total_role_display(self, instance): - return ' | '.join({str(instance.role_display), str(instance.org_role_display)}) + role_display = instance.role_display + org_role_display = instance.org_role_display + if role_display == org_role_display: + return role_display + else: + return f'{role_display} | {org_role_display}' def validate_role(self, value): request = self.context.get('request')