From bdab93260f05cf7a02cd7ca51dc9204041edcfc4 Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 2 Jun 2021 17:00:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B5=84=E4=BA=A7=E7=94=A8=E6=88=B7API?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=20BackendDisplay=20=E5=92=8C=20Name=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/backends/base.py | 4 +- apps/assets/backends/db.py | 15 +++- apps/assets/models/asset_user.py | 1 + apps/assets/serializers/asset_user.py | 5 +- apps/locale/zh/LC_MESSAGES/django.mo | Bin 75313 -> 75515 bytes apps/locale/zh/LC_MESSAGES/django.po | 94 ++++++++++++++------------ 6 files changed, 72 insertions(+), 47 deletions(-) diff --git a/apps/assets/backends/base.py b/apps/assets/backends/base.py index 3b27a57af..17115afaa 100644 --- a/apps/assets/backends/base.py +++ b/apps/assets/backends/base.py @@ -31,11 +31,11 @@ class BaseBackend: def qs_to_values(qs): values = qs.values( 'hostname', 'ip', "asset_id", - 'username', 'password', 'private_key', 'public_key', + 'name', 'username', 'password', 'private_key', 'public_key', 'score', 'version', "asset_username", "union_id", 'date_created', 'date_updated', - 'org_id', 'backend', + 'org_id', 'backend', 'backend_display' ) return values diff --git a/apps/assets/backends/db.py b/apps/assets/backends/db.py index 386f0ee29..aa3e1ef78 100644 --- a/apps/assets/backends/db.py +++ b/apps/assets/backends/db.py @@ -106,6 +106,7 @@ class DBBackend(BaseBackend): class SystemUserBackend(DBBackend): model = SystemUser.assets.through backend = 'system_user' + backend_display = _('System user') prefer = backend base_score = 0 union_id_length = 2 @@ -138,6 +139,7 @@ class SystemUserBackend(DBBackend): kwargs = dict( hostname=F("asset__hostname"), ip=F("asset__ip"), + name=F("systemuser__name"), username=F("systemuser__username"), password=F("systemuser__password"), private_key=F("systemuser__private_key"), @@ -152,7 +154,8 @@ class SystemUserBackend(DBBackend): union_id=Concat(F("systemuser_id"), Value("_"), F("asset_id"), output_field=CharField()), org_id=F("asset__org_id"), - backend=Value(self.backend, CharField()) + backend=Value(self.backend, CharField()), + backend_display=Value(self.backend_display, CharField()), ) return kwargs @@ -174,12 +177,17 @@ class SystemUserBackend(DBBackend): class DynamicSystemUserBackend(SystemUserBackend): backend = 'system_user_dynamic' + backend_display = _('System user(Dynamic)') prefer = 'system_user' union_id_length = 3 def get_annotate(self): kwargs = super().get_annotate() kwargs.update(dict( + name=Concat( + F("systemuser__users__name"), Value('('), F("systemuser__name"), Value(')'), + output_field=CharField() + ), username=F("systemuser__users__username"), asset_username=Concat( F("asset__id"), Value("_"), @@ -221,6 +229,7 @@ class DynamicSystemUserBackend(SystemUserBackend): class AdminUserBackend(DBBackend): model = Asset backend = 'admin_user' + backend_display = _('Admin user') prefer = backend base_score = 200 @@ -246,6 +255,7 @@ class AdminUserBackend(DBBackend): def all(self): qs = self.model.objects.all().annotate( asset_id=F("id"), + name=F("admin_user__name"), username=F("admin_user__username"), password=F("admin_user__password"), private_key=F("admin_user__private_key"), @@ -256,6 +266,7 @@ class AdminUserBackend(DBBackend): asset_username=Concat(F("id"), Value("_"), F("admin_user__username"), output_field=CharField()), union_id=Concat(F("admin_user_id"), Value("_"), F("id"), output_field=CharField()), backend=Value(self.backend, CharField()), + backend_display=Value(self.backend_display, CharField()), ) qs = self.qs_to_values(qs) return qs @@ -264,6 +275,7 @@ class AdminUserBackend(DBBackend): class AuthbookBackend(DBBackend): model = AuthBook backend = 'db' + backend_display = _('Database') prefer = backend base_score = 400 @@ -313,6 +325,7 @@ class AuthbookBackend(DBBackend): asset_username=Concat(F("asset__id"), Value("_"), F("username"), output_field=CharField()), union_id=Concat(F("id"), Value("_"), F("asset_id"), output_field=CharField()), backend=Value(self.backend, CharField()), + backend_display=Value(self.backend_display, CharField()), ) qs = self.qs_to_values(qs) return qs diff --git a/apps/assets/models/asset_user.py b/apps/assets/models/asset_user.py index 118d4549b..ac9112427 100644 --- a/apps/assets/models/asset_user.py +++ b/apps/assets/models/asset_user.py @@ -7,6 +7,7 @@ class AssetUser(AuthBook): hostname = "" ip = "" backend = "" + backend_display = "" union_id = "" asset_username = "" diff --git a/apps/assets/serializers/asset_user.py b/apps/assets/serializers/asset_user.py index 19cb2adc7..90145399f 100644 --- a/apps/assets/serializers/asset_user.py +++ b/apps/assets/serializers/asset_user.py @@ -47,16 +47,17 @@ class AssetUserReadSerializer(AssetUserWriteSerializer): ip = serializers.CharField(read_only=True, label=_("IP")) asset = serializers.CharField(source='asset_id', label=_('Asset')) backend = serializers.CharField(read_only=True, label=_("Backend")) + backend_display = serializers.CharField(read_only=True, label=_("Backend (Display)")) class Meta(AssetUserWriteSerializer.Meta): read_only_fields = ( 'date_created', 'date_updated', 'created_by', 'version', ) - fields_mini = ['id', 'username'] + fields_mini = ['id', 'name', 'username'] fields_write_only = ['password', 'private_key', "public_key"] fields_small = fields_mini + fields_write_only + [ - 'backend', 'version', + 'backend', 'backend_display', 'version', 'date_created', "date_updated", 'comment' ] diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 53adc123954e272a9f8001bda791d4b7afcd7cc8..562853c5ed03958ff5cc4444f0131527efcd9509 100644 GIT binary patch delta 22171 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\n" "Language-Team: JumpServer team\n" @@ -121,7 +121,7 @@ msgstr "系统用户" #: applications/serializers/attrs/application_category/remote_app.py:33 #: assets/models/asset.py:355 assets/models/authbook.py:26 #: assets/models/gathered_user.py:14 assets/serializers/admin_user.py:34 -#: assets/serializers/asset_user.py:48 assets/serializers/asset_user.py:89 +#: assets/serializers/asset_user.py:48 assets/serializers/asset_user.py:90 #: assets/serializers/system_user.py:201 audits/models.py:38 #: perms/models/asset_permission.py:99 templates/index.html:82 #: terminal/backends/command/models.py:19 @@ -184,7 +184,7 @@ msgstr "格式为逗号分隔的字符串, * 表示匹配所有. " #: users/templates/users/_select_user_modal.html:14 #: xpack/plugins/change_auth_plan/models.py:47 #: xpack/plugins/change_auth_plan/models.py:278 -#: xpack/plugins/cloud/serializers.py:51 +#: xpack/plugins/cloud/serializers.py:65 msgid "Username" msgstr "用户名" @@ -233,6 +233,7 @@ msgstr "所有复核人都不属于组织 `{}`" #: applications/const.py:9 #: applications/serializers/attrs/application_category/db.py:14 #: applications/serializers/attrs/application_type/mysql_workbench.py:26 +#: assets/backends/db.py:278 msgid "Database" msgstr "数据库" @@ -285,7 +286,7 @@ msgid "Cluster" msgstr "集群" #: applications/serializers/attrs/application_category/db.py:11 -#: ops/models/adhoc.py:146 xpack/plugins/cloud/serializers.py:49 +#: ops/models/adhoc.py:146 xpack/plugins/cloud/serializers.py:63 msgid "Host" msgstr "主机" @@ -295,7 +296,7 @@ msgstr "主机" #: applications/serializers/attrs/application_type/oracle.py:11 #: applications/serializers/attrs/application_type/pgsql.py:11 #: assets/models/asset.py:188 assets/models/domain.py:53 -#: xpack/plugins/cloud/serializers.py:50 +#: xpack/plugins/cloud/serializers.py:64 msgid "Port" msgstr "端口" @@ -315,7 +316,7 @@ msgstr "目标URL" #: applications/serializers/attrs/application_type/custom.py:25 #: applications/serializers/attrs/application_type/mysql_workbench.py:34 #: applications/serializers/attrs/application_type/vmware_client.py:30 -#: assets/models/base.py:252 assets/serializers/asset_user.py:76 +#: assets/models/base.py:252 assets/serializers/asset_user.py:77 #: audits/signals_handler.py:58 authentication/forms.py:22 #: authentication/templates/authentication/login.html:164 #: settings/serializers/settings.py:93 users/forms/profile.py:21 @@ -325,7 +326,7 @@ msgstr "目标URL" #: xpack/plugins/change_auth_plan/models.py:68 #: xpack/plugins/change_auth_plan/models.py:190 #: xpack/plugins/change_auth_plan/models.py:285 -#: xpack/plugins/cloud/serializers.py:53 +#: xpack/plugins/cloud/serializers.py:67 msgid "Password" msgstr "密码" @@ -357,11 +358,35 @@ msgstr "不能删除根节点 ({})" msgid "Deletion failed and the node contains assets" msgstr "删除失败,节点包含资产" -#: assets/backends/db.py:244 +#: assets/backends/db.py:109 assets/models/user.py:228 audits/models.py:39 +#: perms/models/application_permission.py:31 +#: perms/models/asset_permission.py:101 templates/_nav.html:45 +#: terminal/backends/command/models.py:20 +#: terminal/backends/command/serializers.py:14 terminal/models/session.py:42 +#: users/templates/users/_granted_assets.html:27 +#: users/templates/users/user_asset_permission.html:42 +#: users/templates/users/user_asset_permission.html:76 +#: users/templates/users/user_asset_permission.html:159 +#: users/templates/users/user_database_app_permission.html:40 +#: users/templates/users/user_database_app_permission.html:67 +msgid "System user" +msgstr "系统用户" + +#: assets/backends/db.py:180 +msgid "System user(Dynamic)" +msgstr "系统用户(动态)" + +#: assets/backends/db.py:232 assets/models/asset.py:196 +#: assets/models/cluster.py:19 assets/models/user.py:66 templates/_nav.html:44 +#: xpack/plugins/cloud/models.py:92 xpack/plugins/cloud/serializers.py:160 +msgid "Admin user" +msgstr "管理用户" + +#: assets/backends/db.py:253 msgid "Could not remove asset admin user" msgstr "不能移除资产的管理用户账号" -#: assets/backends/db.py:305 +#: assets/backends/db.py:317 msgid "Latest version could not be delete" msgstr "最新版本的不能被删除" @@ -405,12 +430,6 @@ msgstr "节点" msgid "Is active" msgstr "激活" -#: assets/models/asset.py:196 assets/models/cluster.py:19 -#: assets/models/user.py:66 templates/_nav.html:44 -#: xpack/plugins/cloud/models.py:92 xpack/plugins/cloud/serializers.py:146 -msgid "Admin user" -msgstr "管理用户" - #: assets/models/asset.py:199 msgid "Public IP" msgstr "公网IP" @@ -678,7 +697,7 @@ msgstr "ssh私钥" #: users/templates/users/user_asset_permission.html:41 #: users/templates/users/user_asset_permission.html:73 #: users/templates/users/user_asset_permission.html:158 -#: xpack/plugins/cloud/models.py:89 xpack/plugins/cloud/serializers.py:147 +#: xpack/plugins/cloud/models.py:89 xpack/plugins/cloud/serializers.py:161 msgid "Node" msgstr "节点" @@ -740,20 +759,6 @@ msgstr "家目录" msgid "System groups" msgstr "用户组" -#: assets/models/user.py:228 audits/models.py:39 -#: perms/models/application_permission.py:31 -#: perms/models/asset_permission.py:101 templates/_nav.html:45 -#: terminal/backends/command/models.py:20 -#: terminal/backends/command/serializers.py:14 terminal/models/session.py:42 -#: users/templates/users/_granted_assets.html:27 -#: users/templates/users/user_asset_permission.html:42 -#: users/templates/users/user_asset_permission.html:76 -#: users/templates/users/user_asset_permission.html:159 -#: users/templates/users/user_database_app_permission.html:40 -#: users/templates/users/user_database_app_permission.html:67 -msgid "System user" -msgstr "系统用户" - #: assets/models/utils.py:35 #, python-format msgid "%(value)s is not an even number" @@ -813,12 +818,16 @@ msgstr "ID" msgid "Backend" msgstr "后端" -#: assets/serializers/asset_user.py:80 users/forms/profile.py:160 +#: assets/serializers/asset_user.py:50 +msgid "Backend (Display)" +msgstr "后端 (显示名称)" + +#: assets/serializers/asset_user.py:81 users/forms/profile.py:160 #: users/models/user.py:580 users/templates/users/user_password_update.html:48 msgid "Public key" msgstr "SSH公钥" -#: assets/serializers/asset_user.py:84 users/models/user.py:577 +#: assets/serializers/asset_user.py:85 users/models/user.py:577 msgid "Private key" msgstr "ssh私钥" @@ -4003,7 +4012,7 @@ msgid "Security token validation" msgstr "安全令牌验证" #: users/templates/users/_base_otp.html:14 xpack/plugins/cloud/models.py:78 -#: xpack/plugins/cloud/serializers.py:145 +#: xpack/plugins/cloud/serializers.py:159 msgid "Account" msgstr "账户" @@ -4744,7 +4753,7 @@ msgstr "云服务商" msgid "Cloud account" msgstr "云账号" -#: xpack/plugins/cloud/models.py:81 xpack/plugins/cloud/serializers.py:126 +#: xpack/plugins/cloud/models.py:81 xpack/plugins/cloud/serializers.py:140 msgid "Regions" msgstr "地域" @@ -4752,7 +4761,7 @@ msgstr "地域" msgid "Hostname strategy" msgstr "主机名策略" -#: xpack/plugins/cloud/models.py:95 xpack/plugins/cloud/serializers.py:149 +#: xpack/plugins/cloud/models.py:95 xpack/plugins/cloud/serializers.py:163 msgid "Always update" msgstr "总是更新" @@ -4944,20 +4953,24 @@ msgstr "" msgid "Subscription ID" msgstr "" -#: xpack/plugins/cloud/serializers.py:124 +#: xpack/plugins/cloud/serializers.py:49 +msgid "This field is required" +msgstr "这个字段是必填项" + +#: xpack/plugins/cloud/serializers.py:138 msgid "History count" msgstr "执行次数" -#: xpack/plugins/cloud/serializers.py:125 +#: xpack/plugins/cloud/serializers.py:139 msgid "Instance count" msgstr "实例个数" -#: xpack/plugins/cloud/serializers.py:148 +#: xpack/plugins/cloud/serializers.py:162 #: xpack/plugins/gathered_user/serializers.py:20 msgid "Periodic display" msgstr "定时执行" -#: xpack/plugins/cloud/utils.py:64 +#: xpack/plugins/cloud/utils.py:65 msgid "Account unavailable" msgstr "账户无效" @@ -5045,9 +5058,6 @@ msgstr "旗舰版" msgid "Community edition" msgstr "社区版" -#~ msgid "This field is required" -#~ msgstr "这个字段是必填项" - #~ msgid "{} is required" #~ msgstr "{} 字段是必填项"