From 6e8922da1ccf40aa9704a4eda43598bd7c1bfe7c Mon Sep 17 00:00:00 2001 From: xinwen Date: Wed, 11 Nov 2020 10:27:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(trans):=20=E5=AE=8C=E5=96=84=E7=BF=BB?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/applications/serializers/database_app.py | 3 + apps/applications/serializers/k8s_app.py | 2 +- apps/applications/serializers/remote_app.py | 6 +- apps/assets/serializers/asset.py | 5 +- apps/assets/serializers/domain.py | 9 +- apps/assets/serializers/system_user.py | 11 +- apps/audits/serializers.py | 13 +- apps/locale/zh/LC_MESSAGES/django.mo | Bin 60310 -> 62241 bytes apps/locale/zh/LC_MESSAGES/django.po | 302 +++++++++++++----- apps/perms/serializers/asset/permission.py | 12 +- .../serializers/database_app_permission.py | 16 +- apps/perms/serializers/k8s_app_permission.py | 15 + .../serializers/remote_app_permission.py | 8 + apps/terminal/backends/command/serializers.py | 4 +- apps/terminal/serializers/session.py | 10 +- apps/users/serializers/group.py | 4 +- apps/users/serializers/user.py | 14 +- 17 files changed, 320 insertions(+), 114 deletions(-) diff --git a/apps/applications/serializers/database_app.py b/apps/applications/serializers/database_app.py index fb7c74d42..ac65764cd 100644 --- a/apps/applications/serializers/database_app.py +++ b/apps/applications/serializers/database_app.py @@ -46,3 +46,6 @@ class DatabaseAppSerializer(BulkOrgResourceModelSerializer): 'created_by', 'date_created', 'date_updated' 'get_type_display', ] + extra_kwargs = { + 'get_type_display': {'label': _('Type for display')}, + } diff --git a/apps/applications/serializers/k8s_app.py b/apps/applications/serializers/k8s_app.py index bf05903dc..6bf685468 100644 --- a/apps/applications/serializers/k8s_app.py +++ b/apps/applications/serializers/k8s_app.py @@ -14,7 +14,7 @@ class K8sAttrsSerializer(CloudAttrsSerializer): class K8sAppSerializer(BulkOrgResourceModelSerializer): - type_display = serializers.CharField(source='get_type_display', read_only=True) + type_display = serializers.CharField(source='get_type_display', read_only=True, label=_('Type for display')) class Meta: model = models.K8sApp diff --git a/apps/applications/serializers/remote_app.py b/apps/applications/serializers/remote_app.py index 65190f38c..5e4d8763f 100644 --- a/apps/applications/serializers/remote_app.py +++ b/apps/applications/serializers/remote_app.py @@ -143,7 +143,7 @@ class RemoteAppParamsDictField(CustomMetaDictField): # TODO: DELETE class RemoteAppSerializer(BulkOrgResourceModelSerializer): - params = RemoteAppParamsDictField() + params = RemoteAppParamsDictField(label=_('Parameters')) type_fields_map = const.REMOTE_APP_TYPE_FIELDS_MAP class Meta: @@ -157,6 +157,10 @@ class RemoteAppSerializer(BulkOrgResourceModelSerializer): 'created_by', 'date_created', 'asset_info', 'get_type_display' ] + extra_kwargs = { + 'asset_info': {'label': _('Asset info')}, + 'get_type_display': {'label': _('Type for display')}, + } def process_params(self, instance, validated_data): new_params = copy.deepcopy(validated_data.get('params', {})) diff --git a/apps/assets/serializers/asset.py b/apps/assets/serializers/asset.py index fce21bf0b..37de2e7fd 100644 --- a/apps/assets/serializers/asset.py +++ b/apps/assets/serializers/asset.py @@ -1,13 +1,12 @@ # -*- coding: utf-8 -*- # from rest_framework import serializers -from django.db.models import Prefetch, F, Count +from django.db.models import F from django.utils.translation import ugettext_lazy as _ from orgs.mixins.serializers import BulkOrgResourceModelSerializer -from common.serializers import AdaptedBulkListSerializer -from ..models import Asset, Node, Label, Platform +from ..models import Asset, Node, Platform from .base import ConnectivitySerializer __all__ = [ diff --git a/apps/assets/serializers/domain.py b/apps/assets/serializers/domain.py index 9f58e32a6..0a16f3910 100644 --- a/apps/assets/serializers/domain.py +++ b/apps/assets/serializers/domain.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # from rest_framework import serializers +from django.utils.translation import ugettext_lazy as _ from common.serializers import AdaptedBulkListSerializer from orgs.mixins.serializers import BulkOrgResourceModelSerializer @@ -10,9 +11,9 @@ from .base import AuthSerializerMixin class DomainSerializer(BulkOrgResourceModelSerializer): - asset_count = serializers.SerializerMethodField() - application_count = serializers.SerializerMethodField() - gateway_count = serializers.SerializerMethodField() + asset_count = serializers.SerializerMethodField(label=_('Assets count')) + application_count = serializers.SerializerMethodField(label=_('Applications count')) + gateway_count = serializers.SerializerMethodField(label=_('Gateways count')) class Meta: model = Domain @@ -26,7 +27,7 @@ class DomainSerializer(BulkOrgResourceModelSerializer): fields = fields_small + fields_m2m read_only_fields = ('asset_count', 'gateway_count', 'date_created') extra_kwargs = { - 'assets': {'required': False} + 'assets': {'required': False, 'label': _('Assets')}, } list_serializer_class = AdaptedBulkListSerializer diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py index cfc3965b9..75dd4cf9d 100644 --- a/apps/assets/serializers/system_user.py +++ b/apps/assets/serializers/system_user.py @@ -41,10 +41,11 @@ class SystemUserSerializer(AuthSerializerMixin, BulkOrgResourceModelSerializer): 'public_key': {"write_only": True}, 'private_key': {"write_only": True}, 'token': {"write_only": True}, - 'nodes_amount': {'label': _('Node')}, - 'assets_amount': {'label': _('Asset')}, + 'nodes_amount': {'label': _('Nodes amount')}, + 'assets_amount': {'label': _('Assets amount')}, 'login_mode_display': {'label': _('Login mode display')}, 'created_by': {'read_only': True}, + 'ad_domain': {'label': _('Ad domain')}, } def validate_auto_push(self, value): @@ -156,11 +157,15 @@ class SystemUserListSerializer(SystemUserSerializer): 'auto_generate_key', 'ad_domain', 'sftp_root', ] - extra_kwargs = { 'password': {"write_only": True}, 'public_key': {"write_only": True}, 'private_key': {"write_only": True}, + 'nodes_amount': {'label': _('Nodes amount')}, + 'assets_amount': {'label': _('Assets amount')}, + 'login_mode_display': {'label': _('Login mode display')}, + 'created_by': {'read_only': True}, + 'ad_domain': {'label': _('Ad domain')}, } @classmethod diff --git a/apps/audits/serializers.py b/apps/audits/serializers.py index cc954640d..0815226a4 100644 --- a/apps/audits/serializers.py +++ b/apps/audits/serializers.py @@ -12,7 +12,7 @@ from . import models class FTPLogSerializer(serializers.ModelSerializer): - operate_display = serializers.ReadOnlyField(source='get_operate_display') + operate_display = serializers.ReadOnlyField(source='get_operate_display', label=_('Operate for display')) class Meta: model = models.FTPLog @@ -23,9 +23,9 @@ class FTPLogSerializer(serializers.ModelSerializer): class UserLoginLogSerializer(serializers.ModelSerializer): - type_display = serializers.ReadOnlyField(source='get_type_display') - status_display = serializers.ReadOnlyField(source='get_status_display') - mfa_display = serializers.ReadOnlyField(source='get_mfa_display') + type_display = serializers.ReadOnlyField(source='get_type_display', label=_('Type for display')) + status_display = serializers.ReadOnlyField(source='get_status_display', label=_('Status for display')) + mfa_display = serializers.ReadOnlyField(source='get_mfa_display', label=_('MFA for display')) class Meta: model = models.UserLoginLog @@ -33,6 +33,9 @@ class UserLoginLogSerializer(serializers.ModelSerializer): 'id', 'username', 'type', 'type_display', 'ip', 'city', 'user_agent', 'mfa', 'reason', 'status', 'status_display', 'datetime', 'mfa_display' ) + extra_kwargs = { + "user_agent": {'label': _('User agent')} + } class OperateLogSerializer(serializers.ModelSerializer): @@ -75,6 +78,8 @@ class CommandExecutionSerializer(serializers.ModelSerializer): 'hosts': {'label': _('Hosts')}, # 外键,会生成 sql。不在 model 上修改 'run_as': {'label': _('Run as')}, 'user': {'label': _('User')}, + 'run_as_display': {'label': _('Run as for display')}, + 'user_display': {'label': _('User for display')}, } @classmethod diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 4027d2247ebc4efbfddffe70ebd11a489c8ed3e7..4c4bff907f1ba75c65796bb76561aa781e956597 100644 GIT binary patch delta 19529 zcmZ|X2YioL|NrqTL#!YoLMUR#jJ<2`U86;YAD=6C$qRv`jmm=jxIVH|+PaRKJX zQ+OGl;tf36&T%r}+V>qN4emmJJZyez-asw*5oW^QF$mMPcbt^W?}U<3$1qfbvZx(5 zPy=jkL@nSPdbIL;WaKl{z<;48 zO4q@03Sf5B3Dv|X?1Sa;8me7TM|Z+J7)H4O7Q|+l0zX8x`xteilQAR4cjWxF!qWug z1=La9K;7GisGWIra-2X+kJ?FY%!P$eC)NNpK?l^m?v0wbKWf||R_{TLKLzvQ+)f^M z=lclg1WsTv{0?=L-kseA_@g?6ppLLA>J~LaP5druq1{mJ2B0RMje3X|qsH5g+Sq>N zS$8ga$Y`MNQ7gZN8Yltt;xjCZ!4ZyA8XIFJ9EsU*H>%%7)C5;iw=e-q;I9@h(8Zmn z1Ztz@Q77rCNk$zTq6TV(+EH87!g`qfFbCzqs2#?l+JA}azZdl|9z&hbP1HSpVtRLV z%Ry!V5b@6KcT0rpKIU#+nOJN4y%fqs>;{ZRNw}S*%F?71V};y15T& zc1+3qPHi$evc{+Z+oN_6i8|sT7=klU3tW#{;6c>Wd!3wBxYoJF*-++t;Xm1t$P%9mR8gMe|MCPGRWWAM-VphtRP$%;QbE01lcY^$= z*R2?8LlrGv*KFE@^Vd=$qoLph_jL>E-X2HojR3)I@77zSZLKs4wL~tG|i*0NqD_%+ufP7mj{<|0|Hugw;?-R!Xz+9E%-asGja>n?;&b}7pP|<s1q29+Gz}C#HpA9m!NjK%IbHZH|4L)qp1ETPzyVU+VCyZ2|pjm`Rj}ICxLaC zE!w?zM^HPzV?IJn_zQ;PAJ_~F4RRMe3^mbM)Xt}(CR~Wx@p{w=9mhaChiaeTvCPlr z@2IES8SLJY!l+wP8Feq~q6UhvcyH8+4M9yj%HlIn6D+_YxYFX^qK^I=>Xv(MlhF}A zLm%`W;;!5e^=%JAO;8MVQWa4@blR97p^kD9YR4-v7~@b2KZ%*~0&0PeQ2k#bC+u-@ zeCWQP`B6tx19kMRP)FY0?1Gx0Cu-m!R*u17%F|Hq`6|?c4`Bg3gKGaPs+}{`J;5xP zO7DMe3lv5*EQ4A|HPl1b!s4AU6Xg#u3x0yy`E1nA7NTCu4XBemgSrLhP`C6dYGEmc zx#MKS0($@RlhK5YF+X-fH5`jt&{~&6or%@+#9`$r5 zU^e^>wXlpM+;VnoNV(hy&R-M65YUHX2I}FPi5hqTYNFMsoo++j>tm>sxQLqY5o(;j zQ0>!w?B1GesEt*|@>m_U(4nY#JRUN7sK%r2&3r4bMjhF1RKvrl1)R3{P4hl#!l$U6 z{*78#$S3YYR~&T<+Mp(mLTzk_>4_nui9SUwWESe_UTYr20+hc;9jV?JnGr)V59&l} zVK}xxoyaJ2ChBBXVRqbMp2HB0_A?pnFx5zR-~cl>>Ry*JE1(uy74;pchuU##)XDU> z@@UjVi!dL?qaNa$$b`-dEQWzG>c`~O$&?__5_PY}pcXU{HQ@}@g!53hXpPlxv-&-# zBR+y};WgC5_J`H`jB?BVsG|?YQkWZcicTvsEwDR=;V#UDKcMcd_h|QsGoS{}iMp3z zsD*~3PO7}c-?n&d)U9Z2@s6ksMWSw5KlJF{d`w0=n}S;5T-1@SKux$4HPAuS!*w3D zfcvQak5TPkTRd=#TOWd&C=_)I!cj+GAGP2iV>o|JFoJ*v9)~4yKC0u_sH44xMe!HR zfuUpFcvaMnTBB}JM^t?u)B-1&Gf?x)L2YmuYTS)uIsX)74ioUjlc=ZrENXyTs9SIk zwZrGAfl`ih&4`*fJ8B_?P$yCfwSk&eeh2+1N0>cPCmQ7;qYg2sr*j5sh3l~}?m+G6 zHfkZSQ494S?;dGJtWCKv>Zy-Hy}pxC3tNsUaSLieyHIbS(H9YJ3m1fC#fE>LHCn9pxC*5yzr-ywu_wQRD1Eo!lkVm-Q~D!55~_WEQ6PKRp>W z%!H{h6t#dtRxWMzRZs&oKplN6)B@U}`t`(uH~>R&t{IOynX9M|)N|A`mGM(fS5JF5 znX*_N^WYHFQO!ji;abd%=TH+o#}4?`6z)3?NBwlWi!~LW>fXvuSeWu`9Et}~AGS)< z__Yq(P2>Fa@a!a@72QC6ieKR%EH>T!?R6RIsXl{WU?Q%=Su@4z zg{Xxc#)|j~^{kYOb=y~s<@|MoZ3)O8sNZY`qZ&>|Jv_0fTQUbT;WE??cA#!WrkQR$ z1a;KKPz$b$`p|Sle;kY%a1^G+&pc!_!6FR6<>oePa0IoGZ&3q$k6K8g#h;))Bri|{ zrkUkFw83T$)H9P0Gh;aF;jDu>(bJiX?vV$zvUR8d|cB3KXg z1&c=Qd?lvGEvO9~z$|zU^=v&vop7o-?l>WsQSW~~G8&*924YRr4qBr+M51;u1U2zU z%!?Z={tc?#71V3^2sQC@(|@k}cI87Ic{|iIGYtLp{(Hz&!%tBIoVErRP)B+dwV)qR zC-e-p;FqX{`OV|Mcw+$O!x5;BEJYplHq^7T%RGuzDW6A=CJ3DGz8)c1oN`Ol`#uV{ z;0kPt?=En6z7q8;oWM$W1G8bsLibjdLDe@zEua&=<;63A+Ih?(cj4m~asKK!gMf~3 z18S#xQLow8sC#-Fwc{tK0bZf*vG-!PJ_xnoyr_5`%*TZ9;bR=J#BrJs@3V{@V?1`l zO3NvQdh_4sm%IPybYLZ&=rCgyM}`kp^FY$@w>8`^{CO>>f<4!IB?{HUM6mwEv5i?;Mi}x{ynd8h@ zbBVbTHBUUM|3Rsz@d6p$f(O>%ck^%5PEzc2---;VaxTn`g-}P@$ZUh!X{42>n)6W$ zUt{HCsD*ro9u08SD(<5i{)(C?=u3CvoTzriQAb=EeXyy;Tc8H)WaaLthcOz9;8e_m z@u=_1b<{KFzl-x%#~i!d3G$gGQ46Vxs_$TSv-;jv9%_2baaKRY%JWbQU5Z(7C2HKg zR)1|5=dYdJA&?oLpmyjN?|xW9%rLXOSr>K7TAN)hJ^*!cBh5+XOmmUB2DP!R9y0pk z?J`f8-S7RFD+bq5x3+VknY7KruP4p7A z@-%#3HBb(-uvs28acwI%LM@<;#k-*T_p1P&SkLrIAHQsUa0w%rxKUm_t<5fG6l$UoRvvBT>8Q8mbJPM?qQ={Pfcvk^Aq$*Eec7&=e`7Jqp$FZ8 zo8nx`t*!hR)&Dos=aAbj05wq-RDD6S4CbX=11nxWZrtPiU=1E)b}C+3IqNa^?{@jok9ak+E^5Fg zsE4r~YQfPKA7{p*`Ypj6xEizJ5!A`uLVx}I&%*CT`ZDE14IGYoc&eZVXl(J8s0llx zPGFeTk2WWv`p>{zxCqs5A8Neg=4I5l_c4I^oyTO<&^f_p7}A*OFa_lR)NjGTsGa6V z4Nw6?uo^DIwy5vGE2|GY>9z|oL$L<+1+fwK!ld_qyEQn3+QA9)BI?KH9jpJ-;@+p+ z1!q7lB*YBG!juc57TN++VI&4&KUDkCsJCL$DSQ9t5YWUc&8?^b_M={xa~6M&8o=wc zTb~N`i$r$R>r~XrB~Wie4NUq~4Rum|FcimG{p!=4zdwO}1T^6(RKpvn_zR1t_}VRJ zMSXhnV`{98I`XEd{@pD8p&5f(@MP38@EK~{W#%Ri8Fk!a4bED{O$;Ocqm?tCaVO4$ znz#n)Xd9shY-L8E7TC|qQ_Oj&lUi+lX>rd9GFrez)V+IvT4~T(_i4|EdR^W|?Q{_8 zHJya|5UsNEB`i((7b_S1#%*5<3leXO>K9|>g;+vA|BsN-z`vmy_1W26GtJeQf%}YX8*AUf*&43IvhS1o_O8sMoG4YUiD?2!4Rt$!v2W>WjDn)qk&f z64mb#s{L)$t-Wt$-wSU0v=_MlYLJzH7Lv;hM;&1`)XF=e+6^#=q9*WIc_L~7(^2gg zqQ={dn)rZ~ub~$FBWi;wF53HF@S;0m8Pq^6Q3G_ga(~o7ADeSg18qkw>xgLeGZQWN~0#MZZ=1)ursRRD9nU&P_NSl)P&!m+TBJi#OJbW8q^78 zG_#xeQT@VE?LAe<=wYjcI=WVekG#`pwve@?I>8!QZ=o*Q?R>7eM;d@Chojn8K}}f8;_sSW zQMaJKm8W4k$_p^*{a;5$6U3W`%`>Qn?lNkEAI)D-6TdW5UUw%BLbWT1+G%mK9;$t3 ztM6;^LDzZzdr~pQ0>7CVZnz5yLk(C8H9$qwg6g6^we2kKF+VluqE2#^mG_{=Ibr2* zP`_DSzrp?2O7B>MSD1#f&rSC)9_djNS3%w52B`LJQ71MKbuUL?HC%*he*-n)BUJlm zR!)1%{Y51ZRUhoJOb!eokk86hQ9G!EzW6@s-gZVUBpNl*XjFVUYNF++_#V^(PoO3` zkLq{De2A*|ydl2fP1Mo0!BFgp#c(3##+|4Q ze2<^uGmOTuiJUC+JAWvH{`cJ9T63A@us-o7SO;gLZoxIwvyq6J_!Xu_|NHJZSy3lY z1a;IEQ2nZ*POt&KjomTnzyGfwqXn$TAl!!;@w}OU8t`{iJKqOxISXone5f53!PHpW z;!VxgsDAA+HAY!{*aOaA_i&_D%rNI$gO#YAZb0qyka-TZlOHe-zD6xD&qLR6vkGcq z4XoS+gDFQ@dE7(JKQ)0^3oJC(nLANCJdCyQl$A3)a^u0Mo#jA{Q^MkvEMCLntxyZ> zhN%n`X{45t~Ga{PUb7rNu~VR{lcY3Ei@3-{w-8} zA+v<5$0<*y4;58W6Rt-s;4u2&CDcGyQ3EAlBYcJ$uFLdO#1JCH_7BA@E8Lz{V)6t7k}oD*SLkGOQ)pk58{Wt-FyqPvRO(U z?HX*cv)F@lk5rHq_>h`fo&NV{P8luBuD8g4LB2Za2L`)m12)H8bSh6ON1nq-I$m)4 zkwy})O3H3ym7q-+@xi1?SPXlIG8)3|9$N zU=z{~^2yh1GJ1k_?I!*i?He+{L-ON@6(#=-`M0q{QY-flUmGJ2@l%98q+FD~b4j02 z)<1N5z9X2^8me0a!6jIcPDk(*<>AyXwl?XAwKKLRXg7oOnpBZk3T%!% z%So3v<@%&bq&F^)Q=CS+##51=w4VHGoQ~dB7msBqUnO3FyncG=>P8AD@rpaUsMF7c z-l%J|i}OA0!$}i}U$)p!lnW|(asNZD!w7Q?6|+dGDc2;mB!7~QU9Dcf3*_Y#c2FKi zYD&JD)$OJ2_vC9>xqwYrl{WjR)722aCV3G{5kV#ujSrDNw@zxboV@;i2TlTW_pCBNlI zEmDlex{i~M(6|?!z9M}`zFkrcUv0CfDdv!L!-isMQXlohJfuzJb-gxAnrRp_!INAt z-KKnpsQif7{}*=tvOo~^x-OC$k?(Hh8c@i>t z_K~|ns1)f5%|fi%ROI(ar?CxJ+|FnVZBklHl&0MRVsGOJi^t(QV%i>8+Cmr{ZvXbgCab9A<*70ZZ*=#Y@F$<{`b=8RLI%kH{H-#rNp1AL@3Ej5OXr!SBQ}U)0hS+2hhyY#lBSSfi^J96jjJB9gOn>! zud4^?c2bUimZ7c?=`?lOFpt_W|GzGNiE(C8FvRoI<0 zo|KXFF|jEaKu2ArF@g3oNmGe~rD{lQAt}^iL$E68D`KB8&SdiYNj|#&&B?q) zP}dE-?q;1rG`>u^9_5wfKPDw#V~CfaFp5}a(sat-Smk-jwJEP4C6fPuC&jHhW+i}*|Y(&G2Ye?mSt{dCPE|AJVw z)qh4_S5E5JxY?w?J4_)SPkDaw`)_qlSt<(C`6Yo2c=O3a&t6+ewApV$#2&HDj(A-GhM^d`^QeDL*HDO9~`@omez^Kh)KX z^ac6DxI+QEjuIPbZL(S{CFNG6W%Mt_WW|#k<3(ccq9-kXmX(st{#4C{=k$;ESF|1{ipP;PkPf{`RXGsOg z|EQqu|3o^bpz*KxIZ4+KIEaQCBQ^QTm&QJYR8#Ig+P9r~wI$tbFIT!V*urg(h z-sEe|}Bf zXwq>~4%+y#s3F!?jpFtG2T-}$f+fjsu>39>q@lx`R~rhCsINu42H1#lZPF6*`hQpw zLtNKt%0H5C>K2{;lX^B^*oWmA$ zi*iv?S;{Yo>sm+oJ(8|bq%TSSDsa6+ybGxaX*}rweSRWdMIWBc6zY&3kp`0Tk%kd( zOM?-p>vK{On_T5H`h#n${-C`-N!K=O|F>7t@A;XnOBJdwlNOWGyDgo{)Opc-9H~0- zyTtEe@^y$z3sMNNx}>4BYhdG@B!7yO&DuA`;-r*TKZAZflE3a1l1Ic>bXr78zBZAm zWSx!^|As*#->6S+7fd_@g)?}KREYc!q`yeBDYt&3&kD-A=6G{=b20b_6y7J;8(XV} zs}S){#41{2H|qWw1GyP6Ep>ZHnP}V3+SMTc`n2i zK0`$V@->MiU-O9Fq~S046BeUlH^z>fUm>n@?b?}BhIWhU8_}y@+|st)y)*Rb)iq*J zuc&^}prHEXS zDsAM45yO&)TiJJ;Z~6+KocUYG7!$UeTH( zuHK+%uZEHRBD(b9|B*(Mx-~+(NA&tn_MdicRn)+)k)dxk?h`pAvd_Q9J23d3m!BMf2LC%6G&Z-F z4m@mJp-e4@MGuPX8#*{Ta^QbXs`MW8aPqPuF8$)Zl;4y?bmiuQYFrK7D3lw$wGch2GmcBVqC4xWSvsc&Ck@ zd2i;L#95mkjGq>}dQ0Qf_qUI^8^1b~H9p%?%kS>~rHL_{VvBDboy~D;+@}93#O>UA z#JgJJoJ|SSS0zl_lrUk*gSji5f69}VB#d48Px-<4DTy=p{Zmeyzb$e0=D3fxkM{L* zN00k?*Xfl0TIJX{i|jgh$Ty%-g_fZSZ!9=&_|d*zsqZga|6tDUgr$pOZyg(-HF4p} z#Q5ot_e@Bfv+v%D_=M?G?ycVZc+bSx&c`bS{&zTT$?^GK{3M8R(t7qxVmr@%mrW z=Q-0qMRJ?5=WlrBe6W1#gSl(}uQ6l0T&S7z{{HFrmwu|-Heu)gn0EPvZa!K6uf@mt zeV@t8N4MAiO3~Q#SNv1Bx4zt!n7F-Hy7;B~e8+>&w=59_ji|bclYvp)5pa&y_-F@#NF-xW5cmG?iNXXZ}%9xt=5q-fC|w6qlW(w0N+G3x658IycLL^|3-DY`893YFDj4868S(pcj#DX+dJ$zE zC%UrZFk2%-xZQ#t8fZb7No3kKbc8D7OB zO&li_S2uN>B)AoWai4k8yo%az9Hzq8m>QFEoC#UqiK3!`(Wnl^PcDPTDS|Q#c1M;m=mjD0_=tA*B^C~qcH{kg4*Do7M#B-M@i_2&R{rRL*3D9 z)Exx2bf0N3>V)#5Ca!>bwslYoHn4m%)O=kq8}>)t=se7aOEEE?Y{~g+p-a~B9_px) zwQ?Up1ZslpsEyXdFl>ODpc`t#{gHRqnT&dLQ&Ah6g_?gpX2lg)43A*^2h7u&j|hpP zm>zqh22MsTFdg-1=3_xzZTX9+g>IqlEDm*2udMw8YMw-G+>=U%>Yu^Pf|-atxv1z4 ztDy$;L@nGG^>PhIoro9p?3S6E%tPiy)T4QbDbZ=`o>VH-e7VdbW;s`nQ_T|fQAgYY zOJPUUju&DyE=S$rany;NMfJaf+Tat^2|DfE&wU2eqbi2lKrPfu*a$Vx*BGeJ{}d{^ z)0vnKS7Qk7MSWaOp%%Q0ddXg+HufI%5(c(+pK(gm#F3~+k`pzqu;pVg3vo@4CFx1A! zWBkXlBj>N9TuMTBz6N!q+fV}!nWr#{_%iB5-lHZA>g1kWO4P?N2L@s})D6U-`q#C% zDQf;ssPX+fasFD^LqgAdI%;PNQAfAh;(e$M#iAy@fblOM>W-eEPSCHjJ6~edBTa|8 z!F-l4idv^KMq>jHl{{2NU`bqsx`XSu1Mi?FUfRW7c&)hwwSoPpg^r^(cms6<4>A7H zU`^t5T^;8sc0|qJsGGYnPjf0digso%)Wk!PA5_j5)RA4njCdboFsQp5*T4$Iol)af zVgmdHbKxe7uVE1J9ZZOikp3R$A1ZpQKcHTk6g}J@KKU?`xFHt80hk9@pzin-YN9)+ zBYli|6z?q`+S6Sy4QgW%sQx)EUjQ@d^IzOLG(>&zw8CJVYx!lUo&SWIU?V2Q9hN_Y zS|HZ)=dmd9Ez~1O*UO!+4C*ASqc++YL-qOZN<}Z*5KMwz)ItkUce(=gdERF2M==@k zSyaDUs4uREs82!Am+qskq4GbV1}?F99csc~ zF$#Z2-T74v#=EFHdx?4nf_l53hG0~CM)b#AX5QYMza}U^LOUyoy5p*-BX5rSf@+6r za1`pNR-QiYo!2nyqZVw21+Wd)#p$RG|BYHF4ny!IYQ2EIoWJfkMPK($^P^tIlBfZ- z%!Xzw)LY#dlj983BU_AmgzHczcF^)CQ5(37TKJyjU!&&t_w;k$>ZGWNN}!HD2DLyn z48W$S9k)b%hj&L!JQj6A(=iLKH&3EY@Fi;8JJh?8xWBtj6zXSyCl3|vtRiZHdZ?GG zKkDN+98=<4%dbHl^#*ebYU4Xm3mrx+bPhHCF>0ep2Dl&Va8&Qr~qJTDTADI&jZR}4B#cQYyJVh<=FNWhs)SZS8c8x@BI2v^$#Zdh#pkDea z=*dc@Jrzwn-a5=d?RWud;9}GruEP}QL%p2)QE&ZO)P|l}{0?gphYxY*ZHM~Y_eH&1 z15oph7{d8$hZ9KX4rif`bS3HpHlY?girU~6RR2d9h5w@ND8o?qFD6l_jW$Is)CTn^ zx}e^f{-_h0VC^%8a{gL)o;9pBH=-8$9d(CCP#e09x$s}qk!Ks`E?5S2M=@q?)Iv>B z3%A2GIMAGmdgqpVsOTtIBZ9 z=D%z{LOt3KrYCTOyVE47&u=PBkC{;?Q`X|Tn1Q%EX2bEA7T2N{+=uz_Dr#KtNcS%+ zk*G&h54E92sFP`htmkn$Q_(XTU>!zThl!{oo{1T873wA1Z|$)bpGO`24J?e0P$w1j z6`w3DjL|p_BXK?I(H_STef}>|(Zml>FV9QVPT!%9Du6!9Cr0IyqZUYO`P`^GDujAu zrBRQj2I|I|p*E=BHMLG3)c9eTn&M314=u15HEZ9(g z1?r?aqn>q7)JxYFHEs;*$S0x3%`q2^=KS^2ts$X>x1dg7H)_WxExv}D=&AV{b%Y zkF`%nJ+ir|mvlMmM7E%w?P=78ub8(`FJm0)1fB8j_)z52;c+ri(FD0rM^zbh2ldUC zsEu^7_MWIC9*SCUjKx!|eKuh;Q$gTNa)$`!%#elN%1;r;zy`Q@Z9nNGu(wkQRC8JV$5dw{HX7T z;;4D5V-PkpTVN96_A@wt-AOMJy3?^3feSG={*Iw|4>jQ%i<8WBe@v%Gz1?L{cT^9x zU{}-v15gWlQ1gtp_Bp5xFHu7~D(g^p8uG0>K`PY7A}uavaYfWdo1hlxhk0-$7Q)r2 z4P3$yyo)LD6>5WtyzV;`g&ObqjEXwcKn-kx+G!U|j)PGm?;$3_ z_o#(}X1PY7J~hQrC)*SCvHS+hv%WKviUyvvhKr~pyN24xUDQkV8nwZXs0}5Z?KnL! z471^AOo=N{C%F~%ZtOIV;%CI?QS+ynqnDlMA3-HQiKdttC*ZHR8tY(-x$YgW!PLaZ zu{7R9J&K5V?xQM&YOjmhKu65z$7dgP$K&U_8=rz2HwX2*g!3yE-RT}og{M%@?hfjX z|3OXQ_nrHw5~AAEp*9?C`I?xG1zX}19KC=qA=>-?pmTPdUDy%JFXZL*=Z6-0PLSBY zh!=_ha~5-C_;?A&P5#|dzGm^oGQMW9*K$4)_!M{1Z~Y2>6UHxB@lQp_cU$8=f{3;5 z2^2!zKylO~jzPU^wJ;1@tz}=T^d}LCldQvP)PU`n8~0&he1e%U%R2WPu>z(i?t)P` z2Gzb4tKe=tgb9D*TNF=VIDWm}{X$!?o^#PR+iDVei#J=tAq*xyYu+@UqF$c&76<<9 z_Dg}vN0`}BFKJ$DFK$-CwB+kq+|5Hp0|!}Rq{WlXndUre|Iu8BdfT_67CMGHsk0c3 ze!uWfPcS!@!f~j6yHM*LM*R%%oUqCpYl!02*PZ7?eO`;AUdjfR?_v%xN1M~k1*ip9 zp~n4e?nRySIcvY|>Tw=Y38mo$YKH+E+_yRzY9j?ucU0EmPG&#U20a!pG}l^w3u?Y| zsQIs3`!h^Q`~d^>xk$mAp@qUwJI`WqF4W6a9P?m()X)8qm>(Bma*RcdyM~(QuK5zR zK|ekkYL7B=qWa}mtj}c`YltyxSciHRx55DWb;LB-6*ciFYyS~7;R@8J$%neb!x(~> z%{cR4Gx2Yno}NisDl!LZKvC4uRWfUvP0V&?57eCv#0ogV;@>g;V~d*S3F;BNwf4lD z+zlt+#QAHdnMlZjW+l|X#+VJ;q81uwPC>L5q*0HgL)Ew^8FCdaT1o zGkA-8XX#K26}C7Ab!RP5&%Q5eff=ZY=UTkj;#C%JK;7w9^8o5|e;TWy=N%PIRB5Zb zqnfA*TcHMaL2YD!<-azkS$-a>-zwBRzghbZ)J6|jd>b{-6HJRAksINXDp6$F$W&UaQp`~F8B|3p71|-{+ckWB?_W8QqHW58c@sP zMyO}s5|!_bpW#r{JX=ut{bnp`z6<6x^RD^$505+W9}@al`0sY_C^u@tx@JqvK-|sZ zahQ(yThs#UOdskc+=kldY1BM-%onKs&K~y{m4qHD>4~$Wj;sP|z+luD(bpDFN4+%P zWBh`a_n{X219j&Yto^3>05#t;jKmM9ei3`!`8?59DT$i6I_jrdT~x=m=#SmaUYLNm z59(*dAk>|XLyez@I+-7F32sGwakbp%w)ZoKx_X>ZR4US80@lLAs2zvxcL!ua#ktJl zn1;BLwYRW*d(?(|TYjiH3iZQi0&1fhP`_L5$JD%k&T%T*`AyXKzys8RZ_ES-+&Cp_ zf=JAag)QF@gNWOq+Ph)^4o97&2le*Pz*M*rbwb-QiuIkptivnR!pRQ06QxIW%!kTX zvwTB~yI=(Q0jN9oqK^6p)JA-kKVY7~Ao3Sc^Ib=eDvzmXz&q4S7Q*k$%15An^~z&$ zL)1d;FcJ2!`~Y(_YMyBpFE-bsPGY-x%<@+basC?cfP|jWd(;M^54&%5Nz|vJKI+aU zqCSQTu^?`+lV@e-A6coRSsE0EG8ztZ1ElI_yV=j zf6Zh^-8jlDg4%dhv$5qnqZS-$jz_KM#oYLvhl&>5Z^oJz%$w#T%tpW0sArz>n7e^8 zs0r(sjWC$FrN!M)8}Ea91Y<3pg~7z0l~nYSZN!>*9Cat@{&YL!GK-s)%zCJaTcP^* zv3QilUep3h&0kQTn%_}3{5R%dedj(E-9gxK*NmuvS`e_xBg zLTzZAIU99i%TXKNhg$DkygdJ_RJ6ctYj}d1@D*x6K&(4qIBMY>7RR8zdcQ#3Sr62> zsi+0Nvv@0p5+AVmENY&cQlI~iR5VeB6YkE6q9!V1RyP}2dwYw!nS)TDjI-8%>Rq{jdQ{I*8%h0_+dl(pzGzhb zGqVb6W1pkuZESivScg8Sg$7&0WOJ^$43p9RD{7;=P!q&tCPFP7 zYGy>%^EkPzLs`_FRWe(m1`M?JF_xc%UCA%8IO#ceTsG8(%Appnh8kZ7wV@WMZ_wVB zpA|39f3YRjV;CK_TYM5V(N&9YV*=vmsExj{_7vycU)9oLKJr;n3)e@TRBKF&U!pcR z0rlu+VtIZ3eN;5y1!_U(f@?z5FA^aZr!>=HI`UB#mqu;8A_ig;)T3;P+CXpA{2t3s z!L-CbV*JnlEmX9#{iqGZq6VHd?^ydQ)I`oj_ur5tL&dpK<4c$oQS;QY_AksfW>0hI zMV`MV7;gzLYTzQ&gexuoD@GIVM13FJHIrO&?<5~)BwrQNV+Yh1(O0N((=igapw>HY z`P-K`e@z&2+3i>es}eWIQn(oP4S5MmV!##m^IO(zicQE5z)W}yi{k^-BguT#J;@Rn zMO+Q_j&w!619Lo7^endEw|El!W5>VUXL#O>!*KE+%&=?xs!p62tKdM?iET$MydU)l zFJV%QL%kEPQ74e(x_i=|G*mK@h`@4K#u|pA28_bg=*1Mc%G`#U=oqTs1&be|9^qTm zhMXI2oWx9l>Yo;A_c(d1p&06!m314O+GZ1LZ-=_GuBbcv%AAI}frXd_x1%<8)r>RW zpiVl$O}9M)!&%?SV~H5lj_X?7%-{sp~Wvy^9J2=zdw?r z-lcHK`c7Rc+VMoxoy|r~v>f%#wZ-CNsEPhY^}BEJTZ;p3yZKb8`Ld#3wt|=$TU&mV zITbyc@H;A6a2e`|He*>lfqJWx-Ek+(gO!L&qE2E22H;rKJQGk0&%_{HXf8L`VNdct z)H+djIe#r&>aIJ{=ctM5p(bjMwXh2Yp$`kk6$#g2!n&mLJMrda6f)aMcvt%2kwT>qc(cO{0FtcL~-tshhbvk?5KPJ z)cCTfM_2*%$Qoh)?)8qE95{9`PySwKxs^$jzkRH^hr6x-O7^=2o5G(9iPi$rq&PDvl}j z9h900K3%El7;Bvq;Y-Q_N-G<5n2y)2{%K4N+K-bfiMr0==adlUO+`sUTYX~vaJ)&` zuTEUm$fxnx;z9V1q`pnFP_JN<%`vm!FO(^iNA&4HDa8Z_@df46mDl<=#Ceu1WNybG z#$>_LwEvEt&LkRIhlkWZT|242r0^MuzrJL^Ug9Q{rj(V$U(?bXb&aDWBp+cnv{o_o zQ);v;JMH@F(6xZVU-CT86e@>lxJ(&N`E<3RzS}0BPBJgCzJK0W?swD=M_qdL22#lxh@R z4JcVDU5JlSdfI|9+=j|Hs$6lZ7>yY5ndZ}qM?n{vhCPt>5&n^KecD^olhtz{#Fx7cKJ$-Sn$A^wVz zhmJd}P2F>{VSQ7_U({1jjt~^4Jfq)cJc^0Q>-v|vZd8|kL`oMHnL>Gzy6 zjuJviVq-GUrzzzXxgg86#o3hfXlfpsmA9b2ZsY)aPI-b>W)oc6N?hpZdhB zC~qmL$bC;4Xnjsm|411?JQ2rWNo&i&rfXAAL77flZGHaBu)sP>5faf9UH{Ob8YZ=Y z{mIXz-i6!_>S36i$^0q0p4d3muhFj&ae3;WQ~!dpR1IAEPehIp7sr>x5gvkCl#V3A zNi4#7#4)HVEej-}Y_xcu*$eB^Zy}{D_5N;mrv&k*>o4l{XzPe~NUorqA^r<*<1zI7 zk3W)7bXED!;AX^s6HlP5q44Wum{^`fX>-FC)jd6CHdO>P}_vfM2jqwq)S11+D1 zext3e5}vjE&++p7N0AI97(i)G$wOQTlQOUr?zBz@G`o-J!iD z^_=t_LHSnNm+}E^cz;?v5 zsF$JWno9YG`Y!xHdt1Cu+?A4oSXXlD!>Jd=tHfVoAaNOe{&gK8@#*SBLwCxzmZ(Vm zzgGc^Z($f4&P8Leb-2kqzfgZn`O|Xe|1&-%_0g35^jm>f^-<_&i{~fNgh5&HJ94=x z(ZrEB2=9~s2KS+^KP6=j?YpTKqrOx*u4GsnU(?o|Qj7W%>_NUfev5-K{?pS+Be)83 zH)Cn|gL-<@wcH#==WW!lyJ@F4aW~?U7K>)&biE~CmU`#1%@*6$#qpn_<)U7&0EVq()JbemL^v{QM{bp@N-O%}wwi}cZ#No94kNP&; zg(JyT*55eZ6XpPGe*0AF21H{^@!_{T#s+oIn{%`()yi_=@~ICcM=l0X%%1oUf5x$DRMU$;(G+_v~Xr_i{ST0hIJ zCFXzeS4Aopsm=eCpuUg#CCtrSk16kolXB;+<45pqMeYRkEtF|mkM~Z8`g~`)y|{bg$^>sI4e5J%cBNGPs zejoeH&%1wI5ns~rBLjR3CPnyp4^7VKdoy`SBJVQqN8iR-)%|^ea})b{Bj)AuHJ_K$ z&o^!U&Gf$E8;kgRw{NQH4c#2$ZM}I!(B1Wm@6H(Sd%1bPzwhm~F@e6ByLKe>H9xpJ z(3kgEPe1RfKSz119WN4eXWq`c%eMKZ9ADt)Jr|qY+u%f)H^a%qzAGo*`uT32I_T%y zd!}0gU-^qC{k#P(SM*K4+#$f1^jb\n" "Language-Team: JumpServer team\n" @@ -149,10 +149,10 @@ msgstr "Kubernetes应用" #: applications/models/remote_app.py:23 assets/models/asset.py:363 #: 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:45 -#: assets/serializers/system_user.py:186 audits/models.py:38 -#: perms/forms/asset_permission.py:89 perms/models/asset_permission.py:92 -#: templates/index.html:82 terminal/backends/command/models.py:19 +#: assets/serializers/asset_user.py:84 assets/serializers/system_user.py:191 +#: audits/models.py:38 perms/forms/asset_permission.py:89 +#: perms/models/asset_permission.py:92 templates/index.html:82 +#: terminal/backends/command/models.py:19 #: terminal/backends/command/serializers.py:13 terminal/models.py:192 #: users/templates/users/user_asset_permission.html:40 #: users/templates/users/user_asset_permission.html:70 @@ -172,6 +172,7 @@ msgid "App path" msgstr "应用路径" #: applications/models/remote_app.py:36 +#: applications/serializers/remote_app.py:146 msgid "Parameters" msgstr "参数" @@ -209,10 +210,17 @@ msgstr "创建日期" msgid "RemoteApp" msgstr "远程应用" +#: applications/serializers/database_app.py:50 +#: applications/serializers/k8s_app.py:17 +#: applications/serializers/remote_app.py:162 audits/serializers.py:26 +msgid "Type for display" +msgstr "类型(显示名称)" + #: applications/serializers/remote_app.py:36 assets/models/user.py:99 -#: templates/_nav.html:39 xpack/plugins/change_auth_plan/models.py:52 +#: assets/serializers/domain.py:30 templates/_nav.html:39 +#: xpack/plugins/change_auth_plan/models.py:52 msgid "Assets" -msgstr "资产管理" +msgstr "资产" #: applications/serializers/remote_app.py:37 #: applications/serializers/remote_app.py:58 @@ -280,6 +288,10 @@ msgstr "运行参数" msgid "Target url" msgstr "目标URL" +#: applications/serializers/remote_app.py:161 +msgid "Asset info" +msgstr "资产信息" + #: assets/api/admin_user.py:46 msgid "Deleted failed, There are related assets" msgstr "删除失败,存在关联资产" @@ -321,7 +333,7 @@ msgid "Internal" msgstr "内部的" #: assets/models/asset.py:173 assets/models/asset.py:197 -#: assets/serializers/asset.py:67 +#: assets/serializers/asset.py:66 msgid "Platform" msgstr "系统平台" @@ -338,7 +350,7 @@ msgstr "主机名" msgid "Protocol" msgstr "协议" -#: assets/models/asset.py:196 assets/serializers/asset.py:69 +#: assets/models/asset.py:196 assets/serializers/asset.py:68 #: perms/serializers/asset/user_permission.py:41 msgid "Protocols" msgstr "协议组" @@ -599,7 +611,7 @@ msgid "Default asset group" msgstr "默认资产组" #: assets/models/label.py:15 audits/models.py:36 audits/models.py:56 -#: audits/models.py:69 audits/serializers.py:77 authentication/models.py:46 +#: audits/models.py:69 audits/serializers.py:80 authentication/models.py:46 #: authentication/models.py:90 orgs/models.py:18 orgs/models.py:396 #: perms/forms/asset_permission.py:83 perms/forms/database_app_permission.py:38 #: perms/forms/remote_app_permission.py:40 perms/models/asset_permission.py:169 @@ -647,9 +659,8 @@ msgstr "全称" msgid "Parent key" msgstr "ssh私钥" -#: assets/models/node.py:409 assets/serializers/system_user.py:44 -#: assets/serializers/system_user.py:185 perms/forms/asset_permission.py:92 -#: perms/forms/asset_permission.py:99 +#: assets/models/node.py:409 assets/serializers/system_user.py:190 +#: 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 #: users/templates/users/user_asset_permission.html:158 @@ -749,40 +760,41 @@ msgstr "可连接" msgid "Unknown" msgstr "未知" -#: assets/serializers/asset.py:24 +#: assets/serializers/asset.py:23 msgid "Protocol format should {}/{}" msgstr "协议格式 {}/{}" -#: assets/serializers/asset.py:41 +#: assets/serializers/asset.py:40 msgid "Protocol duplicate: {}" msgstr "协议重复: {}" -#: assets/serializers/asset.py:70 +#: assets/serializers/asset.py:69 msgid "Domain name" msgstr "网域名称" -#: assets/serializers/asset.py:71 +#: assets/serializers/asset.py:70 msgid "Admin user name" msgstr "管理用户名称" -#: assets/serializers/asset.py:72 +#: assets/serializers/asset.py:71 msgid "Nodes name" msgstr "节点名称" -#: assets/serializers/asset.py:111 +#: assets/serializers/asset.py:110 msgid "Hardware info" msgstr "硬件信息" -#: assets/serializers/asset.py:112 orgs/mixins/serializers.py:26 +#: assets/serializers/asset.py:111 orgs/mixins/serializers.py:26 msgid "Org name" msgstr "组织名称" -#: assets/serializers/asset.py:166 assets/serializers/asset.py:197 +#: assets/serializers/asset.py:165 assets/serializers/asset.py:196 msgid "Connectivity" msgstr "连接" #: assets/serializers/asset_user.py:44 #: authentication/templates/authentication/_access_key_modal.html:30 +#: users/serializers/group.py:37 msgid "ID" msgstr "ID" @@ -811,6 +823,18 @@ msgstr "暂不支持OPENSSH格式的密钥,使用 ssh-keygen -t rsa -m pem生 msgid "private key invalid" msgstr "密钥不合法" +#: assets/serializers/domain.py:14 +msgid "Assets count" +msgstr "资产数量" + +#: assets/serializers/domain.py:15 +msgid "Applications count" +msgstr "应用数量" + +#: assets/serializers/domain.py:16 +msgid "Gateways count" +msgstr "网关数量" + #: assets/serializers/node.py:18 msgid "value" msgstr "值" @@ -823,23 +847,38 @@ msgstr "" msgid "The same level node name cannot be the same" msgstr "同级别节点名字不能重复" -#: assets/serializers/system_user.py:46 assets/serializers/system_user.py:187 -msgid "Login mode display" -msgstr "登录模式显示" +#: assets/serializers/system_user.py:44 assets/serializers/system_user.py:164 +#: perms/serializers/asset/permission.py:64 +msgid "Nodes amount" +msgstr "节点数量" -#: assets/serializers/system_user.py:86 +#: assets/serializers/system_user.py:45 assets/serializers/system_user.py:165 +#: perms/serializers/asset/permission.py:63 +msgid "Assets amount" +msgstr "资产数量" + +#: assets/serializers/system_user.py:46 assets/serializers/system_user.py:166 +#: assets/serializers/system_user.py:192 +msgid "Login mode display" +msgstr "登录模式(显示名称)" + +#: assets/serializers/system_user.py:48 assets/serializers/system_user.py:168 +msgid "Ad domain" +msgstr "Ad 网域" + +#: assets/serializers/system_user.py:87 msgid "Username same with user with protocol {} only allow 1" msgstr "用户名和用户相同的一种协议只允许存在一个" -#: assets/serializers/system_user.py:99 +#: assets/serializers/system_user.py:100 msgid "* Automatic login mode must fill in the username." msgstr "自动登录模式,必须填写用户名" -#: assets/serializers/system_user.py:107 +#: assets/serializers/system_user.py:108 msgid "Path should starts with /" msgstr "路径应该以 / 开头" -#: assets/serializers/system_user.py:118 +#: assets/serializers/system_user.py:119 msgid "Password or private key required" msgstr "密码或密钥密码需要一个" @@ -1080,9 +1119,9 @@ msgstr "登录IP" msgid "Login city" msgstr "登录城市" -#: audits/models.py:103 +#: audits/models.py:103 audits/serializers.py:37 msgid "User agent" -msgstr "Agent" +msgstr "用户代理" #: audits/models.py:104 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 @@ -1108,23 +1147,44 @@ msgstr "状态" msgid "Date login" msgstr "登录日期" -#: audits/serializers.py:62 audits/serializers.py:74 ops/models/adhoc.py:244 +#: audits/serializers.py:15 +msgid "Operate for display" +msgstr "操作(显示名称)" + +#: audits/serializers.py:27 +msgid "Status for display" +msgstr "状态(显示名称)" + +#: audits/serializers.py:28 +msgid "MFA for display" +msgstr "多因子认证状态(显示名称)" + +#: audits/serializers.py:65 audits/serializers.py:77 ops/models/adhoc.py:244 +#: terminal/serializers/session.py:34 msgid "Is success" msgstr "是否成功" -#: audits/serializers.py:73 ops/models/command.py:24 +#: audits/serializers.py:76 ops/models/command.py:24 #: xpack/plugins/cloud/models.py:218 msgid "Result" msgstr "结果" -#: audits/serializers.py:75 +#: audits/serializers.py:78 msgid "Hosts" msgstr "主机" -#: audits/serializers.py:76 +#: audits/serializers.py:79 msgid "Run as" msgstr "运行用户" +#: audits/serializers.py:81 +msgid "Run as for display" +msgstr "运行用户(显示名称)" + +#: audits/serializers.py:82 +msgid "User for display" +msgstr "用户(显示名称)" + #: authentication/api/mfa.py:60 msgid "Code is invalid" msgstr "Code无效" @@ -1711,7 +1771,7 @@ msgid "Time" msgstr "时间" #: ops/models/adhoc.py:243 ops/models/command.py:26 -#: terminal/serializers/session.py:30 +#: terminal/serializers/session.py:38 msgid "Is finished" msgstr "是否完成" @@ -1885,7 +1945,7 @@ msgstr "剪贴板粘贴" msgid "Clipboard copy paste" msgstr "剪贴板复制粘贴" -#: perms/models/asset_permission.py:95 +#: perms/models/asset_permission.py:95 perms/serializers/asset/permission.py:60 msgid "Actions" msgstr "动作" @@ -1920,6 +1980,60 @@ msgid "" "permission type. ({})" msgstr "" +#: perms/serializers/asset/permission.py:58 users/serializers/user.py:76 +msgid "Is expired" +msgstr " 是否过期" + +#: perms/serializers/asset/permission.py:59 +#: perms/serializers/database_app_permission.py:43 +#: perms/serializers/database_app_permission.py:62 +#: perms/serializers/k8s_app_permission.py:41 +#: perms/serializers/k8s_app_permission.py:60 +#: perms/serializers/remote_app_permission.py:36 users/serializers/user.py:75 +msgid "Is valid" +msgstr "账户是否有效" + +#: perms/serializers/asset/permission.py:61 +#: perms/serializers/database_app_permission.py:44 +#: perms/serializers/database_app_permission.py:63 +#: perms/serializers/k8s_app_permission.py:42 +#: perms/serializers/k8s_app_permission.py:61 +#: perms/serializers/remote_app_permission.py:37 users/serializers/group.py:36 +msgid "Users amount" +msgstr "用户数量" + +#: perms/serializers/asset/permission.py:62 +#: perms/serializers/database_app_permission.py:45 +#: perms/serializers/database_app_permission.py:64 +#: perms/serializers/k8s_app_permission.py:43 +#: perms/serializers/k8s_app_permission.py:62 +#: perms/serializers/remote_app_permission.py:38 +msgid "User groups amount" +msgstr "用户组数量" + +#: perms/serializers/asset/permission.py:65 +#: perms/serializers/database_app_permission.py:46 +#: perms/serializers/database_app_permission.py:65 +#: perms/serializers/k8s_app_permission.py:44 +#: perms/serializers/k8s_app_permission.py:63 +#: perms/serializers/remote_app_permission.py:39 +msgid "System users amount" +msgstr "系统用户数量" + +#: perms/serializers/database_app_permission.py:47 +#: perms/serializers/database_app_permission.py:66 +#: perms/serializers/k8s_app_permission.py:45 +msgid "Database apps amount" +msgstr "数据库应用数量" + +#: perms/serializers/k8s_app_permission.py:64 +msgid "K8s apps amount" +msgstr "K8S 应用数量" + +#: perms/serializers/remote_app_permission.py:40 +msgid "Remote apps amount" +msgstr "远程应用数量" + #: perms/utils/asset/user_permission.py:30 msgid "Favorite" msgstr "收藏夹" @@ -2282,9 +2396,9 @@ msgstr "Web终端" msgid "File manager" msgstr "文件管理" -#: templates/_nav.html:110 +#: templates/_nav.html:110 terminal/serializers/session.py:37 msgid "Terminal" -msgstr "终端管理" +msgstr "终端" #: templates/_nav.html:121 msgid "Job Center" @@ -2592,6 +2706,14 @@ msgstr "会话" msgid "Risk level" msgstr "风险等级" +#: terminal/backends/command/serializers.py:19 +msgid "Risk level for display" +msgstr "风险等级(显示名称)" + +#: terminal/backends/command/serializers.py:21 +msgid "Timestamp" +msgstr "时间戳" + #: terminal/exceptions.py:8 msgid "Bulk create not support" msgstr "不支持批量创建" @@ -2656,6 +2778,30 @@ msgstr "结束日期" msgid "Args" msgstr "参数" +#: terminal/serializers/session.py:30 +msgid "User ID" +msgstr "用户 ID" + +#: terminal/serializers/session.py:31 +msgid "Asset ID" +msgstr "资产 ID" + +#: terminal/serializers/session.py:32 +msgid "System user ID" +msgstr "系统用户 ID" + +#: terminal/serializers/session.py:33 +msgid "Login from for display" +msgstr "登录来源(显示名称)" + +#: terminal/serializers/session.py:35 +msgid "Can replay" +msgstr "是否可重放" + +#: terminal/serializers/session.py:36 +msgid "Can join" +msgstr "是否可加入" + #: terminal/serializers/terminal.py:38 terminal/serializers/terminal.py:46 msgid "Not found" msgstr "没有发现" @@ -2667,7 +2813,7 @@ msgid "" "%(command)s" msgstr "危险命令告警: [%(name)s->%(login_from)s@%(remote_addr)s] $%(command)s" -#: terminal/utils.py:83 +#: terminal/utils.py:80 #, python-format msgid "" "\n" @@ -3066,7 +3212,23 @@ msgstr "管理员" msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" -#: users/serializers/user.py:49 users/serializers/user.py:83 +#: users/serializers/user.py:45 +msgid "MFA level for display" +msgstr "多因子认证等级(显示名称)" + +#: users/serializers/user.py:46 +msgid "Login blocked" +msgstr "登录被阻塞" + +#: users/serializers/user.py:47 +msgid "Can update" +msgstr "是否可更新" + +#: users/serializers/user.py:48 +msgid "Can delete" +msgstr "是否可删除" + +#: users/serializers/user.py:49 users/serializers/user.py:81 msgid "Organization role name" msgstr "组织角色名称" @@ -3074,34 +3236,34 @@ msgstr "组织角色名称" msgid "Is first login" msgstr "首次登录" -#: users/serializers/user.py:75 -msgid "Is valid" -msgstr "账户是否有效" - -#: users/serializers/user.py:76 -msgid "Is expired" -msgstr " 是否过期" - #: users/serializers/user.py:77 msgid "Avatar url" msgstr "头像路径" -#: users/serializers/user.py:81 +#: users/serializers/user.py:79 msgid "Groups name" msgstr "用户组名" -#: users/serializers/user.py:82 +#: users/serializers/user.py:80 msgid "Source name" msgstr "用户来源名" -#: users/serializers/user.py:84 +#: users/serializers/user.py:82 msgid "Super role name" msgstr "超级角色名称" -#: users/serializers/user.py:85 +#: users/serializers/user.py:83 msgid "Total role name" msgstr "汇总角色名称" +#: users/serializers/user.py:84 +msgid "MFA enabled" +msgstr "是否开启多因子认证" + +#: users/serializers/user.py:85 +msgid "MFA force enabled" +msgstr "强制启用多因子认证" + #: users/serializers/user.py:108 msgid "Role limit to {}" msgstr "角色只能为 {}" @@ -4315,6 +4477,9 @@ msgstr "旗舰版" msgid "Community edition" msgstr "社区版" +#~ msgid "MFA level" +#~ msgstr "多因子认证级别" + #~ msgid "Beijing unicom" #~ msgstr "北京联通" @@ -4811,9 +4976,6 @@ msgstr "社区版" #~ msgid "Update command filter rule" #~ msgstr "更新命令过滤器规则" -#~ msgid "Update domain" -#~ msgstr "更新网域" - #~ msgid "Domain detail" #~ msgstr "网域详情" @@ -4874,9 +5036,6 @@ msgstr "社区版" #~ msgid "Last run" #~ msgstr "最后运行" -#~ msgid "Time delta" -#~ msgstr "运行时间" - #~ msgid "Is success " #~ msgstr "成功" @@ -4993,21 +5152,6 @@ msgstr "社区版" #~ msgid "Validity period" #~ msgstr "有效期" -#~ msgid "User count" -#~ msgstr "用户数量" - -#~ msgid "User group count" -#~ msgstr "用户组数量" - -#~ msgid "Asset count" -#~ msgstr "资产数量" - -#~ msgid "Node count" -#~ msgstr "节点数量" - -#~ msgid "System user count" -#~ msgstr "系统用户数量" - #~ msgid "Create permission" #~ msgstr "创建授权规则" @@ -5038,18 +5182,12 @@ msgstr "社区版" #~ msgid "Select DatabaseApp" #~ msgstr "选择数据库应用" -#~ msgid "DatabaseApp count" -#~ msgstr "数据库应用数量" - #~ msgid "Add user to permission" #~ msgstr "添加用户" #~ msgid "Add user group to permission" #~ msgstr "添加用户组" -#~ msgid "RemoteApp count" -#~ msgstr "远程应用数量" - #~ msgid "RemoteApp list of " #~ msgstr "远程应用列表" @@ -5484,9 +5622,6 @@ msgstr "社区版" #~ msgid "Replay session" #~ msgstr "回放会话" -#~ msgid "Download replay" -#~ msgstr "下载录像" - #~ msgid "Monitor session" #~ msgstr "监控" @@ -5731,9 +5866,6 @@ msgstr "社区版" #~ msgid "Sync success" #~ msgstr "同步成功" -#~ msgid "New count" -#~ msgstr "新增" - #~ msgid "Unsync count" #~ msgstr "未同步" diff --git a/apps/perms/serializers/asset/permission.py b/apps/perms/serializers/asset/permission.py index cfddfdd99..475b83ee1 100644 --- a/apps/perms/serializers/asset/permission.py +++ b/apps/perms/serializers/asset/permission.py @@ -2,8 +2,8 @@ # from rest_framework import serializers +from django.utils.translation import ugettext_lazy as _ -from django.db.models import Count from orgs.mixins.serializers import BulkOrgResourceModelSerializer from perms.models import AssetPermission, Action @@ -54,6 +54,16 @@ class AssetPermissionSerializer(BulkOrgResourceModelSerializer): ] fields = small_fields + m2m_fields read_only_fields = ['created_by', 'date_created'] + extra_kwargs = { + 'is_expired': {'label': _('Is expired')}, + 'is_valid': {'label': _('Is valid')}, + 'actions': {'label': _('Actions')}, + 'users_amount': {'label': _('Users amount')}, + 'user_groups_amount': {'label': _('User groups amount')}, + 'assets_amount': {'label': _('Assets amount')}, + 'nodes_amount': {'label': _('Nodes amount')}, + 'system_users_amount': {'label': _('System users amount')}, + } @classmethod def setup_eager_loading(cls, queryset): diff --git a/apps/perms/serializers/database_app_permission.py b/apps/perms/serializers/database_app_permission.py index 0442a6122..3cd7f3245 100644 --- a/apps/perms/serializers/database_app_permission.py +++ b/apps/perms/serializers/database_app_permission.py @@ -2,8 +2,8 @@ # from django.db.models import Count from rest_framework import serializers +from django.utils.translation import ugettext_lazy as _ -from common.fields import StringManyToManyField from common.serializers import AdaptedBulkListSerializer from orgs.mixins.serializers import BulkOrgResourceModelSerializer from .. import models @@ -39,6 +39,13 @@ class DatabaseAppPermissionSerializer(AmountMixin, BulkOrgResourceModelSerialize 'created_by', 'date_created', 'users_amount', 'user_groups_amount', 'database_apps_amount', 'system_users_amount', ] + extra_kwargs = { + 'is_valid': {'label': _('Is valid')}, + 'users_amount': {'label': _('Users amount')}, + 'user_groups_amount': {'label': _('User groups amount')}, + 'system_users_amount': {'label': _('System users amount')}, + 'database_apps_amount': {'label': _('Database apps amount')}, + } class DatabaseAppPermissionListSerializer(AmountMixin, BulkOrgResourceModelSerializer): @@ -51,3 +58,10 @@ class DatabaseAppPermissionListSerializer(AmountMixin, BulkOrgResourceModelSeria 'date_start', 'date_expired', 'is_valid', 'database_apps_amount', 'system_users_amount', 'created_by', 'date_created', 'is_expired' ] + extra_kwargs = { + 'is_valid': {'label': _('Is valid')}, + 'users_amount': {'label': _('Users amount')}, + 'user_groups_amount': {'label': _('User groups amount')}, + 'system_users_amount': {'label': _('System users amount')}, + 'database_apps_amount': {'label': _('Database apps amount')}, + } diff --git a/apps/perms/serializers/k8s_app_permission.py b/apps/perms/serializers/k8s_app_permission.py index 0c836bc27..96f23ace6 100644 --- a/apps/perms/serializers/k8s_app_permission.py +++ b/apps/perms/serializers/k8s_app_permission.py @@ -2,6 +2,7 @@ # from django.db.models import Count from rest_framework import serializers +from django.utils.translation import ugettext_lazy as _ from orgs.mixins.serializers import BulkOrgResourceModelSerializer from .. import models @@ -36,6 +37,13 @@ class K8sAppPermissionSerializer(AmountMixin, BulkOrgResourceModelSerializer): 'created_by', 'date_created', 'users_amount', 'user_groups_amount', 'k8s_apps_amount', 'system_users_amount', 'id' ] + extra_kwargs = { + 'is_valid': {'label': _('Is valid')}, + 'users_amount': {'label': _('Users amount')}, + 'user_groups_amount': {'label': _('User groups amount')}, + 'system_users_amount': {'label': _('System users amount')}, + 'database_apps_amount': {'label': _('Database apps amount')}, + } class K8sAppPermissionListSerializer(AmountMixin, BulkOrgResourceModelSerializer): @@ -48,3 +56,10 @@ class K8sAppPermissionListSerializer(AmountMixin, BulkOrgResourceModelSerializer 'date_start', 'date_expired', 'is_valid', 'k8s_apps_amount', 'system_users_amount', 'created_by', 'date_created', 'is_expired' ] + extra_kwargs = { + 'is_valid': {'label': _('Is valid')}, + 'users_amount': {'label': _('Users amount')}, + 'user_groups_amount': {'label': _('User groups amount')}, + 'system_users_amount': {'label': _('System users amount')}, + 'k8s_apps_amount': {'label': _('K8s apps amount')}, + } diff --git a/apps/perms/serializers/remote_app_permission.py b/apps/perms/serializers/remote_app_permission.py index a0bd7c410..75a20436e 100644 --- a/apps/perms/serializers/remote_app_permission.py +++ b/apps/perms/serializers/remote_app_permission.py @@ -2,6 +2,7 @@ # from rest_framework import serializers from django.db.models import Count +from django.utils.translation import ugettext_lazy as _ from common.serializers import AdaptedBulkListSerializer from orgs.mixins.serializers import BulkOrgResourceModelSerializer @@ -31,6 +32,13 @@ class RemoteAppPermissionSerializer(BulkOrgResourceModelSerializer): ] fields = small_fields + m2m_fields read_only_fields = ['created_by', 'date_created'] + extra_kwargs = { + 'is_valid': {'label': _('Is valid')}, + 'users_amount': {'label': _('Users amount')}, + 'user_groups_amount': {'label': _('User groups amount')}, + 'system_users_amount': {'label': _('System users amount')}, + 'remote_apps_amount': {'label': _('Remote apps amount')}, + } @classmethod def setup_eager_loading(cls, queryset): diff --git a/apps/terminal/backends/command/serializers.py b/apps/terminal/backends/command/serializers.py index c4cf57b04..b13405e46 100644 --- a/apps/terminal/backends/command/serializers.py +++ b/apps/terminal/backends/command/serializers.py @@ -16,9 +16,9 @@ class SessionCommandSerializer(serializers.Serializer): output = serializers.CharField(max_length=1024, allow_blank=True, label=_("Output")) session = serializers.CharField(max_length=36, label=_("Session")) risk_level = serializers.ChoiceField(required=False, label=_("Risk level"), choices=AbstractSessionCommand.RISK_LEVEL_CHOICES) - risk_level_display = serializers.SerializerMethodField() + risk_level_display = serializers.SerializerMethodField(label=_('Risk level for display')) org_id = serializers.CharField(max_length=36, required=False, default='', allow_null=True, allow_blank=True) - timestamp = serializers.IntegerField() + timestamp = serializers.IntegerField(label=_('Timestamp')) @staticmethod def get_risk_level_display(obj): diff --git a/apps/terminal/serializers/session.py b/apps/terminal/serializers/session.py index a4adcae21..9b1a128e7 100644 --- a/apps/terminal/serializers/session.py +++ b/apps/terminal/serializers/session.py @@ -27,7 +27,15 @@ class SessionSerializer(BulkOrgResourceModelSerializer): ] extra_kwargs = { "protocol": {'label': _('Protocol')}, - 'is_finished': {'label': _('Is finished')} + 'user_id': {'label': _('User ID')}, + 'asset_id': {'label': _('Asset ID')}, + 'system_user_id': {'label': _('System user ID')}, + 'login_from_display': {'label': _('Login from for display')}, + 'is_success': {'label': _('Is success')}, + 'can_replay': {'label': _('Can replay')}, + 'can_join': {'label': _('Can join')}, + 'terminal': {'label': _('Terminal')}, + 'is_finished': {'label': _('Is finished')}, } diff --git a/apps/users/serializers/group.py b/apps/users/serializers/group.py index 24805d0f4..8dba1025d 100644 --- a/apps/users/serializers/group.py +++ b/apps/users/serializers/group.py @@ -32,7 +32,9 @@ class UserGroupSerializer(BulkOrgResourceModelSerializer): 'users', 'users_amount', ] extra_kwargs = { - 'created_by': {'label': _('Created by'), 'read_only': True} + 'created_by': {'label': _('Created by'), 'read_only': True}, + 'users_amount': {'label': _('Users amount')}, + 'id': {'label': _('ID')}, } def __init__(self, *args, **kwargs): diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index af2cf596d..e59467173 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -42,10 +42,10 @@ class UserSerializer(CommonBulkSerializerMixin, serializers.ModelSerializer): choices=PASSWORD_STRATEGY_CHOICES, required=False, initial=0, label=_('Password strategy'), write_only=True ) - mfa_level_display = serializers.ReadOnlyField(source='get_mfa_level_display') - login_blocked = serializers.SerializerMethodField() - can_update = serializers.SerializerMethodField() - can_delete = serializers.SerializerMethodField() + mfa_level_display = serializers.ReadOnlyField(source='get_mfa_level_display', label=_('MFA level for display')) + login_blocked = serializers.SerializerMethodField(label=_('Login blocked')) + can_update = serializers.SerializerMethodField(label=_('Can update')) + can_delete = serializers.SerializerMethodField(label=_('Can delete')) org_roles = serializers.ListField(label=_('Organization role name'), allow_null=True, required=False, child=serializers.ChoiceField(choices=ORG_ROLE.choices)) key_prefix_block = "_LOGIN_BLOCK_{}" @@ -76,13 +76,13 @@ class UserSerializer(CommonBulkSerializerMixin, serializers.ModelSerializer): 'is_expired': {'label': _('Is expired')}, 'avatar_url': {'label': _('Avatar url')}, 'created_by': {'read_only': True, 'allow_blank': True}, - 'can_update': {'read_only': True}, - 'can_delete': {'read_only': True}, 'groups_display': {'label': _('Groups name')}, 'source_display': {'label': _('Source name')}, 'org_role_display': {'label': _('Organization role name')}, 'role_display': {'label': _('Super role name')}, - 'total_role_display': {'label': _('Total role name')} + 'total_role_display': {'label': _('Total role name')}, + 'mfa_enabled': {'label': _('MFA enabled')}, + 'mfa_force_enabled': {'label': _('MFA force enabled')}, } def __init__(self, *args, **kwargs):