From 68ccec6b9c1ef35713bfa6a9a00ace3dca408b78 Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 2 Jan 2018 17:02:03 +0800 Subject: [PATCH 01/21] =?UTF-8?q?[UPdate]=20=E4=BF=AE=E6=94=B9cookie?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ops/models.py | 1 + apps/static/js/jumpserver.js | 13 ++++++++++++- apps/templates/_user_profile.html | 8 ++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/apps/ops/models.py b/apps/ops/models.py index 3f83e8ffd..accdfe78f 100644 --- a/apps/ops/models.py +++ b/apps/ops/models.py @@ -235,6 +235,7 @@ class AdHoc(models.Model): return result.results_raw, result.results_summary except AnsibleError as e: logger.error("Failed run adhoc {}, {}".format(self.task.name, e)) + pass @become.setter def become(self, item): diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js index 5812e0191..d8db987ad 100644 --- a/apps/static/js/jumpserver.js +++ b/apps/static/js/jumpserver.js @@ -357,5 +357,16 @@ String.prototype.format = function(args) { function setCookie(key, value) { var expires = new Date(); expires.setTime(expires.getTime() + (24 * 60 * 60 * 1000)); - document.cookie = key + '=' + value + ';expires=' + expires.toUTCString(); + document.cookie = key + '=' + value + ';expires=' + expires.toUTCString() + ';path=/'; + console.log("Cookie: " + document.cookie) +} + + +function delCookie(key) { + var expires = new Date(); + expires.setTime(expires.getTime() - 1); + var val = getCookie(key); + if (val !== null) { + document.cookie = key + '=' + val + ";expires" + expires.toUTCString() + ';path=/'; + } } diff --git a/apps/templates/_user_profile.html b/apps/templates/_user_profile.html index a8572dfc9..c2f341871 100644 --- a/apps/templates/_user_profile.html +++ b/apps/templates/_user_profile.html @@ -37,15 +37,19 @@ $(document).ready(function () { }) .on('click', '#switch_admin', function () { + var cookieName = "IN_ADMIN_PAGE"; setTimeout(function () { - setCookie("IN_ADMIN_PAGE", "Yes"); + delCookie(cookieName); + setCookie(cookieName, "Yes"); window.location = "/" }, 100) }) .on('click', '#switch_user', function () { + var cookieName = "IN_ADMIN_PAGE"; setTimeout(function () { console.log("Set to No"); - setCookie("IN_ADMIN_PAGE", "No"); + delCookie(cookieName); + setCookie(cookieName, "No"); window.location = "/" }, 100); }) From 720dc9ab0539a4b0f4f640769bed3d62bf86556d Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 2 Jan 2018 19:36:13 +0800 Subject: [PATCH 02/21] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E5=A4=8D=E4=BB=A5?= =?UTF-8?q?=E4=B8=8Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - session时区 - 切换管理和用户页面cookie问题 - 创建权限时验证 - 一些翻译 --- apps/jumpserver/settings.py | 4 +- apps/locale/zh/LC_MESSAGES/django.mo | Bin 28400 -> 28824 bytes apps/locale/zh/LC_MESSAGES/django.po | 104 +++++++++++++-------------- apps/perms/forms.py | 36 +++++++--- apps/templates/_header_bar.html | 10 +-- apps/terminal/api.py | 2 +- 6 files changed, 88 insertions(+), 68 deletions(-) diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 45c6fba88..1fe4478d5 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -242,7 +242,6 @@ LOGGING = { # https://docs.djangoproject.com/en/1.10/topics/i18n/ LANGUAGE_CODE = 'en-us' -# TIME_ZONE = 'UTC' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True @@ -300,7 +299,8 @@ REST_FRAMEWORK = { 'users.authentication.SessionAuthentication', ), 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',), - 'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S', + 'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S %z', + 'DATETIME_INPUT_FORMATS': ['%Y-%m-%d %H:%M:%S %z'], } AUTHENTICATION_BACKENDS = [ diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 64af76ad932e6d177defc827ddc1a91e29e4145b..93a4a3d4ab9367148f8aaeb812cf03c7667d5fb8 100644 GIT binary patch delta 10801 zcmbW-d3;S*zsK<%f=n7?%yGmRb4*pFs78vQMKwi>5{Y?8V&;fBs;Qb=G+L>7Y-km2 zm7-NttHz>jh|sF*QMW}0_wzmbmtOzgyI;>Q@AdobwbxpE?R`$-d7j&s{FeXZ=e=CQ ze~H6!#m{jnVv|tEnNz@V;=)yRoTOTgGY<#jG`x$a=$jhpIIFNj9dhb#+p+ z9xR5(QP*8Y?aVJ2g#J0&usD`%?5?;vYQP4T zH$!b{8>_dsdS}#iFQ9f{FzOweZs%v43(U7rk0Pt_qIm^_yn1~;r=+Qlqu$T&P;0!1 zTH;OA)c>*bf1vj6A!?{%OYrjM@*}8Cy@=Y>>!@*lLrwH2>U#gC?!zsK+M@>80^6b%Hn}P9UVW9>Z`p>IPR~fW8CQ z(a^Kljty`ZYHM>*Tl9yWFUXstcOd|^piZcXdY~rmj~X};3*cxo1^HHT#-YYvkJ^cI z7^3gMA82Tzn|9(JYC#WC1N-xa>B1n?#4XHrs5^^8J;Gk71&lzAHy*V^GcA7|b^Qvf zXQ5XUZKI((-ii9S9kvc%<64XAH$ATf6*L> z+JTX+*nf2xOQ8zRvJ>l2cd!*T@E+7Vu^;uUzd+sTIn)j0pdLk@)$gJf_79fFB7Bzh zNFq?YDQG1Ki(7+L>0qUSGXo`)n4Ql1dsEKBw?qD94!!4)<9lB~diLimzlge%E2yo#jd}!s zp>{6xDR=A3p?0*U*$}nmPoNgo0X2R+7H58^FAWVm8udAzsuQ@->RDFbfqJ%wPy?N^ zdJbwqzoQmZpq)EjY19oxpmw+>K8g{}oh6er!wX!3qM{xo*(HS!rbtiXG zTk6kfI$sX8@LH%lZ-u%(#`4anN6{1YZuLQbOnjRCSI1!#G;s}5CA^2)k+2wdCnHch(**Ty#iDjRK8F4Gr;$KG7YsqYBxA8QZp1ox z8ug6*+Pem$1}cr(xf)mqo1k`}h1m|ZV{xc{eNf{JK|SIWFAWck*{FrA!${nW5qJjm zmfuGWR4mqAm24hc zpuJ(3z&?02WF#o zbg}CC{I8**iMOBz_yRS-1q{GjsF&*x)I$G84Nx-9-H8a)BWZ`~*B+Ze-A9ZK{_3RE)sEp@P3%HM}J3ZXIq*)%dl~phV>sY-xYRg+& zy{qMYP&+ov^67Sdq2-x9*nbVQje;iLXC5?qlcroQg$pp_hg_t~S@1TTvJ6G7p$vqwe&gX*k!)DGMW?8?6CZE^DFaP)b;1hYgYdaHQ@uxgL=6OE{IcvOKvD&tG>uk%A_ki)C@Sb=ZNLXt(8u zEI)?of8OdhtbW`4+v-6t*+NkZ2sf*vUgEl5>(IsQZ6={ENHr&$Gf=-H=Ajn061BA( z?EF6SAZiDXqWXPj{$%xAmV58f(A!_=Wp~0r)CI**cUZ~tdZ^!aEl>-KG2>8o(jB#s zRMhozQ43gtd`UW)mfuB<`wub>|NiUi4qO`bTg+ot#Wv(M%tX}0>roSIvwR!Yx3v>JPy_cildPUAd1jP!zQ=k6F)bVaB2s(gU@niKs_0&d#Ty7M5WyvGXe}U;7ICuMS%% zXrP@~6_20>{KfnewUxmGT&tlL7L66KBWj#MRv&KpM9b5#H0Luc&$9D72C)BH@ooz8 zfO*V1o-wbW7I@n%IMAIi4E4w=p{}oi;n)zhz^FT!15`|KjYJL93^h?SYDZ$N-VZf!qU94&*Qc2o7)-vxT!$LZn{ACfs0%)``~>O| zoW^FDYv(Htawm#Jy?m`u10|vsHp24prWZBtY;zH6p{w28>txf=MEg+#oHQ?(SIt{k znDh5g13olE65RpInRQX;TcgH}v%HTv7`1@0zMSWuPD34+T8Fi$iLy~!ya$u;l;y2R zRDT|QcWjPFT{j)IfOK=IxyIaXek}F*KT1Ovo;5FtV#dH=!gb-`u{ zRKIelx4j0ce=7{cwy1eJp?07f`u_e;prJb&gBsvf>#*G1WPW1jzd;Rj+45YhNqz_Q zPLvvMR7f-bm%y5KL=pJbuK+?7_vF!IKzg?2QbGvhIYdS5Js z!z@oj_0K>($|YD3S70z^dT9jG*o5l13-t%dKGYT+MJ?z8hTyMOe}GzW&~W#BRn(te z%}`%JNvQsF%*9rJ$MXHCalOZ_@T2)FYT^f|1qF?8EpC=Y4O|&DKwZ=gv_{=w2Rq-@ z?1LI_FslCqRR8&I-Rms14r|R1tixf{L?_KlcK&C}AE4gyA|u@iDw*|A6GWq~k3~(~ z!_Ft7c5WO7>i7Qw8oJZBd^M9RK=EvV?n1iQK7j_~N$zLIKv?5-jJ&}m9+J8~gpXT|;f75uDxM+p9 zFxC3@HK*fK)YH)WG(R3E&JsF)BAU={fi>|CP9;7j%BoIuBy{Y>io{x?01-~~BObV? zolGoDzMXjVC_(;>ThRUU>z6o0csUVF40+^&FKGvGE}GC$pFEI=e56k^+7&q$fG3Ee z#AfndxJwstG@@ON$fbRk$fC`Rd@cGK?*B%!oYFY*lEe|KSHMf^%hA@wc^?Z=FOQRP zD<)tWJdOH)2ec>p5c+k#9-{~ypQ8SR*D*}@{}Rz&8OOVvj6^?-B|6Z)h#>@jdpI5< zfmlhdV*su}y;)`9%KFiP{$8R(`=ePtE%sKaLSP8W3Hqz1LUa+lsugwJ+1o zAigDDAhu9{)6RWJo=%&8y*uv`Bgl2^GLK?yq6`sF>?B_FWB(7+Nnfp@6b=yjOy4JT zWDtK7gNP)ii%5 z4gLDmQG?JghB3r*)JLL@w_Thn)EW|X$&aHBed+u_WD`TFZN~ycW!jCc&xhpwiEG3( z;y;8AZ!ABarPBwf--MHh`ovGvwh=`L9T&{!&8eo&b$z6*Tz@a>xJPW@++1Jg{`ibM zg(ydy((`|k#v4Q-&iAm6Z<6cS=;FLguHR~H@FSv))i>dI>pPnE4dOSVFtN_+D`{_{ zy&iQ$)6R06PIG<#o*;RG_|uBju@6y{7-NGhG_A|O6sJDcvW>J$Khm!Y^{>bm*!dlH zE(zCJ?Q1=M{f*Yo3adH!2kl|_1@SR)p8N>$De)K4lA4am#5vmCeHlM!$HON?5u!Dr zBaHf3B9C?nVmWOc=LqkQ{P>2#+r-zzMDi8HX4<201EJ$2c{h9?^N*3%-jQFxudMwM zRwia!{vLg&)81{@45q!zegFBMCaK4XO2iD>Kj3ZDag(S*oF@7bI$kFp^R@UJ58oil z5g%}!jz+{H+OHG;_$vIlj&;ZnST5%3`A?v+kC;UaqC+j>7uwxWM>}jqyh@BC|J_&R z4^8s7h*!uXtk#`;3GGzEpSF(SxEikzakM`tw$b(-%Jx~;L}#mCqP>84&hnNxiQHR_Mh_Y~O1k{}b078I|7Lve z(>_alPRt?FIltAeC3V(VyE8sR{uuTq5^2{~2aZzY$wVCOU-kTF`pW#-WlrN{{_!}C z*NDT^mf~e1jnFZaxMF?3pdCZ>B<54AYjsj*v9*uV{+{@e{7XDeltxML z3`j~CFw_&|v`tPAuxpOP`jza{Y}Jv-3X5()zFN zel2(YtlR~g^0N2l?ajyJ?pe~=731g|6`m2 Z?*(O7>v`+3LYv>Ywq$#DnS}F!{{uhy5$^y1 delta 10390 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 Oe_FXCJ7;KK;Qs-_7-bXy diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 1962f867a..fe0ab8863 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Jumpserver 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-01-01 15:33+0800\n" +"POT-Creation-Date: 2018-01-02 18:11+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: assets/forms.py:23 assets/forms.py:53 assets/forms.py:99 perms/forms.py:36 +#: assets/forms.py:23 assets/forms.py:53 assets/forms.py:99 perms/forms.py:37 #: perms/templates/perms/asset_permission_asset.html:127 users/forms.py:240 msgid "Select asset groups" msgstr "选择资产组" @@ -43,7 +43,7 @@ msgid "Default using cluster admin user" msgstr "默认使用管理用户" #: assets/forms.py:76 assets/forms.py:81 assets/forms.py:127 -#: assets/templates/assets/asset_group_detail.html:70 perms/forms.py:33 +#: assets/templates/assets/asset_group_detail.html:70 perms/forms.py:34 #: perms/templates/perms/asset_permission_asset.html:99 users/forms.py:237 msgid "Select assets" msgstr "选择资产" @@ -84,7 +84,7 @@ msgstr "资产" #: assets/templates/assets/cluster_list.html:19 #: assets/templates/assets/system_user_detail.html:53 #: assets/templates/assets/system_user_list.html:24 ops/models.py:31 -#: ops/templates/ops/task_detail.html:56 ops/templates/ops/task_list.html:39 +#: ops/templates/ops/task_detail.html:56 ops/templates/ops/task_list.html:34 #: perms/models.py:14 #: perms/templates/perms/asset_permission_create_update.html:33 #: perms/templates/perms/asset_permission_detail.html:62 @@ -746,7 +746,7 @@ msgstr "不可达" #: assets/templates/assets/system_user_list.html:31 #: assets/templates/assets/user_asset_list.html:27 #: ops/templates/ops/adhoc_history.html:59 ops/templates/ops/task_adhoc.html:61 -#: ops/templates/ops/task_history.html:62 ops/templates/ops/task_list.html:46 +#: ops/templates/ops/task_history.html:62 ops/templates/ops/task_list.html:41 #: perms/templates/perms/asset_permission_list.html:32 #: terminal/templates/terminal/session_list.html:78 #: terminal/templates/terminal/terminal_list.html:36 @@ -774,7 +774,7 @@ msgstr "更新" #: assets/templates/assets/asset_list.html:96 #: assets/templates/assets/cluster_list.html:44 #: assets/templates/assets/system_user_list.html:85 -#: ops/templates/ops/task_list.html:76 +#: ops/templates/ops/task_list.html:70 #: perms/templates/perms/asset_permission_list.html:74 #: terminal/templates/terminal/terminal_list.html:73 #: users/templates/users/user_group_list.html:41 @@ -1000,7 +1000,6 @@ msgid "Test assets connective" msgstr "测试资产可连接性" #: assets/templates/assets/cluster_assets.html:77 -#: ops/templates/ops/task_list.html:75 msgid "Run" msgstr "执行" @@ -1235,7 +1234,7 @@ msgid "Options" msgstr "选项" #: ops/models.py:152 ops/templates/ops/adhoc_detail.html:53 -#: ops/templates/ops/task_adhoc.html:56 ops/templates/ops/task_list.html:42 +#: ops/templates/ops/task_adhoc.html:56 ops/templates/ops/task_list.html:37 msgid "Hosts" msgstr "主机" @@ -1257,36 +1256,36 @@ msgstr "Become" msgid "Create by" msgstr "创建者" -#: ops/models.py:306 +#: ops/models.py:307 msgid "Start time" msgstr "开始时间" -#: ops/models.py:307 +#: ops/models.py:308 msgid "End time" msgstr "完成时间" -#: ops/models.py:308 ops/templates/ops/adhoc_history.html:57 -#: ops/templates/ops/task_history.html:60 ops/templates/ops/task_list.html:45 +#: ops/models.py:309 ops/templates/ops/adhoc_history.html:57 +#: ops/templates/ops/task_history.html:60 ops/templates/ops/task_list.html:40 msgid "Time" msgstr "时间" -#: ops/models.py:309 ops/templates/ops/adhoc_detail.html:106 +#: ops/models.py:310 ops/templates/ops/adhoc_detail.html:106 #: ops/templates/ops/adhoc_history.html:55 #: ops/templates/ops/adhoc_history_detail.html:66 #: ops/templates/ops/task_detail.html:80 ops/templates/ops/task_history.html:58 msgid "Is finished" msgstr "是否完成" -#: ops/models.py:310 ops/templates/ops/adhoc_history.html:56 +#: ops/models.py:311 ops/templates/ops/adhoc_history.html:56 #: ops/templates/ops/task_history.html:59 msgid "Is success" msgstr "是否成功" -#: ops/models.py:311 +#: ops/models.py:312 msgid "Adhoc raw result" msgstr "结果" -#: ops/models.py:312 +#: ops/models.py:313 msgid "Adhoc result summary" msgstr "汇总" @@ -1296,7 +1295,7 @@ msgid "Version detail" msgstr "版本详情" #: ops/templates/ops/adhoc_detail.html:22 -#: ops/templates/ops/adhoc_history.html:22 ops/views.py:120 +#: ops/templates/ops/adhoc_history.html:22 ops/views.py:104 msgid "Version run history" msgstr "执行历史" @@ -1308,7 +1307,7 @@ msgstr "执行历史" msgid "ID" msgstr "ID" -#: ops/templates/ops/adhoc_detail.html:94 ops/templates/ops/task_list.html:40 +#: ops/templates/ops/adhoc_detail.html:94 ops/templates/ops/task_list.html:35 msgid "Run times" msgstr "执行次数" @@ -1368,7 +1367,7 @@ msgstr "失败/成功/总" msgid "Version" msgstr "版本" -#: ops/templates/ops/adhoc_history_detail.html:19 ops/views.py:133 +#: ops/templates/ops/adhoc_history_detail.html:19 ops/views.py:117 msgid "Run history detail" msgstr "执行历史详情" @@ -1394,12 +1393,12 @@ msgid "Success assets" msgstr "成功资产" #: ops/templates/ops/task_adhoc.html:19 ops/templates/ops/task_detail.html:19 -#: ops/templates/ops/task_history.html:19 ops/views.py:58 +#: ops/templates/ops/task_history.html:19 ops/views.py:52 msgid "Task detail" msgstr "任务详情" #: ops/templates/ops/task_adhoc.html:22 ops/templates/ops/task_detail.html:22 -#: ops/templates/ops/task_history.html:22 ops/views.py:71 +#: ops/templates/ops/task_history.html:22 ops/views.py:65 msgid "Task versions" msgstr "任务各版本" @@ -1429,7 +1428,7 @@ msgstr "最新版本" msgid "Contents" msgstr "内容" -#: ops/templates/ops/task_list.html:25 ops/templates/ops/task_list.html:30 +#: ops/templates/ops/task_list.html:20 ops/templates/ops/task_list.html:25 #: templates/_base_list.html:43 templates/_header_bar.html:8 #: terminal/templates/terminal/command_list.html:60 #: users/templates/users/login_log_list.html:35 @@ -1437,29 +1436,29 @@ msgstr "内容" msgid "Search" msgstr "搜索" -#: ops/templates/ops/task_list.html:41 +#: ops/templates/ops/task_list.html:36 msgid "Versions" msgstr "版本" -#: ops/templates/ops/task_list.html:43 +#: ops/templates/ops/task_list.html:38 msgid "Success" msgstr "成功" -#: ops/templates/ops/task_list.html:44 +#: ops/templates/ops/task_list.html:39 #: users/templates/users/login_log_list.html:54 msgid "Date" msgstr "日期" -#: ops/views.py:41 ops/views.py:57 ops/views.py:70 ops/views.py:83 -#: ops/views.py:106 ops/views.py:119 ops/views.py:132 +#: ops/views.py:35 ops/views.py:51 ops/views.py:64 ops/views.py:77 +#: ops/views.py:90 ops/views.py:103 ops/views.py:116 msgid "Ops" msgstr "作业中心" -#: ops/views.py:42 +#: ops/views.py:36 msgid "Task list" msgstr "任务列表" -#: ops/views.py:84 +#: ops/views.py:78 msgid "Task run history" msgstr "执行历史" @@ -1480,30 +1479,31 @@ msgstr "选择用户" msgid "User" msgstr "用户" -#: perms/forms.py:30 perms/templates/perms/asset_permission_user.html:127 +#: perms/forms.py:31 perms/templates/perms/asset_permission_user.html:127 msgid "Select user groups" msgstr "选择用户组" -#: perms/forms.py:39 perms/templates/perms/asset_permission_detail.html:144 +#: perms/forms.py:40 perms/templates/perms/asset_permission_detail.html:144 #: users/forms.py:243 msgid "Select system users" msgstr "选择系统用户" -#: perms/forms.py:44 -msgid "User or user group at least one required" +#: perms/forms.py:52 +msgid "User or group at least one required" msgstr "" -#: perms/forms.py:45 -msgid "Asset or Asset group at least one required" -msgstr "" +#: perms/forms.py:60 +msgid "Asset or group at least one required" +msgstr "资产或组至少需要选择一个" -#: perms/forms.py:59 -msgid "Asset {} not have [{}] system users, please check \n" -msgstr "" +#: perms/forms.py:78 +msgid "Asset {} of cluster {} not have [{}] system users, please check \n" +msgstr "资产 {} 所在集群 {} 不包含系统用户 [{}] 请检查\n" -#: perms/forms.py:67 -msgid "Asset {}: {} not have [{}] system users, please check" -msgstr "" +#: perms/forms.py:87 +msgid "" +"Asset {}(group {}) of cluster {} not have [{}] system users, please check \n" +msgstr "资产 {}(组 {}) 所在集群 {} 不包含系统用户 [{}] 请检查\n" #: perms/models.py:16 perms/templates/perms/asset_permission_list.html:27 #: templates/_nav.html:13 users/models/user.py:38 @@ -1740,10 +1740,10 @@ msgstr "任务" #: templates/_nav.html:47 templates/_nav.html:50 #: terminal/templates/terminal/session_list.html:74 -#: terminal/views/command.py:47 terminal/views/session.py:54 -#: terminal/views/session.py:77 terminal/views/session.py:94 -#: terminal/views/session.py:116 terminal/views/terminal.py:31 -#: terminal/views/terminal.py:46 terminal/views/terminal.py:58 +#: terminal/views/command.py:47 terminal/views/session.py:75 +#: terminal/views/session.py:92 terminal/views/session.py:114 +#: terminal/views/terminal.py:31 terminal/views/terminal.py:46 +#: terminal/views/terminal.py:58 msgid "Terminal" msgstr "终端" @@ -1882,7 +1882,7 @@ msgid "Goto" msgstr "" #: terminal/templates/terminal/session_detail.html:17 -#: terminal/views/session.py:117 +#: terminal/views/session.py:115 msgid "Session detail" msgstr "会话详情" @@ -1971,14 +1971,14 @@ msgstr "接受终端注册" msgid "Info" msgstr "信息" -#: terminal/views/session.py:55 terminal/views/session.py:95 -msgid "Session offline list" -msgstr "离线会话" - -#: terminal/views/session.py:78 +#: terminal/views/session.py:76 msgid "Session online list" msgstr "在线会话" +#: terminal/views/session.py:93 +msgid "Session offline list" +msgstr "离线会话" + #: terminal/views/terminal.py:32 msgid "Terminal list" msgstr "终端列表" diff --git a/apps/perms/forms.py b/apps/perms/forms.py index fbb0c8226..4e3c0bf72 100644 --- a/apps/perms/forms.py +++ b/apps/perms/forms.py @@ -15,7 +15,8 @@ class AssetPermissionForm(forms.ModelForm): widget=forms.SelectMultiple( attrs={'class': 'select2', 'data-placeholder': _('Select users')}, ), - label=_("User") + label=_("User"), + required=False, ) class Meta: @@ -41,35 +42,54 @@ class AssetPermissionForm(forms.ModelForm): help_texts = { 'name': '* required', 'system_users': '* required', - 'user_groups': _('User or user group at least one required'), - 'asset_groups': _('Asset or Asset group at least one required'), } + def clean_user_groups(self): + users = self.cleaned_data.get('users') + user_groups = self.cleaned_data.get('user_groups') + + if not users and not user_groups: + raise forms.ValidationError(_("User or group at least one required")) + return self.cleaned_data["user_groups"] + + def clean_asset_groups(self): + assets = self.cleaned_data.get('assets') + asset_groups = self.cleaned_data.get('asset_groups') + + if not assets and not asset_groups: + raise forms.ValidationError(_("Asset or group at least one required")) + + return self.cleaned_data["asset_groups"] + def clean_system_users(self): from assets.utils import check_assets_have_system_user errors = [] assets = self.cleaned_data['assets'] - asset_groups = self.cleaned_data['asset_groups'] - system_users = self.cleaned_data['system_users'] + asset_groups = self.cleaned_data.get('asset_groups') + system_users = self.cleaned_data.get('system_users') + + if not asset_groups and not assets: + return self.cleaned_data.get("system_users") error_data = check_assets_have_system_user(assets, system_users) if error_data: for asset, system_users in error_data.items(): - msg = _("Asset {} not have [{}] system users, please check \n") + msg = _("Asset {} of cluster {} not have [{}] system users, please check \n") error = forms.ValidationError(msg.format( asset.hostname, + asset.cluster.name, ", ".join(system_user.name for system_user in system_users) )) errors.append(error) for group in asset_groups: - msg = _("Asset {}: {} not have [{}] system users, please check") + msg = _("Asset {}(group {}) of cluster {} not have [{}] system users, please check \n") assets = group.assets.all() error_data = check_assets_have_system_user(assets, system_users) for asset, system_users in error_data.items(): errors.append(msg.format( - group.name, asset.hostname, + asset.hostname, group.name, asset.cluster.name, ", ".join(system_user.name for system_user in system_users) )) if errors: diff --git a/apps/templates/_header_bar.html b/apps/templates/_header_bar.html index 7cbb5fc87..447454616 100644 --- a/apps/templates/_header_bar.html +++ b/apps/templates/_header_bar.html @@ -3,11 +3,11 @@