From 3cdabaf8835afefe7473b094aa82dcedb9856c26 Mon Sep 17 00:00:00 2001 From: BaiJiangJie <32935519+BaiJiangJie@users.noreply.github.com> Date: Fri, 26 Jul 2019 16:16:06 +0800 Subject: [PATCH 1/8] =?UTF-8?q?[Update]=20=E7=B3=BB=E7=BB=9F=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=B5=84=E4=BA=A7=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=9B=B8=E5=85=B3=E7=9A=84=E6=89=80=E6=9C=89?= =?UTF-8?q?=E8=B5=84=E4=BA=A7=20(#3038)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Update] 系统用户资产管理页面获取相关的所有资产 * [Update] 系统用户资产管理页面获取相关的所有资产2 --- apps/assets/api/asset_user.py | 2 +- apps/assets/models/asset.py | 2 +- apps/assets/models/user.py | 16 ++++++++++++++++ apps/assets/signals_handler.py | 20 ++++++++++---------- apps/assets/tasks.py | 6 +++--- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/apps/assets/api/asset_user.py b/apps/assets/api/asset_user.py index 38d820349..b916e43ec 100644 --- a/apps/assets/api/asset_user.py +++ b/apps/assets/api/asset_user.py @@ -81,7 +81,7 @@ class AssetUserViewSet(IDInCacheFilterMixin, BulkModelViewSet): manager = AssetUserManager() if system_user_id: system_user = get_object_or_404(SystemUser, id=system_user_id) - assets = system_user.assets.all() + assets = system_user.get_all_assets() username = system_user.username elif admin_user_id: admin_user = get_object_or_404(AdminUser, id=admin_user_id) diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index 2161113e2..4a0816419 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -12,7 +12,6 @@ from django.core.cache import cache from django.db import models from django.utils.translation import ugettext_lazy as _ -from .user import AdminUser, SystemUser from .utils import Connectivity from orgs.mixins import OrgModelMixin, OrgManager @@ -320,6 +319,7 @@ class Asset(ProtocolsMixin, NodesRelationMixin, OrgModelMixin): @classmethod def generate_fake(cls, count=100): + from .user import AdminUser, SystemUser from random import seed, choice from django.db import IntegrityError from .node import Node diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index bbd808b80..0f6278f30 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -4,12 +4,15 @@ import logging +from functools import reduce from django.db import models +from django.db.models import Q from django.utils.translation import ugettext_lazy as _ from django.core.validators import MinValueValidator, MaxValueValidator from common.utils import get_signer from .base import AssetUser +from .asset import Asset __all__ = ['AdminUser', 'SystemUser'] @@ -144,6 +147,19 @@ class SystemUser(AssetUser): return False, matched_cmd return True, None + def get_all_assets(self): + args = [Q(systemuser=self)] + pattern = set() + nodes_keys = self.nodes.all().values_list('key', flat=True) + for key in nodes_keys: + pattern.add(r'^{0}$|^{0}:'.format(key)) + pattern = '|'.join(list(pattern)) + if pattern: + args.append(Q(nodes__key__regex=pattern)) + args = reduce(lambda x, y: x | y, args) + assets = Asset.objects.filter(args).distinct() + return assets + class Meta: ordering = ['name'] unique_together = [('name', 'org_id')] diff --git a/apps/assets/signals_handler.py b/apps/assets/signals_handler.py index b2316d7d0..70eecbd10 100644 --- a/apps/assets/signals_handler.py +++ b/apps/assets/signals_handler.py @@ -57,16 +57,16 @@ def on_system_user_update(sender, instance=None, created=True, **kwargs): push_system_user_to_assets.delay(instance, assets) -@receiver(m2m_changed, sender=SystemUser.nodes.through) -def on_system_user_nodes_change(sender, instance=None, **kwargs): - if instance and kwargs["action"] == "post_add": - logger.info("System user `{}` nodes update signal received".format(instance)) - assets = set() - nodes = kwargs['model'].objects.filter(pk__in=kwargs['pk_set']) - for node in nodes: - assets.update(set(node.get_all_assets())) - instance.assets.add(*tuple(assets)) - +# @receiver(m2m_changed, sender=SystemUser.nodes.through) +# def on_system_user_nodes_change(sender, instance=None, **kwargs): +# if instance and kwargs["action"] == "post_add": +# logger.info("System user `{}` nodes update signal received".format(instance)) +# assets = set() +# nodes = kwargs['model'].objects.filter(pk__in=kwargs['pk_set']) +# for node in nodes: +# assets.update(set(node.get_all_assets())) +# instance.assets.add(*tuple(assets)) +# @receiver(m2m_changed, sender=SystemUser.assets.through) def on_system_user_assets_change(sender, instance=None, **kwargs): diff --git a/apps/assets/tasks.py b/apps/assets/tasks.py index dbd6808f1..8d057f897 100644 --- a/apps/assets/tasks.py +++ b/apps/assets/tasks.py @@ -347,7 +347,7 @@ def test_system_user_connectivity_util(system_user, assets, task_name): @shared_task def test_system_user_connectivity_manual(system_user): task_name = _("Test system user connectivity: {}").format(system_user) - assets = system_user.get_related_assets() + assets = system_user.get_all_assets() return test_system_user_connectivity_util(system_user, assets, task_name) @@ -367,7 +367,7 @@ def test_system_user_connectivity_period(): system_users = SystemUser.objects.all() for system_user in system_users: task_name = _("Test system user connectivity period: {}").format(system_user) - assets = system_user.get_related_assets() + assets = system_user.get_all_assets() test_system_user_connectivity_util(system_user, assets, task_name) @@ -513,7 +513,7 @@ def push_system_user_util(system_user, assets, task_name): @shared_task def push_system_user_to_assets_manual(system_user): - assets = system_user.get_related_assets() + assets = system_user.get_all_assets() task_name = _("Push system users to assets: {}").format(system_user.name) return push_system_user_util(system_user, assets, task_name=task_name) From 99ce688a704245e80331c510c764b46b0fa5a2d9 Mon Sep 17 00:00:00 2001 From: AnJia Date: Mon, 29 Jul 2019 17:00:31 +0800 Subject: [PATCH 2/8] added Vagrantfile to support windows dev (#3036) --- .dockerignore | 4 +++- .gitignore | 2 ++ Vagrantfile | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 Vagrantfile diff --git a/.dockerignore b/.dockerignore index 51451ada1..cbc1f8c97 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,4 +4,6 @@ data/* .github tmp/* django.db -celerybeat.pid \ No newline at end of file +celerybeat.pid +### Vagrant ### +.vagrant/ \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1b4a445d5..9d65d375a 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ data/static docs/_build/ xpack logs/* +### Vagrant ### +.vagrant/ \ No newline at end of file diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 000000000..98e82ca5a --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,56 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +Vagrant.configure("2") do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://vagrantcloud.com/search. + config.vm.box_check_update = false + config.vm.box = "centos/7" + config.vm.hostname = "jumpserver" + config.vm.network "private_network", ip: "172.17.8.101" + config.vm.provider "virtualbox" do |vb| + vb.memory = "4096" + vb.cpus = 2 + vb.name = "jumpserver" + end + + config.vm.synced_folder ".", "/vagrant", type: "rsync", + rsync__verbose: true, + rsync__exclude: ['.git*', 'node_modules*','*.log','*.box','Vagrantfile'] + + config.vm.provision "shell", inline: <<-SHELL +## 设置yum的阿里云源 +sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo +sudo sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo +sudo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo +sudo yum makecache + +## 安装依赖包 +sudo yum install -y python36 python36-devel python36-pip \ + libtiff-devel libjpeg-devel libzip-devel freetype-devel \ + lcms2-devel libwebp-devel tcl-devel tk-devel sshpass \ + openldap-devel mariadb-devel mysql-devel libffi-devel \ + openssh-clients telnet openldap-clients gcc + +## 配置pip阿里云源 +mkdir /home/vagrant/.pip +cat << EOF | sudo tee -a /home/vagrant/.pip/pip.conf +[global] +timeout = 6000 +index-url = https://mirrors.aliyun.com/pypi/simple/ + +[install] +use-mirrors = true +mirrors = https://mirrors.aliyun.com/pypi/simple/ +trusted-host=mirrors.aliyun.com +EOF + +python3.6 -m venv /home/vagrant/venv +source /home/vagrant/venv/bin/activate +echo 'source /home/vagrant/venv/bin/activate' >> /home/vagrant/.bash_profile + SHELL +end From c6ec00e84d81cb7af41200632baa1b67b874b600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E5=B9=BF?= Date: Mon, 29 Jul 2019 17:01:27 +0800 Subject: [PATCH 3/8] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9collect=20stat?= =?UTF-8?q?ic=20file=E6=9C=BA=E5=88=B6=20(#3044)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/users/templates/users/_granted_assets.html | 2 +- jms | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/users/templates/users/_granted_assets.html b/apps/users/templates/users/_granted_assets.html index 4214aee93..31da3cd8b 100644 --- a/apps/users/templates/users/_granted_assets.html +++ b/apps/users/templates/users/_granted_assets.html @@ -156,7 +156,7 @@ function loadLabels() { } $(document).ready(function () { - loadLabels() + {#loadLabels()#} }).on('click', '.labels-menu li', function () { var val = $(this).text(); $("#user_assets_table_filter input").val(val); diff --git a/jms b/jms index 43c345406..d57c31e11 100755 --- a/jms +++ b/jms @@ -81,7 +81,7 @@ def make_migrations(): def collect_static(): print("Collect static files") os.chdir(os.path.join(BASE_DIR, 'apps')) - subprocess.call('python3 manage.py collectstatic --no-input', shell=True) + subprocess.call('python3 manage.py collectstatic --no-input -c &> /dev/null && echo "Collect static file done"', shell=True) def prepare(): From 89a98be6cedb60f649b8e7d289d2d7b48cab1652 Mon Sep 17 00:00:00 2001 From: BaiJiangJie Date: Mon, 29 Jul 2019 18:24:43 +0800 Subject: [PATCH 4/8] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E7=BF=BB?= =?UTF-8?q?=E8=AF=91(Cloud)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 78070 -> 78311 bytes apps/locale/zh/LC_MESSAGES/django.po | 318 +++++++++++++++------------ 2 files changed, 178 insertions(+), 140 deletions(-) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 404301ded737ac9f28e966bfaa6e6f7ada65c605..47239902980980e61e50183934a00b8144ea263b 100644 GIT binary patch delta 23194 zcmZwP2Xs|MyT?D??svrl#YOa zQbiGwCPk_sh)6Hq|8wTW#k%+IwZ`AP(`WWR`y9~kyMH0+)!&o)zokn$&Etws>Umjl zY^>)^N#=P^E34G=YBcq{ahQPp@dVCE;(7I(dERK^znXjAARN%b^Nt1453^8z^j%`g zZ?^Khbhz_<&kMz4m;ujXa?kUY0Mnu_Uh9j3s2m>Q3u`klp8c-_2@8YlPzH%>-O!Ter!D~Lm#L}84;a+ncop$2M= z!PpgJuqWzBr=b=!4|Q_eP)B|YL+}b_!P}^#4{Prh7>m9d6eg1sOQDXqDQdt0sE#u* zDQ>_NxEa&nF4PJ9gvszKro=zZhnSW)xP#kJ2IMY#c~Bc2*@5$qBQu?X{J0&v;8pB_ zjX&f;!-LoWvv+iMN0slx(wMoETfkeGoVYRSq*`J=d>`}T7}P=&Q5)UdiSy@y_D)k! z6-$2P9*+K~m9M}M+-mMY-P^;M3QwXQ!YinIo4m8zSv2az@}VXyjA~y3Q)5Nct*Ymf z(SYqx4Z34Ez9=6@oSXP_)Y0z1)VLoD&AH&7=~7qzeksEOaR z^4`b^``!RD+QB%~=kqg+z^}0=?nBi-Kn)z!%}pGFY8Q!`I2Wp2LDZ3#M4e$p%yX~^|@VwI*DDVfsb4HCDc)RecgcR zFe70O)H75XGhijuy>5(A*d28eqfq1dpOFdNL(~ovQTK2k>I8m7O>_md;)ke#llF6Q zG-{wY)H77ltcMz}1FGLZD<5etM8@^KZDcgy5!A$&P)B+jbrKIyClk`&-TMgC4sxJ& zS{OA!X)CXSTJT$_g|)W0JL(}GhT8Bb3}Jq6x)sbr4YUe1@g~#&`%w$~6{GQYi=U$w z5IVpO7>T;aF{lOPM{T4W>Y=TIx|I!38~Oml_4)5iCU8Wkh9glE&p@qs8LGo7+=hv$ zfx8ZL6ZbWTqZTk3HPI|o|Fx)vZa{5h2gcxj^!3X9gG@~f{g{^#Hbf0n?GraZUDN^^ zppL#7YJ&C{SUA2xJQB0uQB=E|m=zymWz5KK6*t3**vIGmHPI#tw4+_97tDUt!}kN` z$4jVZB=sOSaBkFsilc5-S=7#IqQ+^28n=bn4)YOrL7ngn)Wf-a5CgX*vz3BE7(3X# z`Rbx>!N;hN%~;gJ7NK^$0yV)`s0nwV7PJr5@37UMLG`au zWw`j5leuEM3* z85@jtKX7)V#@mNFnV&{;|25$`3XrL zJ2dhI)AZ#7y`vYC)OCyH{{5Y6rDY z6E#Ndq$6s9lTkZgf~oN!>RC92TF4FaZ`3%CkQ4H~WE0#y3&U(wWI-*UtXUuRUC_K9wu*HI@}7ekrfdxwk$Y>PUQ4^cZGfoeFx z>Sv>lb^+>zvKe*jwqaS^hgyI)$@R~MX$a#`x2iOz#mcC88e&p?{=1SP$nucMtpCIXkE z8g9Z8xEJ+td4#%WK~vmOhoep?7WFU{K(&jKS?)bz)u2L8y&R!oaPZ%K4|I zU^4~!oF6oAVGMEFX>I|*s(n{;2x`EosC&BD+=)7oGv+1KLT;iq{LBpYr@Nhm zqE?&@^-z^Uoj^s@y-vUk*amgP{jma$!@PJHbK^a1hS8t7_PwwW@fcLUO;{WcqBi6| zC!?po@C-L$akCuisH>vxeSOr9TB3H`4z7S0;K%&)ew|F1w)*eOmKaDKJ z_im8Uk!JtgEu<)>CoYNgu_kI~b1(<)Mm;MRQ4iB~^FHcmgJ-%0greF-VkV46ZJ-3| zR+PhNeg11(gAY(E8-yBYB5Hu?s0GeJ4Y1bYjaI)O^^hJ#ozywh3EV)9cMmmTvRSTO z6zW#w!Su}Ul_8T0>tGh_hM933>P@x`b?^6~COCtd@EYdB2dIU{%y#!aFRFfsISI9) z`KX00MV;`M=ocfimy9|*K;6sabKFCd4fRT{i7Ic8y5~OX*%*o1;dIQ1OEDYnKrQGD zYU1B5zK(j<{z9F|y*Zq}R+N0MYnTT0LWx2R5RJOWv8ZLjY5jpemwKJI#lAu$aY-Q9FJQbz)sn3-vJuN1zt6 z4ApKkYNz{AxAYWhL;qNLkU!sj{?nlbj6*G;Bx7PXXVks<1od$lidAtoX2A=nd;AP_Vi^{?h33Gl z#D!6xj+&^2)Hhq99^S5~c}7_IbY!8vw}gz2dNXQ(-Kdovu=s@4pF=%N*H8<%h1$_W z)GbK5$i-o(4P-=}SW(nTRzkI_jhe4PAoe*@t7wgC_#tYgy-*7pj=Ck|ES`nh;Udh3 z>rp3n8rAMR>Y==41})Z$hL0TT1dE_H_y&eDzt@nAR@xHv@N_|~bTH~(jzk^dY}7qn zkJ|ZBRQoen6K`2uc8Oa+Exb#4OVs%Fm%52tqc++VeeGlb84WlZbu`maM?BBs6&9~Y z4YUn4z+u!*ensv4GU^uHMJ@Od>LenTxp8x%PPQPbeYs`ae+`&GfhKH*>d*$YvpyJu zqcACcfq8MQm7g#lqFzv$m%Dpk6!lOhpeAf*_BKaY{q*IWe@Pl7QlJU1V@`a6dPQbm z;qGw>j3sW4TEHjR0heNBO!I~Nv@}5Vn}K{#yw%tj>#cOJ^6xPh@m1V{Vg4%DVIMZ9 z;57EcGOOJmwN|6<`AO8r@BtRZ$Tge>R>e5Hje5aEt#uDuQH&?9h54|*xd^p^Ls%O9 zf5?<2Q|L=q&<;}&&qW>iQcQ^}aWH<3_pr=5_i)CqcPCgG^HAOwE8$%8JQgO-ndp9a zyouWAP@JUC|9LX4Dd@hz?fe&PMO^DEUbDCwt7Gb~-M3pKEJ6GwmcdIHiP<)~dtVIo zF{_DD_&)04?q?1+Ct+&l_vVn%PFGW`szavoFTYnxns zZ44!Di0a=G^=y5J8fPHtM2BJ;eg4Oj(Y>9A8E`A=h4CY5;G3uco}eZU-|Rjm(U_gM zFlNNss2#V#a2$XdZxm|0c~-s!HSYK5Yrqp^3g9Kw$|86)BQP4Zg94}pl(O;~s0BB{ z80?99>Zf65`~uVA9@N54pvJq68t-4!cwt*Pe^q4L>M9DOj<~E@3Cj~FppJ9|cEpLO z37?{FUD|D~e-vuxIZ-<=irQ&))VPf>8e56=!WYs za+hnk7d6lU^8{)Em#{3}zPQcwPUs410Z+}~eSFCTaZj;0<$1qz3u=bRh(}=#oPaukwWwRY z83QMbk<9O%A~O_kp^mis_wHjg7}aqhYT{L>6G=opY&%i+`XH*`S**i?ZlcD0^#Jbz z+=4BVu$Y6q1&KdC%%2VL0s4FC(EkX3wx>Zw&TAtTm49+8eT94I81}13geDH_lvyI+4w&ekYHy&H`jEQcwuPe|Fz)uVNf=N7OBtj2d_~ z4#I<24Qn5FCo~z^j5ix~LLdI(?1MVFVaUVgjj{5%R=)BV&Pg5CTg5l#A@ihp1vSuJ z^D*ky1f6jG!^}*m&wCz=Uq|(;g<3#;)V*(O^}T${3_%^$1dErL>&Q2#^USd zBP$R6)h#FrHE}MpfLY8egW7;!fs9Td!F(IF($;2g{D62As>2=3jZZKi#+>Bu0x<#K z!v$CYlbmu^HiwwIv8?J(2Nvji<;iH^Dz3n*gL#P?nggwTG3w2=66@drd=)dDapes# zlDIo+LnF*7=6rKCs@;}=-2WqF!YR0jIBqbA&CevfMR18V0dt=zw21%Fz> zV~nFg(C_Zw-Q+`c_zbmx#TIWwEp!j+Xn!{UK(+HOxrIie`WHc!m$$f{)AyQ_(Mmg5 zMOX7r0FiYw27>3IIULS(eU3aFJQpziUz zYJdY!1C2Llnai#ID~rE3k6Zagi|<*S5mf$Qq~#TUmpisD%tR=b(;$ zv&H*S3%`sh@HVRcft9DY=Hj%d4aB0_$D@8fl)1*|UlmoY;ag@avl}L-elV)tNOPLG z&|HgJ_%`zgE5C@^*lmkLuG0%BvN14-6 z{TG>E;OE5aEUxv3>tEk|*C(S6olq0?uz0977;S!rx)qDfov5$TGdL5YZn%Nhp~l-` z?zQqmsPRu)d>!@e>E9=#hpyO7H^3XHqil#p@dJxzSiBN7!5Q;+^AFT-z&jX=!GF4O z@?a|BGN^vlP``p}W2pW_-@+fg%j zJmo^6$iUazC@YzQTEcvbmsz|4we+p184g?d3Dk(cS$xCdzftY}HA8Q^aU;!WGxj!* zw;sQIR!|8wU=6bo<|Td~bK__$Uu$l|2+H?cd=j;RD;EEW*@z#b=E?Mzt1pHHh|B!N zQ;-t7T7vV|M zn9Y2vXoVWEqg4z*Eoca8fN_`vmzpauo_Ljc8e0&j{M-HTZ;zFU*I+xmgXyrzUAKUa zsMzmLMmrsjTEJwhSZMKAR=?N$3H57&O4MgY&G(Kg z_r3O3(8U#a11%nEPPFnl=3>+@gOwJa$8h4SsDba9N$$Hi0=2NLs2%4*-KtWUi|5a4 zLPi}2q8g4uHJpfJa1p+ZMIN}HG$T;AX0$mC(-O}|^u*^N4xL#Sut43@$_tUmUM>sRmz=bwj)@>cLZ zYG*xACo&r&aRusRwwrsb{-DLbn&(gpy<$ExQ$2MH%3&5kjaR`ZqYl+k_pT}GUUe}? znhVS=sD&Lv^*e9zUDSZyGxx?!fjWsIW?8ceMp0e|b%K5yG8(Ww>V?q@^{U-uzR7Z{1+{!zcT~XuoLEW;^F7~}yWNK2d2G#MAnfzZDM`9f1 zF&4jp8mJ*^K_6J$$LdF$pJ4^+7o!$<$;xk-4>9obHklU`m^cE}Fe_%kTvlGetZg<$ zwQFbbM;7-t2b&|!38)26M}1$fKyCD}^vRsE23Ju#dW>2?${^P<4%MM7>gcOm{4VO@ z?1bt!$m%DeZp8}Jo9-J_{|l)8w=7PPB*^pCF+CYI$c>t~m{|w4(+*}=RJ%UrFe{&A z@eI^Xmsq^X+>2V!PgZ};%AX_&@&n)RA;Cd`uh*ie71zUR*bTM7jaL61Y5`YJAKSaA zhc$Cjx6s#7PklABp4rrFjq3jqYN7p;`mW_)xWez5Xit^6Wp zr~J0Xsgt?!vY;l&iA}I1>b)`^bK*wS_@{g_n&6Uo2X*AntwFNnE{;ImyC{o`pe87V zT0nxu?NQ?mK%Lx3)Oa&2o@en|R6GA`EBMw54wxs*OQ?zNm`PK(IHOs>d<}Ig-b5|5 zmpLA_z-6cf?K6LI`rZ{X>Tn;m(uk0tz+d)8p;kE4T!yOOfI7OZr~&t)-tEUx?Nf!i z1!hKlR}?~x-x&1}c14Xd0#oVxe_SBLMAl%LxgFK;n0d;)U|vI=%x%lWWPLsPkaSy2nfj~chEl~*+Dn9Wl0 z`PW1rP@sF%(<;WHCYovGtFbEaKC2H4cN1hn_0MNYP>}je}Tz}H(L32bl z9o-q!4sN0bOcvo57=aovtCMfsd0n%S*&KBOerqy;j|C>BV1!kS zLG5^kxe~RY9p(wt0Dqa!Q0-Huab`m;w5Y|UQSED@#%b(g-|K1(KE}pWOtko#`2_jH zjh8yD8`w+d28u-OG{)irW@)pk`Igzz>}d84$mef386DMR)X^_Mt$bae0p9_bm3Xhk z7tPz|Q!_Nu^@~F7G@Drf^`%zY>YJjz3*N(=`uvYl23Mhu<_Gf{YT}^uZourQBQA(q z@aq=W!N7p1FR@XW181UMy<4pQBx;@{8C?53=$ECSE}1eo5_Jo9p>~itDu`b#{QN?d zZ$~XKLq=yjs{Res#J{0l#ka9A#$|FlZ-{!vdSeuh#e%pf6QBPcWPYGPKRl{rcDLYN z)K0sgCLCh%EURCG8fXXBz~iXj3)!QC0>3BPVBlkjx|P#W8=8Y%@C)3F(OLNX>xj>1 z2@3pW&ND1T9M8YE)UV-pusY7gl6V;#VU}z`-fP$mbpmU#Ay&^G6!;(T&cdd|&#@Uc z$r0q$#zbs_UQAHnuSlEvmYIgy@sF4uFQNWW`N#~5bvwz1+DUG+nEATZ*FwEu>Z9HZ zO{}~*>OIri;?Ah~{9a`GlNpI&7@X5h6oERzC^H7tp@7xDX603_ye{ftYlZq04KgR9 z7Cax-f3?LsUA^xeCZk($)*3uU4HTZsbu5H>c*>%lk$P6%(d=suM?Kw>E&j^fZT?`M zF|T7fegEGlqlYXsx0^60DlURraShbN_KwweH+|Gj$67qwT!A{dug#rUk@x`WVGPR? zs82y@RJ(Fk zUIW#xettgxs%UBr+F3;pv%fjm9BEEK?PNM?K})e8ZbrS*OB8SuC!!Xz5jD>))Wk=y zC?5C86cpb4kPz&vdTF57;h4^F0@LKmKV+9IU6mf5|>!^WWFX|Rl8MTu+sDYND2HJv}@H?D= zCs6IW7IS~v?T?D*q9$B!u0{I$-q&RGr`T^%1D!zD<83AB>c}eUVWuSR-?OJ9&O_Qn z%-^JWqfpm-bV{m@T=OV9Kz=xBBIyC`b5XvJe05As{Q&Zs-&;y%DGhX;!B|o>X`3tZ zIs_W>_wM+b<=ayCA^8s&=p1b~5Z@r~OnxT$A4qkm`-n2V&h;IkYp5geZx-_Kb1U$l zx2fzE8(8@*406=sUJUZTuLUo)Elk^rq;4d>-n|czkH6QBbea6GIFSL`k=ONyBk<3) z{L`OJgB@fZ(V#VXzHhwO$ggAKE#zNZtBLtI2d=-UFHL?Hj>gmYFY4v=EA1jl$BADd z)(;iEJzLPGA?YG@8>kyb`X>qJUxET%gD99zz6(iTt($4At0bu)`FZ#=t|ZMSpObc# z$X6!ClfI#UX37uPcv&dZm6iA&b-MnhY$s^~`I?mJ|6b$2YcRPpq+b7(@CKuiK8|hZ zRE~kZvOyn`KSaJcsU`V#BwbZ#-vX~to=iWdx&E-a7Sx?3|B$kj!AE{>N43t{nX*5>s|7NY1@f3iu}L0@}+upt4jY^GJRhfQ%x?C#!~06QN$HVqn6m6 z6vRZE|5t}UiJ#Nq9W0OEkY>>?8F63wj7R-o(G^GCYEl8}dsD8jb6xqFV;g0^P{tn@ zyu*4~-k@O}DpTP!3LleiO@r@A8R#&Uco22L6SIjNZtQ;@$Ya0|Mi%D8Nav=Fh(PS z+4SKDmB-hC_rw;$9}~P!DF21Hft4loS;Zuq=p4RDgQpDe4*3(-=mzl);tUq2G1sHM z1yA7<`t_mB3Vd_p>Ps3x(pA>#T*Swm z{_h0y`CmlIJ!{0z^}uxqH@#?y4M}fMHjs7;7-%_hCu~OiCHWxy0{Qm!s@Yhra0&5U z+U2kf9-vJU;=in^P15x~X%UULTCB4DmTyJ5eiz)-Ao#6~F^2L2 z#DgtPAZ|@O52I}ngn|DWLHcQJz^gRaPr+0=4kfQ^ANgi4O|G(G)bS0?-wC@9PYMP- zLV0e|cIs+VcbjyX`n{x6T{gY@D$X>DU&f$wdl@iKyGG|EGsAG}@-($AzXUK&X4j}q4-y+)c(JlqDpM*erp zUnZ|>ApMKDY~Y_&EMJlG7uP8M{1N!K*e?neGstLCAsSt`0rR}5#7~(x0fTLj^5iR! z3eff~>Rw!LQlFRLeaeeic@6S6ZOj+#()w0#kq*mkP*u*b7ON>cM822}@+SG6r0EyTSNXJ=>(|{aTn4P`d`3yq;aIl)P>_4^f^gBaQ`cjnMHa)>Otj4l2nNN ze-{G{upk0c@?agI&DRXn?Y~AY^E2g9q(_8JNlECd>tjdYpBG#i|9Lx^jigUVJ6)ld zna=A;x^|J?wNrXMP{J#ix-V(_CFK#MO5|@-x6s`^7X~W-Fc(ZM?dbpAD-)VD@@&}|W z#9xzibs=6y`kZ#(Vxm6(jRA}`toSwQ?Z`FJbOub9E6)8`K5 zPq8j#b10ia(p6X5c#5ykE)4xOG`>P+yh^!h6W_wLG$=$q7MBuVvVq3nb<0{H3Fq3~veiwtBBwxk`drsNMv|B`6i+ow@ zztifwn;IsS{=rp+vORbe7r!)L;Q3!jMOG%5LwZPMW=uiDdgRlwn}nA-oTKe=>UHI! zjjl0xj5eQ>))Sw_b+mb#bdR_#enp#5^4X~CN$N=aJL#J4zpizpMAEA?&c>uMBwbAN#Yt%dC3zDwG_`1!ZxH|Dyw8=!iCwYGcmBFO)*61nj zqGB(pBMoPgMpAa34nxVOB)^?hlKfQ4f@n95I3Mo8>m*&rh#!)EA|6IsPy2hsld(6> zB%KfZ&r4`LC(wnD2ZfJl{4G|aVFLNe)Kw#WMpi$Ts1k0AX>Ue_&5wDuW@zYmo1 zGt24~4xxR0;=QyhYvawwYA>}(u3N14?`hIOQV$z6n*3Ap;V(6Q&j$IF@)OqXHuYH; zWEt^9@_EVshL?$7w>GQrBg!(7bUm|i{;+z#y=7E6$STv*IFj;o#CNSs^)Idhlzm8Q zNxLW}?L^zVqzLi@DAWH{s;=X-X-_&!{s{H`F_gN}IEcih{k!WKq_9=iAb*pzhE88H zfUe%;KO;Y%HbsdW1WMgM{()4~3@ebBruoFpGeS^2D(;} zKN6^Pad|8Mm$K4Uewcx8+u+&RQ5)J^qOQ1=O>dydgU{X?L#dNqp3MDZ1i>ty*`HIxnC;d%j z4$AYAFU7b=b^q&A(A#=Nk*`TbdKQzF{27w2-IS#!)gjHN>@a0N;RnR8Vo?VCgtDo` zx|Wb8kUx(1ZHza_$I$M@)ihAf{m)3rd!+MJHnjoXCtrqqe$q9bUnw6)=qIL z(h7@zx5<8{YzplPu#tn*={7IH->9ERelF>m`sn$)K~S8EJrtC~w!~ji{yp(XOhZ`` z%0fw%$-lV9Sf)8;-AFx&o6<&CB~oD~ZxV>yKUP3v+Wm&{coO{|$-KBGF<~;TiYqha z!x=0u@p;FQc}vt(I%_a?brK%34^Sr zU^$M!ax~gUYD_$ube8;4(u-?2nUog)#b8mEPewkR9k0MA);QA4&p6j;_ZD?SDErsS z1HTYex%GcFF+Ek9d&}U|DaytaEAwjcR}xo!A5=1e&R5qgxH@sf)v3#` zjNF*G^jXc2Pzo=vnR{u+n2pzy1sxAgGv@N>-9R`=l473I_tXbJK^8wxqdn5(eFXN3*kYZdR#?|U7NqdJ6zx2367ixAo;MnccJ#dC0iL%SbJ9M# z6EXSEyLetWzWtWxrNMES1*c$2&+~apsf3b9#B{hBv*I3%!LwKpgSvViYx4@54KWXK ze`M|66fB7|uoCXU5*W~pd$1HnVh1dSBe5&IYCshkGV;4+?378(=N8L9CLvXJ76>6L$Oo{t374v(CEpZBU66Y}k-o|YBFKVDn zJv}cF^I~2sh&s~Rs0B4eom@ZEk&naFI2&`~7pSA(hFaiJ^r^#nD*5pm>WI_yasw7c z-B=HUup6er-WZ01P$w`JgK-X~#RcXH%t)Ms+R$F)X?iD78!g|P^N*%dr?-1X{c#}i z92|nF`gmSEj>Hyt*v#M8em&u(cb+ye_m*B zGKpGv74>oy>F-wF7E=@VHHV^(ZWM;#MAS<-8})2AVJQBDIK%9uBhc5FN(L&u%y%(8@dQkXb1c6Qqlnj_7Ip%)px;nOeH-;|+(q5@7K4A=upU;?UrIcnf_sEIeD`t3$dd>qy9Eb7RwqE7O* z`4n~JsRp@mBK`9Gqo^#QAr>{@5!4A>L_O0xs1>Ie>?TTuI?4>F0Slofu43)=Pz!B_ zI;qx}5xZgz9EM>y6|?K}zle&Ca0_an9p--XsCm}Bih3#Uq6T_`6)+7S8BJUhbs`N= z8;VEue+$*WFY4L9hdzDo=TOngwxSkr0*m1VERLZ=-3e4i9c>NN(bhvf+g7LvyP_UV zUyBn^>jC!UYpcXJ4)qkP+ z73$qtWAP5u7tLPO08nb);XQPGULgt=^1!_TQm) za0Io}^QeVgxBLUtf&)glg=Ip;`B5L^GN=t#z|_p|)v-iV)Ic3j6Zb;xY&dFR6EFg2 zTD%6efGwy2ccY&1&!`E{pf++FweSb1M;SQMZ73Ut>hm8-MH9!OI+jOGTo1M4)~FNc zfZMSvYT&%@xrt-UvZw{rKuy#Tb$=(+Lc5_hG63`9aP;XbcOI1nxCQTF&?q<1L(~Az zQ40us-yMBg)CAelzi_NeTpn}cXw)P69CKkJ*1-K1r)AgGhzt2Rf33I|3GHYQ>I-H# z>gDrcVVs3}M|PqHK7m@$CDfz3iQ3sesBwZvyA6bzSuuuu9@GifL%p1BMsq`VDt$@B z;!!My&ry#cZjAfbR6;GR1!~7_Q48;mns5MWK?$h)Mp^sEsQW%e^_!3Cw-mLJL?0Es zJe$qEsDY26I-W({cnLM}Ez3W`ti;by{WFhs?YYguScZIA%!hqY^L&h&crNNC^)08O zBiVwQC>ho9DCWQmsAv5I^)7^rbI&v*YC*+NFIPp>LTaHVXpFkAJ?e{TAnM3JLY>e& zWIUg@l1gzBYfvk?fExH7>gD+lHF1vdZlXw39D|xL4z=KNsH3ilT2OtA#uk_YN0_59 zKk;b4JpZLs8j{$DI;!vw_%_5cSRW^&c5)K+NN%DQdJnbJ6d$@Bg`sws$1H_fSZy;N zw-9$iz6!h?AMtk!=J#e%(N5N5FmA&j{K4XVs1rJfsqjBk|DXwO;!xC%bDsITaoGa@4a)LgjZ^{t%`nK7&Q^5=LYCiLPH+)Pk#_K903< zHMYV57&yuOf-@L3PXg*>#!lk-Yr?4{wDX0S7MEd4{04Qzn^1529!!g8QQrsGPz(Fd z;^4{dWzLD}UlcWd4b*teQ772O@|`Dh{#waE5_-n(p}xVUp^k7h>Sg&3HP9tg|NEE@ zpQ9F(_G7ohEEq+c1GS;5sP@{Z{>@M)*TM4Rd{okq_yo0+&n#YS9afs`CE$Bxqj7L#B z_!l)%s!!Zba-tSk1GV!vFg=b$y$h32M?c?Of*NNfazZ|DBNcrCZNuDn0JVUdW{Roq zXF*QXGcSR9+3KJsZirgYo2c)L!5E2CF%PaW4`T-6I~an`F%9#3>87~>v!IS70=4sU zsE$>wy%FkYo1?x^dZQj)KdgWWs0FM=-G2zf@D%D%T}PepU#NM4rc?C!&r3xeqEIhQ z3Dl95!;DxNHBeKGz|PnJN1_(85A{|jqsBRkddbeAHV`<&om3d6CoX{c=~@bXI+D6n z)Uh>|#%`zqKSMpMMW`cQjoR7wsFx@i)$b67<4M#4ZlL--F#ki1A3W22oWoHY%{!Cx z*G{8J=*BqIjpb1*t&YX98HVC$%!HqqOHhww6KcnYQSZ(})QP2^<;;WHXbDvRYM2q* z=obrpzWb1nQ!p>CMJ?bc7Q^3AH)QzKnGZE!Y1FfY9W(RJO12Uf|-a{ z_^4>b+fgsmNz@5kL_O;pm<0o8yCcqlRf%J<5cb1@I1Ah17F7StbKEa9MKGMWHI~9Y zs0}SZeTsYssc6EZ=C7!uzKnYI_fb1~hT3uPXRd!1%t{=Idh5%gHV|*^9W3sSdb9&k z_m4m=WD;_sK5qvVt>g%1#uFHiH&HvQG}nEOyP)2cF{qbmg83=xXqTWCumaU@J!Z!( zs0|!LJ&IpZCwtr9&ht+>&#f#EYM|n%0m`Cotb}^@wJhHX^=@=Tolrm2#P6bZI2JY0 z3{=0Rs7J6KwZXku0Dr}t`usnqk^>{=yKk;CsAt#$H9>FGK*KNw$DbGD4&tG38OG#*e<)~-7#yW08y*ztSC-F1tD9@oD z$z9Zd0Sj3Sro+Nm6_xLedYOkdDs6(2+G^epPAZlf0X59Y;y zFWdt1qxzLW?XVW=QNDrN$Uw`#hx)uvL5;TioK|v95T!OiGrv& z4mHqgr~&GscG3d1^UfHI15nR=C~6^-P)EK1^$vW6>c0s!-X7HWCsF+`e#QA~XMd5% zi$TlX5l3Mm;v%Sgyg3B*#WV}`>{p>)$~~wFe>d-&0V`a4Ml4HvG1PqBFh3@&;QaN~ zIG02WuEBhG8Vli5?2Y+Wx_`l#jJ1dlqwdR;$Y&X2@Ll`~BeCWx_Z|NhZYBN@)xY{` ze)q>#I24n7REkoG`Px16mY9=xFqXhikTJdQFdF-;abGagQ7_vnEQb3~8+d3&e&aS! z7hfYk5G&wvi+{&d#J(JB-I3?Rv?QW&43@-)n1p&cSFUqMxC5hzA7FLNvEJDp2sWp?UVRO8x>aA~r+DUuV zK%1?7Kc*o*g1Y|i^f`uMn$7OfMqn1=au}h{e3W1k}V6FdRQc zy;LhO8}3K#_#%elBh-LFTiiPlfy$Rfjaw5nUOX1TPN;=VLjUjopHk5dzCcOa;eSn&H5o%%UF*WW(J&Ge3iPuqI(J8-kCl!L~mmjsz zqNsM?>sG0bdTZ;Vj+>W&&~jm+hQY+QFc02Coj}-r z_pBq(f5fPhdmYDNQ`Ctb$Gmt6(=fjm_@kRR6m_(jQ7>ga)U%F7-B<-1v!KSP`{pO} zlMHkI#G?618;!$>FC66YV4FjHJJSCw2GG9vh^H?_Z|PCD(Dug|M-%m<5{~a+5Kcn> zv&GcJ^HB>~hPiPQ=D-uEkKr9N=(szP2-JNQu?W`0SR8;Qa6U%k!Q<>hZ}kHb8aVw4 zc7d^28^1;!?E_>J-ZRt*9XRRy1yd4V#c=$?@-HkOa?16~Wac&F%!;QtM-5n)ga&G9 zwnt6;mUZlB4o7|7KeYG@)P1W_3rIpe`+e4a%DjwO$ltR#-V_fZRajv6@q1)B)9 z!-}YHzUrt2*S7Yi*51M5uISUiZ(GAC)I!EvhdG#!c$vlfFp~HJqfi_TC~ zdxV+KjIs9OW~GaK{&i!0>(C0d@{TwZyI99l=4I3Z@1ef90)KN~H0ew;S7P}GFeEWg0wwdM}gLVvROsCmKV zeco;B@Rv0_MNORYiW@j9YJdW$d=b=wDq4Fp)XqDi`t>viSbi94fj-NBj9H0i`eUAd zqIFnj9d_dDbl7Wgz*V>7)Tp;Vr^OXf12?v~o!Q^=qb;6-THqqo!V^&^_r2Pg-#bS| z1KlkEbeM?f;kTLGEXyCq8{BYYd?uTt>h9F`5bk`5!YQ@ z1hw)ym4%*Ut!gKj$0 z;auWyi&vvgBFX&T@`q6KoUr(cwcqwxdddjmpQN zCa7p}1JqB?)~J_mhUHhFPI4paS25p@mUwE3kU!i6mCagaL)7np@t6<0p$7U8LvSwY zWWK^M{2J5XPRsv@A;d>4K8FRE-@9xLss3~~WX7g+jKmlmfJJZ)YJgql5!8g|%*&_= zZ&~}_mJhh&?n{m8p9Qs%T$n~5^kUXf9yLK#iyK+o0yS`FvyZh8ojE2plTWYTM9VBe zjj+<(goTKAV?n%a`LMgLUvAVxD`Ig))Dr7j+yrwIw@1x0+}dZLj%4m#`}w(tL|PI@ zt;0FgLN24;s(Yxfu8?~!UlcPCmq$%l5A{%+q8{oX)cxa86HiASK_aUE26NjzK0j*M zMM47}w1#u21zkoBa0gRhs{78gSd2K-tb`qj`(kZO#u}L6FMdzLc+|qSpcZh@;^RIl zTIn^^0v=dH-~$(DMYTtprBNT)YS{bmq?+DUZ`)dElhw=%n$Z=?E+!f+gqdQ@}J|M}TMMK_*Db-ab@ zcpoQY&?5%LX&8vtQIF=f`3N%-2RwH7XF`n^VHQG-R|a!nUCVdz=Xw4EEHMW4tUp05 zWVyv_tbM=bPoUnJv#3XQ)qIFqh=ZRvbD}0Li5j<-+0pU|7^0t_6IH?4sEL=7I!dvqyP8k1WSy=Fgi{%7h8TkYJl%h zpW9=oNAV2RKj0r{IO=2ypiU+Z^=?$ga@f$?$D;20_#Zz1QB)RKVmE4MCr~?hhM6$! zzwTrr%_vlRti=_~YN&%@qH+d`{HF zWl;B3x40#0z%Hn7%wDLIm}bs1mtj`&YfvY+*GEMICZoPEPNBYPb3AkTDyWGXqIU2m zYJmgHkI=sp)Hus6-e7J+-Mk@h7E{)PpRm}TF;%$%{MWcd|!)apa%K^wUG4| z@3Quj<|V93`(4z+iobBb_1E4@6D;p7|N-2sW780(@?uT_m)kBi3-v;>)O= z+_N|^h3glFT2O9OduhwpLA{nOFcL?i7CaC2<7zuKo(?=EoGlZk#C8f{L4!Q1{oj_GT8hLmr*a>tcx!s0qfP7BI`=B-DWW zP)BzhHQ;6QmbKrv__@WwDcybHW**e|v1V1jK7M7eM0fLD)FYUTdb!q`$*6^0LM(F{WR!_nqUU% zX$x^GmDuEeQGE`MH3Z4y$hACLtV28YJxY+x6Fa&d*(#c zIJ3=_mfwzL$R}fAe2)6fA|@@Le^pASb%`owebkAxL@lTr>eDg6;#uZGa|LQ6>oGTO zK`r>SdBwbsTHtewGp6J7uS8@zXGzqJwNMLajvBa&<$IaK%(3QF)T8;_;*F?rcUk@< z)*`-R?WIH9_|<$=G+{GKbVN-%2T#g!WgT*^h10JyW7zPtxwER`nBmBeKAEQn#D81W2X4H6bsExjc8n2eq z=QX6FpV0Bv&tyX?P~ZI%P~ZLQ%oC`Sd2EJdauXLuom?H%3AaEkxJM>F|4Ixa;U5t7Q)?aO z!CmP8%C+`@%x=OWsQ!(y0w!R2T#I@HH&GK-&l2Fx#wMuzRn!72XLYv9%I9Al29nUk zDYLn+;A|L2+yu4r_fRj{Le#I78?Y!Iz#;e;^@~Q|?CueKgxc5~)P#u^@3!_+sBy0O zsMMqK4D|~_ogD5Lh>y|#F+@F*ov0n{#esMX_hO9*cf_f42KfJ(CJJN8w?h4zI}YpM zJ}ir&{126HU`?!yzPVI%0;jPh4#*wg|3AImjctjeBLn>ZmBnamM0^(8U`(C>|37|? zF?XPL{1h`|NZtVd-xl+krBNHHjoL^fr_XC^i5}Kr2w|pdRs=f_(n{zon9RpTs>Zj{~EeD^LUeZr(u+_%Bw(bkS}h zbx;GhMYVS|hoFvroW*ld{Z?9>6zy|2>?WZvlH;feLkl@0P~QWEPy@e#`abAx?H^fw z7HXnp7H>6wLQVK9>cp;~enEMRnkS1d#x>+e9c5Y64V6%De;riE29|G)>et2cz06^j zA8SrDrDH43|lccB)t54C`wQ4^oX5_kopFiR2lP53&t zBkqaQaTo5#mPG^n|6rFZ)_u{9z)IwIBO7GOIQOv#Lai(>>c~r2{!P?MN1zrm1+|cQ z$hWq)7^@O*F6O?#o}f;yadEex=BSOVMvb!xHBK`6|Fh0hR6Zkd4b{_z=$^%!d5*O2w_cR_w$u!4P*Y{b8jtc`hy-=jVk@6e|ax%<3-{_7Y? zUAJjiieFQ@QvN1ROP?0BA4L7w{2hCe|CHRjln==LLEML;E0|nLeihu7d-q!I zF!v6oU%)GUzPEZ>+LoqZ{ubO+hv4PK&mHfA#RG8z@x@mLIACoXxuGiczpxQ5rO$R7 zWSjM0MqGyb-=g%g`*PdnJ|_2dAp5UoH|^x6F_ao~ENMBhgHoQ(zmoq6M-rc<-wqpa zH*qQAA;e!;j+FQ0m3kcQ2guDPSCP7|V~mySempsVLFJ?=WyQZF4m#O8B}4=Njtp_A^Llt0&R^1NBVw(Z3Q`!AF#jY@%W08d_hGgOX4GS*5be41&>~DlpATsJ7HiYii_)2TGfIE*53m?TR|4kcz9AaJ#!)_t zjh#u)zkmg5_=-;P+;o{bKW)9|xYY(*Nx#L!i-`NumQ2x=pL`6tGn8uNrdrl2^r!qpJtZDeZ>|%R_LOJb5Xp_YD$_oda)#VB z?q5%Nd2J%sn0NxEDdpE!+SF$nr55+<@-3jTJ2#9YQJ(q~Yq&*yIOPCsO({L8@8gDC z);`VjkHQ~4DC_B$hO&<~zD)i9wOt+V3ue*ttYaR#Z#V7f^dl!T9cmKj8td@?d5%9% zk*`SE`O0K{>3@lwPOiW8UrYQWrJ(ieX!)zyhJL*%TWNpwDnZWwpY=VX(t;buSnDb3 zZEc`2uiTW1et%HP(zXic(!VV2$<#OFY|3)l%Hb$-FRyT`*CFvE^*87fz=`ao-z4oq zS1r`v175vaTbpw4b5ljia&mi6S6_#h!TKGuxHJRnszEvKukk6MkAAb-LTO{|YSMq~ z;8i72pFuBDW?JJ)%tTqjjhiSpX{$@$ws3?`FEb`hOkt`+g2`o#^ucr9SZs)b*t~AEQ{Du8ns8zqpEAS1il|rdoa& zeontC-18Rg!&3Oa|J;9g{*=T=F9)Yn2kKL};ZI6E%6~RVC@!Qe4i}Sup_!RP*I&fC zwo=m5-jBjB&)!Vb)rt0ZT-E!TTxuUT-Xn3CvXaEF))+y@BpXbrrZzwzeox`IHSY># zD}5eQ29vvqmF=Dsw5=!i12#lmuhVvi5=L$m@j3GT{ih~5h@yX`c!H4 z=vS-XEWSadNGF`AiqN|7nB2O#81+{P_o^4{=YI^8b03vCfhE zK+nGksaqtv<5i4df($mvA>xcoTF(aj0y`4xx<=c}>rL{@DEjNxehi@PE6PFZu$bH` z>T~ft_y0>s}l9j)K^eC5T~O2YHc-X%SAjMU%j3ZOlH6ww%}Om-&mhQ z)Hl{lEKXPOF>RcbmrflrL#qL+Ac<>`Z(MLy2`Qr~V%5fnBAow~}1j z$v>rRv4Pu>Ye(FHcnI}0^c_vfOI?5S`HcK));GOdw2%MwgLi;(gd1O84T*K}>%7;1 zQk0v%B$wUtu9efHa)Hu?KL1dT+Td%+b*J8f+{ELc-++tkzIcicDpl|H(4IJu88 zKl;Ksj?d_*>lx)I>JPYKt>voIDT#ar8>9>IA?kg|^|o9jxs+Cahzn`EPfphf;*rz~ zGEZviC#i3s6rr9bh*xSlm9upG9J}F%OdLXKOkC6!(VH7q5$jrlkywGY9@KL(@PF8h z+}F66zG=zrC4QIse;7|`Nt>=c_%>dmG|_j!DP`?C!k`g!C_+4kdNCYD{G5SwWoO_Y zs2{ZWBh$6=TP^WAN;%3W++PaM>VE1kuWHn%QQFhy|48j1I7+9x*n@J2qU*jHK-)t) z_f#LsW8KKLgz^sYt5=93sl;U7G`BE$o%e-rEb9&xbUE-^xdid=5%RHW*0TzvMI1Ufk|)i@q29vBeU)?=Non8(-jgIwvFl z!0o@jrv4fA-|%~!M0PY1dS@uPRpDAmX=Gz&B{zq7Ew-dop#MoqesVirKL2k>EFiIl z4(X|H=jKnb964Rjsq6ZMa)dr5EIw+Jyz6iMzdzn2Uxl)ozHHvxN&hayg$PdKHM`&c z`CCI`9f`XCn`C#~6!c1bo`F6gmz%zY$*0Gvl(OV>4W+JYo86;-6Vf$^(v92$Yi~}y zwAI5I^L^ewZw{4bl-73hb=}F;k=)Dc5;t9>y^AGsX#_W>BVce-IXW zWgOkIOP#r@qvrS8QE5rZ$Dpejq&T?<>Th5mabb1h%0w>AChkT2x=nbFd)rd)hGi(a zic%I)U&iFuX?veiom_F^oaC=jzoq$qBJr5UA4nFatf1j0Wi|Cnv^}9dnEJ~r(&{6) zXAUKuHAK*N0QK?YHdEI%27jjiF6#f1&qK*X{W$(b8K$5Ax_+nQepmIbbHixrq3kpz z^`Gget1+cC!N>(YNG{zyqpSwfqxFUb4PKh_3O zvJ8#c@iLyo0+e2KeAoI6#ZPJLYJ<@19j9L1+V@k>NL{~M>guOS?CL@8$jbmn5c~Sk zd6RWkTN>&!EMAE1D2WVm*KT}h29cjfewtkF8Y?# z-vP2x38o<%$9)ga5bN5EA;g(o=>Ib>aR$l->oeTiA{l%kxiH#ZUcZoQPVR4PMSdP- zfwh;QQzw6&=YNdU=x)=%j+lpo3K z`qbh5gIUO}!@udDNc}b4qn}!PNL(f;hkxL=xQ+aubQ)>{C6G($CDmzLrhL-m>DkjH zZJf6!Flq9_m|RJRw!V`-RoT2H%T+8{E~#O1K-r|Xp4UwM?Z%V=hXcQzoi^Z$9N#u6 J7%(^Ve*pM+^x^;j diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index e6ebbd41b..2e9883d6a 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: 2019-07-25 16:16+0800\n" +"POT-Creation-Date: 2019-07-29 18:24+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -76,7 +76,7 @@ msgstr "运行参数" #: applications/templates/applications/remote_app_list.html:22 #: applications/templates/applications/user_remote_app_list.html:18 #: assets/forms/domain.py:15 assets/forms/label.py:13 -#: assets/models/asset.py:319 assets/models/authbook.py:24 +#: assets/models/asset.py:318 assets/models/authbook.py:24 #: assets/serializers/admin_user.py:32 assets/serializers/asset_user.py:81 #: assets/serializers/system_user.py:30 #: assets/templates/assets/admin_user_list.html:46 @@ -101,7 +101,7 @@ msgstr "运行参数" #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:54 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_subtask_list.html:13 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:14 -#: xpack/plugins/cloud/models.py:187 +#: xpack/plugins/cloud/models.py:310 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:63 #: xpack/plugins/orgs/templates/orgs/org_list.html:16 #: xpack/plugins/vault/forms.py:13 xpack/plugins/vault/forms.py:15 @@ -112,7 +112,7 @@ msgstr "资产" #: applications/templates/applications/remote_app_detail.html:61 #: applications/templates/applications/remote_app_list.html:23 #: applications/templates/applications/user_remote_app_list.html:19 -#: assets/models/user.py:150 assets/templates/assets/user_asset_list.html:52 +#: assets/models/user.py:166 assets/templates/assets/user_asset_list.html:52 #: audits/models.py:20 audits/templates/audits/ftp_log_list.html:49 #: audits/templates/audits/ftp_log_list.html:72 #: perms/forms/asset_permission.py:75 perms/models/asset_permission.py:80 @@ -167,7 +167,7 @@ msgstr "系统用户" #: settings/templates/settings/terminal_setting.html:105 terminal/models.py:22 #: terminal/models.py:258 terminal/templates/terminal/terminal_detail.html:43 #: terminal/templates/terminal/terminal_list.html:29 users/models/group.py:14 -#: users/models/user.py:327 users/templates/users/_select_user_modal.html:13 +#: users/models/user.py:330 users/templates/users/_select_user_modal.html:13 #: users/templates/users/user_detail.html:63 #: users/templates/users/user_group_detail.html:55 #: users/templates/users/user_group_list.html:35 @@ -178,10 +178,10 @@ msgstr "系统用户" #: xpack/plugins/change_auth_plan/models.py:61 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:61 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:12 -#: xpack/plugins/cloud/models.py:49 xpack/plugins/cloud/models.py:119 +#: xpack/plugins/cloud/models.py:59 xpack/plugins/cloud/models.py:144 #: xpack/plugins/cloud/templates/cloud/account_detail.html:50 #: xpack/plugins/cloud/templates/cloud/account_list.html:12 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:53 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:56 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:12 #: xpack/plugins/orgs/templates/orgs/org_detail.html:52 #: xpack/plugins/orgs/templates/orgs/org_list.html:12 @@ -206,7 +206,7 @@ msgstr "参数" #: applications/models/remote_app.py:43 #: applications/templates/applications/remote_app_detail.html:77 -#: assets/models/asset.py:198 assets/models/base.py:36 +#: assets/models/asset.py:197 assets/models/base.py:36 #: assets/models/cluster.py:28 assets/models/cmd_filter.py:25 #: assets/models/cmd_filter.py:58 assets/models/group.py:21 #: assets/templates/assets/admin_user_detail.html:68 @@ -218,11 +218,11 @@ msgstr "参数" #: perms/models/asset_permission.py:117 perms/models/base.py:41 #: perms/templates/perms/asset_permission_detail.html:98 #: perms/templates/perms/remote_app_permission_detail.html:90 -#: users/models/user.py:368 users/serializers/v1.py:120 +#: users/models/user.py:371 users/serializers/v1.py:120 #: users/templates/users/user_detail.html:111 #: xpack/plugins/change_auth_plan/models.py:106 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:113 -#: xpack/plugins/cloud/models.py:55 xpack/plugins/cloud/models.py:127 +#: xpack/plugins/cloud/models.py:80 xpack/plugins/cloud/models.py:179 msgid "Created by" msgstr "创建者" @@ -230,7 +230,7 @@ msgstr "创建者" # msgstr "创建者" #: applications/models/remote_app.py:46 #: applications/templates/applications/remote_app_detail.html:73 -#: assets/models/asset.py:199 assets/models/base.py:34 +#: assets/models/asset.py:198 assets/models/base.py:34 #: assets/models/cluster.py:26 assets/models/domain.py:23 #: assets/models/group.py:22 assets/models/label.py:25 #: assets/templates/assets/admin_user_detail.html:64 @@ -245,9 +245,9 @@ msgstr "创建者" #: terminal/templates/terminal/terminal_detail.html:59 users/models/group.py:17 #: users/templates/users/user_group_detail.html:63 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:105 -#: xpack/plugins/cloud/models.py:56 xpack/plugins/cloud/models.py:128 +#: xpack/plugins/cloud/models.py:83 xpack/plugins/cloud/models.py:182 #: xpack/plugins/cloud/templates/cloud/account_detail.html:66 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:77 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:101 #: xpack/plugins/orgs/templates/orgs/org_detail.html:60 msgid "Date created" msgstr "创建日期" @@ -258,7 +258,7 @@ msgstr "创建日期" #: applications/templates/applications/remote_app_detail.html:81 #: applications/templates/applications/remote_app_list.html:24 #: applications/templates/applications/user_remote_app_list.html:20 -#: assets/models/asset.py:200 assets/models/base.py:33 +#: assets/models/asset.py:199 assets/models/base.py:33 #: assets/models/cluster.py:29 assets/models/cmd_filter.py:22 #: assets/models/cmd_filter.py:55 assets/models/domain.py:21 #: assets/models/domain.py:53 assets/models/group.py:23 @@ -279,18 +279,18 @@ msgstr "创建日期" #: perms/templates/perms/remote_app_permission_detail.html:94 #: settings/models.py:34 terminal/models.py:32 #: terminal/templates/terminal/terminal_detail.html:63 users/models/group.py:15 -#: users/models/user.py:360 users/templates/users/user_detail.html:129 +#: users/models/user.py:363 users/templates/users/user_detail.html:129 #: users/templates/users/user_group_detail.html:67 #: users/templates/users/user_group_list.html:37 #: users/templates/users/user_profile.html:138 #: xpack/plugins/change_auth_plan/models.py:102 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:117 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:19 -#: xpack/plugins/cloud/models.py:54 xpack/plugins/cloud/models.py:125 +#: xpack/plugins/cloud/models.py:77 xpack/plugins/cloud/models.py:173 #: xpack/plugins/cloud/templates/cloud/account_detail.html:70 #: xpack/plugins/cloud/templates/cloud/account_list.html:15 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:69 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:16 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:105 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:18 #: xpack/plugins/orgs/templates/orgs/org_detail.html:64 #: xpack/plugins/orgs/templates/orgs/org_list.html:22 msgid "Comment" @@ -338,7 +338,7 @@ msgstr "远程应用" #: users/templates/users/user_pubkey_update.html:80 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_create_update.html:71 #: xpack/plugins/cloud/templates/cloud/account_create_update.html:33 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create.html:35 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create_update.html:53 #: xpack/plugins/interface/templates/interface/interface.html:72 #: xpack/plugins/vault/templates/vault/vault_create.html:45 msgid "Reset" @@ -448,6 +448,8 @@ msgstr "详情" #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:55 #: xpack/plugins/cloud/templates/cloud/account_detail.html:23 #: xpack/plugins/cloud/templates/cloud/account_list.html:39 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:29 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:56 #: xpack/plugins/orgs/templates/orgs/org_detail.html:25 #: xpack/plugins/orgs/templates/orgs/org_list.html:87 msgid "Update" @@ -486,8 +488,8 @@ msgstr "更新" #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:57 #: xpack/plugins/cloud/templates/cloud/account_detail.html:27 #: xpack/plugins/cloud/templates/cloud/account_list.html:41 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:30 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:55 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:33 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:57 #: xpack/plugins/orgs/templates/orgs/org_detail.html:29 #: xpack/plugins/orgs/templates/orgs/org_list.html:89 msgid "Delete" @@ -543,7 +545,8 @@ msgstr "创建远程应用" #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_subtask_list.html:18 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:20 #: xpack/plugins/cloud/templates/cloud/account_list.html:16 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:18 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:72 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:19 #: xpack/plugins/orgs/templates/orgs/org_list.html:23 msgid "Action" msgstr "动作" @@ -611,15 +614,15 @@ msgstr "可连接" msgid "Unknown" msgstr "未知" -#: assets/forms/asset.py:24 assets/models/asset.py:164 +#: assets/forms/asset.py:24 assets/models/asset.py:163 #: assets/models/domain.py:50 #: assets/templates/assets/domain_gateway_list.html:69 #: settings/templates/settings/replay_storage_create.html:59 msgid "Port" msgstr "端口" -#: assets/forms/asset.py:45 assets/models/asset.py:169 -#: assets/models/user.py:107 assets/templates/assets/asset_detail.html:190 +#: assets/forms/asset.py:45 assets/models/asset.py:168 +#: assets/models/user.py:110 assets/templates/assets/asset_detail.html:190 #: assets/templates/assets/asset_detail.html:198 #: assets/templates/assets/system_user_assets.html:83 #: perms/models/asset_permission.py:79 @@ -627,11 +630,11 @@ msgstr "端口" msgid "Nodes" msgstr "节点" -#: assets/forms/asset.py:48 assets/forms/asset.py:83 assets/models/asset.py:173 -#: assets/models/cluster.py:19 assets/models/user.py:65 +#: assets/forms/asset.py:48 assets/forms/asset.py:83 assets/models/asset.py:172 +#: assets/models/cluster.py:19 assets/models/user.py:68 #: assets/templates/assets/asset_detail.html:76 templates/_nav.html:24 -#: xpack/plugins/cloud/models.py:124 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:65 +#: xpack/plugins/cloud/models.py:161 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:68 #: xpack/plugins/orgs/templates/orgs/org_list.html:18 msgid "Admin user" msgstr "管理用户" @@ -644,7 +647,7 @@ msgstr "管理用户" msgid "Label" msgstr "标签" -#: assets/forms/asset.py:54 assets/forms/asset.py:89 assets/models/asset.py:168 +#: assets/forms/asset.py:54 assets/forms/asset.py:89 assets/models/asset.py:167 #: assets/models/domain.py:26 assets/models/domain.py:52 #: assets/templates/assets/asset_detail.html:80 #: assets/templates/assets/user_asset_list.html:53 @@ -663,8 +666,8 @@ msgstr "网域" #: xpack/plugins/change_auth_plan/forms.py:116 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:55 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:15 -#: xpack/plugins/cloud/models.py:123 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:61 +#: xpack/plugins/cloud/models.py:157 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:64 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:64 msgid "Node" msgstr "节点" @@ -723,7 +726,7 @@ msgstr "SSH网关,支持代理SSH,RDP和VNC" #: perms/templates/perms/asset_permission_user.html:55 #: perms/templates/perms/remote_app_permission_user.html:54 #: settings/templates/settings/_ldap_list_users_modal.html:37 users/forms.py:14 -#: users/models/user.py:325 users/templates/users/_select_user_modal.html:14 +#: users/models/user.py:328 users/templates/users/_select_user_modal.html:14 #: users/templates/users/user_detail.html:67 #: users/templates/users/user_list.html:36 #: users/templates/users/user_profile.html:47 @@ -762,7 +765,7 @@ msgstr "密码" #: assets/forms/user.py:29 assets/serializers/asset_user.py:70 #: assets/templates/assets/_asset_user_auth_update_modal.html:27 -#: users/models/user.py:354 +#: users/models/user.py:357 msgid "Private key" msgstr "ssh私钥" @@ -775,7 +778,7 @@ msgid "Password and private key file must be input one" msgstr "密码和私钥, 必须输入一个" #: assets/forms/user.py:97 assets/models/cmd_filter.py:31 -#: assets/models/user.py:115 assets/templates/assets/_system_user.html:66 +#: assets/models/user.py:118 assets/templates/assets/_system_user.html:66 #: assets/templates/assets/system_user_detail.html:165 msgid "Command filter" msgstr "命令过滤器" @@ -802,7 +805,7 @@ msgstr "如果选择手动登录模式,用户名和密码可以不填写" msgid "Use comma split multi command, ex: /bin/whoami,/bin/ifconfig" msgstr "使用逗号分隔多个命令,如: /bin/whoami,/sbin/ifconfig" -#: assets/models/asset.py:159 assets/models/domain.py:49 +#: assets/models/asset.py:158 assets/models/domain.py:49 #: assets/serializers/asset_user.py:28 #: assets/templates/assets/_asset_list_modal.html:46 #: assets/templates/assets/_asset_user_list.html:15 @@ -817,7 +820,7 @@ msgstr "使用逗号分隔多个命令,如: /bin/whoami,/sbin/ifconfig" msgid "IP" msgstr "IP" -#: assets/models/asset.py:160 assets/serializers/asset_user.py:27 +#: assets/models/asset.py:159 assets/serializers/asset_user.py:27 #: assets/templates/assets/_asset_list_modal.html:45 #: assets/templates/assets/_asset_user_auth_update_modal.html:9 #: assets/templates/assets/_asset_user_auth_view_modal.html:15 @@ -832,8 +835,8 @@ msgstr "IP" msgid "Hostname" msgstr "主机名" -#: assets/models/asset.py:163 assets/models/domain.py:51 -#: assets/models/user.py:110 assets/templates/assets/asset_detail.html:72 +#: assets/models/asset.py:162 assets/models/domain.py:51 +#: assets/models/user.py:113 assets/templates/assets/asset_detail.html:72 #: assets/templates/assets/domain_gateway_list.html:70 #: assets/templates/assets/system_user_detail.html:70 #: assets/templates/assets/system_user_list.html:53 @@ -841,90 +844,90 @@ msgstr "主机名" msgid "Protocol" msgstr "协议" -#: assets/models/asset.py:166 assets/serializers/asset.py:63 +#: assets/models/asset.py:165 assets/serializers/asset.py:63 #: assets/templates/assets/asset_create.html:24 #: assets/templates/assets/user_asset_list.html:50 #: perms/serializers/user_permission.py:38 msgid "Protocols" msgstr "协议组" -#: assets/models/asset.py:167 assets/templates/assets/asset_detail.html:104 +#: assets/models/asset.py:166 assets/templates/assets/asset_detail.html:104 #: assets/templates/assets/user_asset_list.html:51 msgid "Platform" msgstr "系统平台" -#: assets/models/asset.py:170 assets/models/cmd_filter.py:21 +#: assets/models/asset.py:169 assets/models/cmd_filter.py:21 #: assets/models/domain.py:54 assets/models/label.py:22 #: assets/templates/assets/asset_detail.html:112 msgid "Is active" msgstr "激活" -#: assets/models/asset.py:176 assets/templates/assets/asset_detail.html:68 +#: assets/models/asset.py:175 assets/templates/assets/asset_detail.html:68 msgid "Public IP" msgstr "公网IP" -#: assets/models/asset.py:177 assets/templates/assets/asset_detail.html:120 +#: assets/models/asset.py:176 assets/templates/assets/asset_detail.html:120 msgid "Asset number" msgstr "资产编号" -#: assets/models/asset.py:180 assets/templates/assets/asset_detail.html:84 +#: assets/models/asset.py:179 assets/templates/assets/asset_detail.html:84 msgid "Vendor" msgstr "制造商" -#: assets/models/asset.py:181 assets/templates/assets/asset_detail.html:88 +#: assets/models/asset.py:180 assets/templates/assets/asset_detail.html:88 msgid "Model" msgstr "型号" -#: assets/models/asset.py:182 assets/templates/assets/asset_detail.html:116 +#: assets/models/asset.py:181 assets/templates/assets/asset_detail.html:116 msgid "Serial number" msgstr "序列号" -#: assets/models/asset.py:184 +#: assets/models/asset.py:183 msgid "CPU model" msgstr "CPU型号" -#: assets/models/asset.py:185 +#: assets/models/asset.py:184 #: xpack/plugins/license/templates/license/license_detail.html:80 msgid "CPU count" msgstr "CPU数量" -#: assets/models/asset.py:186 +#: assets/models/asset.py:185 msgid "CPU cores" msgstr "CPU核数" -#: assets/models/asset.py:187 +#: assets/models/asset.py:186 msgid "CPU vcpus" msgstr "CPU总数" -#: assets/models/asset.py:188 assets/templates/assets/asset_detail.html:96 +#: assets/models/asset.py:187 assets/templates/assets/asset_detail.html:96 msgid "Memory" msgstr "内存" -#: assets/models/asset.py:189 +#: assets/models/asset.py:188 msgid "Disk total" msgstr "硬盘大小" -#: assets/models/asset.py:190 +#: assets/models/asset.py:189 msgid "Disk info" msgstr "硬盘信息" -#: assets/models/asset.py:192 assets/templates/assets/asset_detail.html:108 +#: assets/models/asset.py:191 assets/templates/assets/asset_detail.html:108 msgid "OS" msgstr "操作系统" -#: assets/models/asset.py:193 +#: assets/models/asset.py:192 msgid "OS version" msgstr "系统版本" -#: assets/models/asset.py:194 +#: assets/models/asset.py:193 msgid "OS arch" msgstr "系统架构" -#: assets/models/asset.py:195 +#: assets/models/asset.py:194 msgid "Hostname raw" msgstr "主机名原始" -#: assets/models/asset.py:197 assets/templates/assets/asset_create.html:46 +#: assets/models/asset.py:196 assets/templates/assets/asset_create.html:46 #: assets/templates/assets/asset_detail.html:227 templates/_nav.html:26 msgid "Labels" msgstr "标签管理" @@ -968,7 +971,7 @@ msgstr "带宽" msgid "Contact" msgstr "联系人" -#: assets/models/cluster.py:22 users/models/user.py:346 +#: assets/models/cluster.py:22 users/models/user.py:349 #: users/templates/users/user_detail.html:76 msgid "Phone" msgstr "手机" @@ -994,7 +997,7 @@ msgid "Default" msgstr "默认" #: assets/models/cluster.py:36 assets/models/label.py:14 -#: users/models/user.py:454 +#: users/models/user.py:457 msgid "System" msgstr "系统" @@ -1054,7 +1057,7 @@ msgstr "过滤器" msgid "Type" msgstr "类型" -#: assets/models/cmd_filter.py:51 assets/models/user.py:109 +#: assets/models/cmd_filter.py:51 assets/models/user.py:112 #: assets/templates/assets/cmd_filter_rule_list.html:60 msgid "Priority" msgstr "优先级" @@ -1113,7 +1116,7 @@ msgstr "默认资产组" #: terminal/templates/terminal/command_list.html:65 #: terminal/templates/terminal/session_list.html:27 #: terminal/templates/terminal/session_list.html:71 users/forms.py:316 -#: users/models/user.py:124 users/models/user.py:442 +#: users/models/user.py:127 users/models/user.py:445 #: users/serializers/v1.py:109 users/templates/users/user_group_detail.html:78 #: users/templates/users/user_group_list.html:36 users/views/user.py:243 #: xpack/plugins/orgs/forms.py:26 @@ -1139,15 +1142,15 @@ msgstr "键" msgid "New node" msgstr "新节点" -#: assets/models/user.py:103 +#: assets/models/user.py:106 msgid "Automatic login" msgstr "自动登录" -#: assets/models/user.py:104 +#: assets/models/user.py:107 msgid "Manually login" msgstr "手动登录" -#: assets/models/user.py:108 +#: assets/models/user.py:111 #: assets/templates/assets/_asset_group_bulk_update_modal.html:11 #: assets/templates/assets/system_user_assets.html:22 #: assets/templates/assets/system_user_detail.html:22 @@ -1170,21 +1173,21 @@ msgstr "手动登录" msgid "Assets" msgstr "资产管理" -#: assets/models/user.py:111 assets/templates/assets/_system_user.html:59 +#: assets/models/user.py:114 assets/templates/assets/_system_user.html:59 #: assets/templates/assets/system_user_detail.html:122 #: assets/templates/assets/system_user_update.html:10 msgid "Auto push" msgstr "自动推送" -#: assets/models/user.py:112 assets/templates/assets/system_user_detail.html:74 +#: assets/models/user.py:115 assets/templates/assets/system_user_detail.html:74 msgid "Sudo" msgstr "Sudo" -#: assets/models/user.py:113 assets/templates/assets/system_user_detail.html:79 +#: assets/models/user.py:116 assets/templates/assets/system_user_detail.html:79 msgid "Shell" msgstr "Shell" -#: assets/models/user.py:114 assets/templates/assets/system_user_detail.html:66 +#: assets/models/user.py:117 assets/templates/assets/system_user_detail.html:66 #: assets/templates/assets/system_user_list.html:54 msgid "Login mode" msgstr "登录模式" @@ -1220,7 +1223,7 @@ msgid "Backend" msgstr "后端" #: assets/serializers/asset_user.py:66 users/forms.py:263 -#: users/models/user.py:357 users/templates/users/first_login.html:42 +#: users/models/user.py:360 users/templates/users/first_login.html:42 #: users/templates/users/user_password_update.html:49 #: users/templates/users/user_profile.html:69 #: users/templates/users/user_profile_update.html:46 @@ -1500,6 +1503,7 @@ msgstr "重命名成功" #: perms/templates/perms/asset_permission_create_update.html:38 #: perms/templates/perms/remote_app_permission_create_update.html:39 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_create_update.html:43 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create_update.html:27 msgid "Basic" msgstr "基本" @@ -1521,6 +1525,7 @@ msgstr "自动生成密钥" #: perms/templates/perms/remote_app_permission_create_update.html:52 #: terminal/templates/terminal/terminal_update.html:40 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_create_update.html:67 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create_update.html:48 msgid "Other" msgstr "其它" @@ -1593,7 +1598,7 @@ msgstr "选择节点" #: users/templates/users/user_group_list.html:119 #: users/templates/users/user_list.html:255 #: xpack/plugins/cloud/templates/cloud/account_create_update.html:34 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create.html:36 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create_update.html:54 #: xpack/plugins/interface/templates/interface/interface.html:103 #: xpack/plugins/orgs/templates/orgs/org_create_update.html:33 msgid "Confirm" @@ -1667,6 +1672,7 @@ msgstr "资产用户" #: users/templates/users/user_detail.html:140 #: users/templates/users/user_profile.html:150 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:128 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:132 #: xpack/plugins/license/templates/license/license_detail.html:102 msgid "Quick modify" msgstr "快速修改" @@ -2183,8 +2189,8 @@ msgstr "用户名不存在" msgid "Password expired" msgstr "密码过期" -#: audits/models.py:91 xpack/plugins/cloud/models.py:164 -#: xpack/plugins/cloud/models.py:178 +#: audits/models.py:91 xpack/plugins/cloud/models.py:267 +#: xpack/plugins/cloud/models.py:290 msgid "Failed" msgstr "失败" @@ -2206,7 +2212,7 @@ msgstr "Agent" #: audits/models.py:99 audits/templates/audits/login_log_list.html:56 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 -#: users/forms.py:175 users/models/user.py:349 +#: users/forms.py:175 users/models/user.py:352 #: users/templates/users/first_login.html:45 msgid "MFA" msgstr "MFA" @@ -2214,13 +2220,13 @@ msgstr "MFA" #: audits/models.py:100 audits/templates/audits/login_log_list.html:57 #: xpack/plugins/change_auth_plan/models.py:417 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_subtask_list.html:15 -#: xpack/plugins/cloud/models.py:172 +#: xpack/plugins/cloud/models.py:281 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:69 msgid "Reason" msgstr "原因" #: audits/models.py:101 audits/templates/audits/login_log_list.html:58 -#: xpack/plugins/cloud/models.py:171 xpack/plugins/cloud/models.py:188 +#: xpack/plugins/cloud/models.py:278 xpack/plugins/cloud/models.py:313 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:70 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:65 msgid "Status" @@ -2750,7 +2756,7 @@ msgstr "汇总" #: ops/models/command.py:22 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:56 -#: xpack/plugins/cloud/models.py:170 +#: xpack/plugins/cloud/models.py:276 msgid "Result" msgstr "结果" @@ -2950,7 +2956,8 @@ msgstr "版本" #: ops/templates/ops/task_list.html:63 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:137 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:53 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:53 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:141 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:54 msgid "Run" msgstr "执行" @@ -3003,7 +3010,7 @@ msgstr "空" #: perms/templates/perms/asset_permission_list.html:118 #: perms/templates/perms/remote_app_permission_list.html:16 #: templates/_nav.html:14 users/forms.py:286 users/models/group.py:26 -#: users/models/user.py:333 users/templates/users/_select_user_modal.html:16 +#: users/models/user.py:336 users/templates/users/_select_user_modal.html:16 #: users/templates/users/user_detail.html:217 #: users/templates/users/user_list.html:38 #: xpack/plugins/orgs/templates/orgs/org_list.html:15 @@ -3052,7 +3059,7 @@ msgstr "资产授权" #: perms/models/asset_permission.py:116 perms/models/base.py:40 #: perms/templates/perms/asset_permission_detail.html:90 #: perms/templates/perms/remote_app_permission_detail.html:82 -#: users/models/user.py:365 users/templates/users/user_detail.html:107 +#: users/models/user.py:368 users/templates/users/user_detail.html:107 #: users/templates/users/user_profile.html:120 msgid "Date expired" msgstr "失效日期" @@ -3154,7 +3161,7 @@ msgstr "刷新授权缓存" #: perms/templates/perms/asset_permission_list.html:55 #: perms/templates/perms/asset_permission_list.html:69 #: perms/templates/perms/remote_app_permission_list.html:18 -#: users/templates/users/user_list.html:40 xpack/plugins/cloud/models.py:53 +#: users/templates/users/user_list.html:40 xpack/plugins/cloud/models.py:74 #: xpack/plugins/cloud/templates/cloud/account_detail.html:58 #: xpack/plugins/cloud/templates/cloud/account_list.html:14 msgid "Validity" @@ -3606,7 +3613,7 @@ msgid "Please submit the LDAP configuration before import" msgstr "请先提交LDAP配置再进行导入" #: settings/templates/settings/_ldap_list_users_modal.html:39 -#: users/models/user.py:329 users/templates/users/user_detail.html:71 +#: users/models/user.py:332 users/templates/users/user_detail.html:71 #: users/templates/users/user_profile.html:59 msgid "Email" msgstr "邮件" @@ -3752,8 +3759,8 @@ msgid "Endpoint suffix" msgstr "端点后缀" #: settings/templates/settings/replay_storage_create.html:136 -#: xpack/plugins/cloud/models.py:186 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:81 +#: xpack/plugins/cloud/models.py:307 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:109 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:62 msgid "Region" msgstr "地域" @@ -4389,7 +4396,7 @@ msgstr "你没有权限" msgid "Could not reset self otp, use profile reset instead" msgstr "不能再该页面重置MFA, 请去个人信息页面重置" -#: users/forms.py:33 users/models/user.py:337 +#: users/forms.py:33 users/models/user.py:340 #: users/templates/users/_select_user_modal.html:15 #: users/templates/users/user_detail.html:87 #: users/templates/users/user_list.html:37 @@ -4508,52 +4515,52 @@ msgstr "选择用户" msgid "User auth from {}, go there change password" msgstr "用户认证源来自 {}, 请去相应系统修改密码" -#: users/models/user.py:123 users/models/user.py:450 +#: users/models/user.py:126 users/models/user.py:453 msgid "Administrator" msgstr "管理员" -#: users/models/user.py:125 +#: users/models/user.py:128 msgid "Application" msgstr "应用程序" -#: users/models/user.py:126 +#: users/models/user.py:129 msgid "Auditor" msgstr "审计员" -#: users/models/user.py:284 users/templates/users/user_profile.html:94 +#: users/models/user.py:287 users/templates/users/user_profile.html:94 #: users/templates/users/user_profile.html:163 #: users/templates/users/user_profile.html:166 msgid "Disable" msgstr "禁用" -#: users/models/user.py:285 users/templates/users/user_profile.html:92 +#: users/models/user.py:288 users/templates/users/user_profile.html:92 #: users/templates/users/user_profile.html:170 msgid "Enable" msgstr "启用" -#: users/models/user.py:286 users/templates/users/user_profile.html:90 +#: users/models/user.py:289 users/templates/users/user_profile.html:90 msgid "Force enable" msgstr "强制启用" -#: users/models/user.py:340 +#: users/models/user.py:343 msgid "Avatar" msgstr "头像" -#: users/models/user.py:343 users/templates/users/user_detail.html:82 +#: users/models/user.py:346 users/templates/users/user_detail.html:82 msgid "Wechat" msgstr "微信" -#: users/models/user.py:372 users/templates/users/user_detail.html:103 +#: users/models/user.py:375 users/templates/users/user_detail.html:103 #: users/templates/users/user_list.html:39 #: users/templates/users/user_profile.html:102 msgid "Source" msgstr "用户来源" -#: users/models/user.py:376 +#: users/models/user.py:379 msgid "Date password last updated" msgstr "最后更新密码日期" -#: users/models/user.py:453 +#: users/models/user.py:456 msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" @@ -4607,8 +4614,8 @@ msgstr "安全令牌验证" #: users/templates/users/_base_otp.html:44 users/templates/users/_user.html:13 #: users/templates/users/user_profile_update.html:55 -#: xpack/plugins/cloud/models.py:120 -#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:57 +#: xpack/plugins/cloud/models.py:147 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:60 #: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:13 msgid "Account" msgstr "账户" @@ -5328,6 +5335,7 @@ msgid "* Please enter custom password" msgstr "* 请输入自定义密码" #: xpack/plugins/change_auth_plan/forms.py:64 +#: xpack/plugins/cloud/serializers.py:73 msgid "* Please enter a valid crontab expression" msgstr "* 请输入有效的 crontab 表达式" @@ -5335,6 +5343,10 @@ msgstr "* 请输入有效的 crontab 表达式" #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_create_update.html:60 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:81 #: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:17 +#: xpack/plugins/cloud/forms.py:33 xpack/plugins/cloud/forms.py:81 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create_update.html:41 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:72 +#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:16 msgid "Periodic perform" msgstr "定时执行" @@ -5346,11 +5358,11 @@ msgstr "" "提示:用户名为将要修改的资产上的用户的用户名。如果用户存在,则修改密码;如果" "用户不存在,则创建用户。" -#: xpack/plugins/change_auth_plan/forms.py:125 +#: xpack/plugins/change_auth_plan/forms.py:125 xpack/plugins/cloud/forms.py:84 msgid "Tips: (Units: hour)" msgstr "提示:(单位: 时)" -#: xpack/plugins/change_auth_plan/forms.py:126 +#: xpack/plugins/change_auth_plan/forms.py:126 xpack/plugins/cloud/forms.py:85 msgid "" "eg: Every Sunday 03:05 run <5 3 * * 0>
Tips: Using 5 digits linux " "crontab expressions ({% trans "Update" %}'.replace('{{ DEFAULT_PK }}', cellData); var del_btn = '{% trans "Delete" %}' .replace('{{ DEFAULT_PK }}', cellData) - .replace('99991938', rowData.name); + .replace('99991938', name); if (rowData.inherit) { del_btn = del_btn.replace("mark", "disabled") } diff --git a/apps/terminal/templates/terminal/terminal_list.html b/apps/terminal/templates/terminal/terminal_list.html index 6676a26ab..53325694b 100644 --- a/apps/terminal/templates/terminal/terminal_list.html +++ b/apps/terminal/templates/terminal/terminal_list.html @@ -69,16 +69,17 @@ function initTable() { } }}, {targets: 6, createdCell: function (td, cellData, rowData) { + var name = htmlEscape(rowData.name); var update_btn = '{% trans "Update" %}' .replace('{{ DEFAULT_PK }}', cellData); var delete_btn = '{% trans "Delete" %}' .replace('{{ DEFAULT_PK }}', cellData) - .replace('99991938', rowData.name); + .replace('99991938', name); var accept_btn = '{% trans "Accept" %} ' .replace('{{ DEFAULT_PK }}', cellData); var reject_btn = '{% trans "Reject" %}' .replace('{{ DEFAULT_PK }}', cellData) - .replace('99991938', rowData.name); + .replace('99991938', name); if (rowData.is_accepted) { $(td).html(update_btn + delete_btn); } else { diff --git a/apps/users/templates/users/user_group_list.html b/apps/users/templates/users/user_group_list.html index 8d3bd3245..c2fa87357 100644 --- a/apps/users/templates/users/user_group_list.html +++ b/apps/users/templates/users/user_group_list.html @@ -67,11 +67,12 @@ function initTable() { $(td).html('' + innerHtml + ''); }}, {targets: 4, createdCell: function (td, cellData, rowData) { + var name = htmlEscape(rowData.name); var update_btn = '{% trans "Update" %}' .replace('{{ DEFAULT_PK }}', cellData); var del_btn = '{% trans "Delete" %}' .replace('{{ DEFAULT_PK }}', cellData) - .replace('99991938', rowData.name); + .replace('99991938', name); if (rowData.id === 1) { $(td).html(update_btn) } else { diff --git a/apps/users/templates/users/user_list.html b/apps/users/templates/users/user_list.html index 0c74640de..a2bfde461 100644 --- a/apps/users/templates/users/user_list.html +++ b/apps/users/templates/users/user_list.html @@ -97,6 +97,7 @@ function initTable() { } }}, {targets: 7, createdCell: function (td, cellData, rowData) { + var name = htmlEscape(rowData.name); var update_btn = ""; if (rowData.role === 'Admin' && ('{{ request.user.role }}' !== 'Admin')) { update_btn = '{% trans "Update" %}'; @@ -109,11 +110,11 @@ function initTable() { if (rowData.id === 1 || rowData.username === "admin" || rowData.username === "{{ request.user.username }}" || (rowData.role === 'Admin' && ('{{ request.user.role }}' !== 'Admin'))) { del_btn = '{% trans "Delete" %}' .replace('{{ DEFAULT_PK }}', cellData) - .replace('99991938', rowData.name); + .replace('99991938', name); } else { del_btn = '{% trans "Delete" %}' .replace('{{ DEFAULT_PK }}', cellData) - .replace('99991938', rowData.name); + .replace('99991938', name); } $(td).html(update_btn + del_btn) }}], From d0c74a770439fb09e016f097df3375c2245731f1 Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 30 Jul 2019 16:49:54 +0800 Subject: [PATCH 7/8] =?UTF-8?q?[Bugfix]=20=E4=BF=AE=E5=A4=8D=E5=8F=AA?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=85=AC=E9=92=A5=E4=B8=8D=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/tasks.py | 48 ++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/apps/assets/tasks.py b/apps/assets/tasks.py index 8d057f897..f96e1faa5 100644 --- a/apps/assets/tasks.py +++ b/apps/assets/tasks.py @@ -374,10 +374,36 @@ def test_system_user_connectivity_period(): #### Push system user tasks #### def get_push_linux_system_user_tasks(system_user): - tasks = [] + tasks = [ + { + 'name': 'Add user {}'.format(system_user.username), + 'action': { + 'module': 'user', + 'args': 'name={} shell={} state=present'.format( + system_user.username, system_user.shell, + ), + } + }, + { + 'name': 'Check home dir exists', + 'action': { + 'module': 'stat', + 'args': 'path=/home/{}'.format(system_user.username) + }, + 'register': 'home_existed' + }, + { + 'name': "Set home dir permission", + 'action': { + 'module': 'file', + 'args': "path=/home/{0} owner={0} group={0} mode=700".format(system_user.username) + }, + 'when': 'home_existed.stat.exists == true' + } + ] if system_user.password: tasks.append({ - 'name': 'Add user {}'.format(system_user.username), + 'name': 'Set {} password'.format(system_user.username), 'action': { 'module': 'user', 'args': 'name={} shell={} state=present password={}'.format( @@ -386,24 +412,6 @@ def get_push_linux_system_user_tasks(system_user): ), } }) - tasks.extend([ - { - 'name': 'Check home dir exists', - 'action': { - 'module': 'stat', - 'args': 'path=/home/{}'.format(system_user.username) - }, - 'register': 'home_existed' - }, - { - 'name': "Set home dir permission", - 'action': { - 'module': 'file', - 'args': "path=/home/{0} owner={0} group={0} mode=700".format(system_user.username) - }, - 'when': 'home_existed.stat.exists == true' - } - ]) if system_user.public_key: tasks.append({ 'name': 'Set {} authorized key'.format(system_user.username), From bb235f3e88d9da6a0379f665478390ec994d6cd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E5=B9=BF?= Date: Tue, 30 Jul 2019 17:46:27 +0800 Subject: [PATCH 8/8] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=B5=84=E4=BA=A7=E6=97=B6=E4=BD=BF=E7=94=A8in=20(#30?= =?UTF-8?q?53)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/utils.py | 4 ++-- apps/perms/utils/asset_permission.py | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/apps/assets/utils.py b/apps/assets/utils.py index be8a80351..e1ed234e2 100644 --- a/apps/assets/utils.py +++ b/apps/assets/utils.py @@ -213,10 +213,10 @@ class NodeUtil: children.add(node) return list(children) - def get_children(self, node, with_self=True): + def get_all_children(self, node, with_self=True): return self.get_all_children_by_key(node.key, with_self=with_self) - def get_children_keys_by_key(self, key, with_self=True): + def get_all_children_keys_by_key(self, key, with_self=True): nodes = self.get_all_children_by_key(key, with_self=with_self) return [n.key for n in nodes] diff --git a/apps/perms/utils/asset_permission.py b/apps/perms/utils/asset_permission.py index 42c4060e8..9e5230894 100644 --- a/apps/perms/utils/asset_permission.py +++ b/apps/perms/utils/asset_permission.py @@ -449,6 +449,8 @@ class AssetPermissionUtil(AssetPermissionCacheMixin): self._nodes = None self._assets_direct = None self._nodes_direct = None + self.node_util = NodeUtil() + self.tree._node_util = self.node_util @staticmethod def change_org_if_need(): @@ -491,13 +493,14 @@ class AssetPermissionUtil(AssetPermissionCacheMixin): self.tree.add_nodes(nodes_keys) - pattern = set() + all_nodes_keys = set() for key in nodes_keys: - pattern.add(r'^{0}$|^{0}:'.format(key)) - pattern = '|'.join(list(pattern)) - if pattern: + children_keys = self.node_util.get_all_children_keys_by_key(key) + all_nodes_keys.update(set(children_keys)) + + if all_nodes_keys: assets_ids = Asset.objects.filter( - nodes__key__regex=pattern + nodes__key__in=all_nodes_keys ).valid().values_list("id", flat=True).distinct() else: assets_ids = []