From 1d99cdd09bbffcc61510bf6e00f367c1c4e5846b Mon Sep 17 00:00:00 2001 From: kdeterme Date: Wed, 30 Sep 2026 11:51:55 +0200 Subject: [PATCH] feat(assets): ignore auxiliary 'com' wiring and allow archive or delete in cross plan import - Ignore communication and power supply rows ('com', 'comm', 'alim', etc.) in detector sections - Add user-selectable 'archive' and 'delete' actions for all assets in cross plan preview - Handle ProtectedError gracefully when deleting referenced assets - Add unit tests for wire filtering and archive/delete integration actions - Update and compile translations (fr, nl, en) --- loko/assets/locale/en/LC_MESSAGES/django.mo | Bin 114123 -> 114536 bytes loko/assets/locale/en/LC_MESSAGES/django.po | 15 + loko/assets/locale/fr/LC_MESSAGES/django.mo | Bin 125816 -> 126198 bytes loko/assets/locale/fr/LC_MESSAGES/django.po | 15 + loko/assets/locale/nl/LC_MESSAGES/django.mo | Bin 116413 -> 116876 bytes loko/assets/locale/nl/LC_MESSAGES/django.po | 15 + .../trafficlights_import_cross_plan.html | 31 +- loko/assets/tests.py | 302 ++++++++++++++++++ loko/assets/utils/cross_plan_parser.py | 39 ++- loko/assets/views/trafficlights.py | 161 ++++++++-- 10 files changed, 543 insertions(+), 35 deletions(-) diff --git a/loko/assets/locale/en/LC_MESSAGES/django.mo b/loko/assets/locale/en/LC_MESSAGES/django.mo index 0f0847f56ed39518cd4960e1e02dc65376b6cba8..4d3b7fe491c260d96ebac0021c9d0d1cf8c27f84 100644 GIT binary patch delta 37706 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 z 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 Yej|nsw(k)ApVmV9<`c`4UC8@?0G;x61^@s6 delta 37306 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 diff --git a/loko/assets/locale/en/LC_MESSAGES/django.po b/loko/assets/locale/en/LC_MESSAGES/django.po index f51db82..d1a0a55 100644 --- a/loko/assets/locale/en/LC_MESSAGES/django.po +++ b/loko/assets/locale/en/LC_MESSAGES/django.po @@ -8573,6 +8573,21 @@ msgstr "GIEP zones" msgid "Aucune localisation GIEP trouvée à proximité" msgstr "No location found" +msgid "Supprimer de la DB" +msgstr "Delete from DB" + +msgid "Supprimer l'existant de la DB" +msgstr "Delete existing from DB" + +msgid "Ne pas créer (Ignorer)" +msgstr "Do not create (Ignore)" + +msgid "Archiver l'existant (Ne pas recréer)" +msgstr "Archive existing (do not recreate)" + +msgid "Archiver l'existant" +msgstr "Archive existing" + #~ msgid "Absent du fichier Excel (Sera conservé ou archivé)" #~ msgstr "Missing from Excel file (Will be kept or archived)" diff --git a/loko/assets/locale/fr/LC_MESSAGES/django.mo b/loko/assets/locale/fr/LC_MESSAGES/django.mo index 26b0c00ab046295eb07a99c2ee12feb40f1a2865..6254f81ca5f1d4ed9701ab2988cabdb7b39cca6a 100644 GIT binary patch delta 38262 zcmbWod+4I=@IIk z*sV9kVuKzuH5RKsGZtHh4R8nkfSYjXtXOOhcA<7DEc`+&RtTF0`(X~^PhvfM5$PiK z6&A-+m>i46V`=A5nS@e!3pT}~I0!8`9ZTRQ%z($yhJM7X_$xYq*xabY(wK{A9n6gF zF+1KL;*Vf@;*&5F{l}&gu;B%m7GJ|MxE{0NadalXU|viyFUrr48HqQ++}Iu+=mY4$ zp2K@_30A~wm>Mg*7)_uWrltQ_t&q?VGZAkdyxRiA`=SGR5cA-8%z|^VBfc8aub~6X z{ZeE_Ospun5`)lo#-J%RCT5Nf_*Jx{ zb?6rCL1%g#i{VemS&n607!BlRv|Lp*z4=1c-xcUU!p+zd-J`MSQcXl>Gz&d+>(Gw3 zU;*5T9z(T=ua8{C79FxQf3i|#?%jmHKMs7%HLw8Dl^;2m^t51?Cd z8mr^)=t@;s8kKL1)rhylBKQx1lZs9NA>F z!`Wy9Yp@)?hnBm5c98s9)Idc{L%bP!R@!1c9Eg4|R$)opfi>|oHpW6LqchZdCF}3$ zpFl!YoQ>|yKD6Rr=!}c5iVjs>bW6ISr+FHdz}4uXJc8E$4XsyXb+oc|(6iGGU9lI? zepjt#{hjen65Qi2us&Wuzg$(;MENbycrUcvSj>Pg;7zy$69d80#E)Ql{1;PWy4Rx> z%^WO_UftV2b0hlEJT-h8(MA`I`R|fl3xtznbt-fl)+S_H^7Y81Z}51 zro@NP0SycJ@zDg_t0&P0=b$rs1HD!|(9?SXJwz$jMGfXd%iW6BuZM0~TP%d5(50S( zmRpTkaWmS_UStL0v2R1h6)Z(Yn)T7rR77Wf2Rf5x=m0vQhjS1X!^cDXRdh*rqFZwq z{T`gaY#4hZ`XpyZ2U-KudjES6NJm0{^iVyFWpO$>^6hAYdoVj5Lbu>Fx|DySGrfkk zlVd})_XW_ImPEJq4$O}C1P5bP@BjFaun}_*--|YQEchF`GO0I4GpK-_h>rjHbsXuKYEs`g?MYsOuQdD(GeIgOkfrPmwF>Q!tJ5JCzyr!&zKYc!L*odb2OuT zX!*+M5;sE2bwXESAXKC%!Fgnj-Ekp z!2)z^wxQSTJ+$Kk=n9@jKf!;Z?HAY@eviN=#3!NkKHSRsTj6sOT$*#}(p*Ickmt>4 zW>wJ+8l$KCo)9064s05FMqWl&bPe{vkFh&e*hU^s!wOhwJ2wTp#|hLTunt?{&*;+K zz9TyA4bh(oT`((-MQ_8i=$^lb-uDmD866BBL)-ZQ-I`y6NpD5*9Ow$hixY50710%F zjn1SimcaobJ`3%5F?#LRpff)l(!a<2#4n;}Df8P=d%4gvQw*(F4xP|lNPF?vZ~~5W z0w(qtt*{`Zzk+Vj>u3YJu{@qZXOL@W^o=i!)~}Dbus!C*0ciUZu>ej%C-^ERe*SMH zV1<2H9KS&uO8rjMKwiv4yfS*4o1yt#FgFfD2lzO;LUYh^%g}Ng(Jk1EmOF|L=sf0$ z6ZoA#KFqu;I%K8Ly{?04zC(F$}6H=qOCjZW++I9&so#$#kP%&p z+~~jyp&zjFA-@*75{-kM;shK~KeXbQknuQ{B0dXK;alh)?hYP6>m5h;_&2n}G<%~7 zch35%nLtRXt1HrN=uq61ip zMe$8c#^Y!Q|Dx>_+ZXjy9sN#pLAE3wdxU^{_dMG15_E~SpanlbJ3ftW)o4NQkk(RS{_G}ss2`@!f+JcFK%d02%0V;c$B;OFQHoX49m?T67!vY`!BK`XXF z%RPYUaS~d8I+nuaSOX8B9j5yzs-Fj4scPr|o8wL1|Lz1_q5dRS{>aqNb!z$El6Ou<^X3~lcu#_iw_0+le=CsBna=zvGAX4Ss^2rSH+LN_!wGUl{!YmPYeyVMgqFfc4Kr-~kfc^HG=qpAH3P zhx8?wmh=s1!`so7ID+o^k7&ae&@IVvFgm1#(Durq?bpEa*bH5%kq23SXEL9JGI$W( zyT36dRy)L>_h1cl0JYGL8=_lvcW@A9AwC{GD>KlQU4yR7hnN+=MOXF`I?y!n!%@X- zn3{wl=nPAS^m=H)Hs~JS6XL_r0X-Ic5}oNZwBr}CFm4U`U!p5?5^X=lk?3~CZzf;| zw_!3iz-)LwR>I-vj9x(--i@A#lUN%6LQj3MPovw>3SHX%=!!gxWpM%8@jkTuQ^?lG zW0wect&%>A3KYO(;?>ZOJEDhdC^~=%=*$)6OJWan z0Fx84|1T2AMZ#*VjJwf8bs7Dl{fnOZg@Fel!NZq*QUX~&@Dr=Sh5L}$7d?Qna@ z-yPzo(3SfU-ICuho}EB}qftghw4>_i-nK-yU6dWQrnevB^d_vo3pg3c(z@#y{*MYo_T+E88e zP<6#R_yl^--^JVTQ@jH+d>sv>HQr3T6FT9C;{-h23qr4^E&1xQ6X8p6{FJuna;^?=WsDNaTM%YnvAq3zTRwnA63C+5YGX!|peiNs?s5pa)QLAPQJI`VDk0N%%f zcoc2uk6@-#(HHF&^b9pdw_*?$##!iD*@(9D3EJ_g5dRqq(0}Yd0*i;4UHNGLE4i;yuF zo#{4o?+&78;SAdFA6Oi-osI@n9j(_5y`JOIde5T+e+`}a+t>j2VI|D)J?rn%*Cuca zHbUe5F*OcBmu>`lJD$d7_%hnyPgn+j$5L42hiD6%qbt)HJ={ak_Ty;1rRW)X{Rh^+ zJb~RLID_BNirLRZ4VA?T#A~2S*blu{6VY;SqDy`_coOpy{{@|S`X8eS6h;qc74(cX zL@w8{7dS%do)I<+$J9LKK@FpC9$v6zF z;Vi6;`>+b8iJyyp;i!q#Nf?T~aV0u~EI&nus2JKodAtd0Vqzxfz}sRn_QrJh1eV5W z*bTR$f!E#_T;+=3aE=J3B{w4Y}kHAdC z$DoJrY4pr24)Lv+nfL)Ljwg_Q3j6DWtCnYtmpCpv(En2Y{n6GO&abmU7gF%$GwY(ocl9If~}IX2WY3H<0yGlu$HS4LvMP(2Dm2AI7Z2C!?o$ z9u~&W(JlBL9cYTn(f6YOI?$q+1#b^F$5h1cxy<^PBG8=#mvk~_#~09*cnwqI<`Cb3 z&R`!}?l5{izegvMbR`-<4s;942OFZdp$l66@sPgg3hQseCK4**A++J7-=mIlqNltd zI-uH^7Mo!*-i7|G7>YS?Iy&Q}=xN`MuGoIGpJV8j{(-qMU;K}#LM3#GnxYNejW#d{ z{ql`LXZ`|uHWr2WN_4L`piBA|dRTX(D|al!PoV?<3tj0He@5lvSqYRNp){t%w&-c? zfHpW1?O-f=n4ZKu_$<2Dub?Zo6P@W{bSu6?SLO;@FZ5AlMFY!=S-tdtheo|3CuH z;8C=}$>_D3i&of*<#7)-#!J`8Fr>0h8rdIk&N@95U$xE5WzlEFG?JMGau?}Y_% z1XjXX*I0im?g<5sqSxYQw8NDDMN5?n-HK#%iEl?|+8$lG(dgDZg(+|)I^#9y1U6tU z+>Wm3A#?&K{)t4~5QdIox;75kzy9*+)aCVIG*p@(S| zI*`5S08XN3;zxAvQ>RKw9NJuH{dOeN6XDc+gpa7mABBn{}8iy|Gy&O-k(Dc%|GbOQ>2N~3!taA z0-D|uoq1n$B_^T`K8@C&iw<;QNMDO3h`){2{~jIif0&B?V>!}Bdz%*>VUb`(bS8Ds z4@Nt5@4BKZ)(>qkjvl&sI1txiX)KT~De>ohP0)c&L_400)|-!szyIG%AhFcw^*E01 zvIaqr=()y$xf~Yxx>_C_h3c@(X%4uBK0lCq{l# zhG+)K=;5i3g|Pz`!{O*&&O?{{6?A1*qf5OD9q?ha!>`a4`8VX}%$St;;uS{+(g^LR zZ^n3ZI36d#>o6bP>n*|0&;eXRN1iuRv<0`ID^?!8R`t;(?TvQu7&^ekA-)Nn@fYaU zok6$yzc>LK$dozis4`lh6MCo~4DoSjhqKWRUPT++kDiII&<0PVGrNd>@v>xzCRQ9> zk^1P0bw+PRygz{o1SX&ztV0LzE;@i?=m5{5Gt8Vd8fYnWOIo2FcELh80-gD6bO0;S zm3s#r=!a8$IcV*%a$cubglBDBdmsZU}H>)lhJZhLwq*c;5>BTOVQK48SQXC zdg?z5@nh(~en1EQH>UCar_CNUkQtpx5%dhy#gcd*y5y7487@aV-h*~@06jZjq4lqz zGt8bNTCp=qeYmEThRuNhWu0LKz~9%U^nHA zW}F}W5*9&kLwj@pBhcIPG`dnVFz$$#g#x?KJ^mCu^}mGl9J!*iPy!w3t?0~K1@A@= zUoUhe9!9rpYRI1v@?S!?;5GCxzMYHvUyZRNAp{uhq`wj?!Sj&G6`O%S?ITY8759Gy5t|ChwliM z#p7tXba^9-p-WyL{nigfXF3l(%&!M`;&S2#u?&uk=ZltZ30h%Ya1SPC65L{J`o+jY_!95=*sR!SM(TqHm+dYim8&LCCP`* zxIDVIwa|ezMNfY_^mN~g)|(idgVtM(x8gP|iNB!($y+4qxGFl3R#+AL7UBLo!xuxw zW^`!|p!ff0bg45IjVe^YYQ*oyIXDN~VZ~dLqCXeJ(Zt`x!C19ev|=x#1KEiV;45_H zE)|PMU%J0Z@RTPPkA8zGh9060=m7hpD=-Ni;Irt!R-$L+BXp_1M9ZB+SLhOYM$(mt z+R2B0l5a(SINco&fo|yD^+p>Ui7x5m=!l;~2ecC1nzzwY{ULg0uAmKOEE$;{t)CY? zgeA~DuZxLKH#*Sx-2@zIPxNq&K$mJ3`srMY&fqv&?mX7Q6s4kTSr?soV@!pe(T49s z%lAQN{3uq&1!#K*kncl0c9MW2{SBS@HFTuuOGhKmho1JzSP}0;S862sU3dmvf#=YM zUq#Q(n`pVC=!AYow=Qj&=r9(;o4x;a30SZTy2OLfnU6I475(m)%9Yt@`RrK(sEXT^we=Gw5m#zZ35>?TeH3;#h=pJ@LSLQ+V z42(l(_Do2B1zqxu=s@OS>Cg+N0=7 zoeTN@q7CJ%5DlmTx)Qa}@*UB$(HAW@3O!@bqAR_s0{7n^5<5eI18Bw5=m4&u1ISh} zikCvmH$qQw2Xw`{qgyr@-J%z97`~0}d6i1h^=^apiMPk5II9x(-)r zr?n1x{T@Oao{Uv-HTsD@i4N#Lbg#2iiMB2;dL0X+^@^kAnxTih3)*gSjGE4fj|v1Hez)=kM42tn$ZuNF4&s*H0+6Aqgzz(_UP7hK(Avjbml|Q zL;Dzd8)l=|aV=WzvylER7V-Z7Lm(Lo)k=yrzSbc?=2 zx8@vL{vx^s|DtCgQ{CuGmmO0QFA(C%Sc-TVbOqbj<^DU;{veys+S!dVBugHEKB@WbRs?L#iN<@C&3X7L1*>^I^$>2 zC4B*%;Tyr-=*k^Nm-I*UQ~Os)zqx)=Y!&fJ=wUvNPV6@hIdl=#o`K1P>%W|QbcwIg^8 z9nfD`5968djFzG`dgwZ0GLAuKG#~wf?LhDGNwi$brqN7Fqg&S&UDEr|nf5{lFdXf0 z0Xl*8=+BzH$kxYWpNE9A=wAJa&NyYWsNrnrmK4M?SR7sQwrIomqo2|dA%8l0X11Yc zWiPtqC(wbVZl09*&+>9(MeqMm0-pXQ=nP&(J6s#$ThIZ$jgI`Ikbevv$am;ry@H;R zOf8ZU|5;u^G<_I4z$w9H=!(9Di9i28MZkuBLzgH;%V-99(Sa04m%coj-xghozUYje zLvPU%^jp6P{qP(?SM)r3i2pu|KAQ6YUA+TeV&!OiH| z*oAJvDRkyn&;h4z9d(om-GZX%%GJbT*c82{gIja|U7C@h;Ea&50^P&)=nsvz(JeZP zuGBZ^j4q&CmZ?qDaZdE7W&w0XYNFS;B|6ZK=;0lJ_B*{zJSy;ND7YS-!8WwQZgd8p z2hXDorfM6lP$o407IXz}M>}qgMX)Q{Q5>x|7oEttKnL7;HS}&HF!( zfFoWNGPa_7b`X>CEV_j0J0~Un`1!GF<}&3<<@pd!H< znE2=aZ3sBxKA5;>XhWOPfqjp5coCgZ`YzGW?;>cq)@TRg(E3x+Gq4<8nKf7sKR^eZ z?w;uPiF_EZNkRhxjd2Wmh<2f;{{&XWi|E#rxHqcU8J%$)Jyb8DTe2NJ%s*iXyy?EE zy-H~PR%pG)Fd1LGkNfZ8*-nB>b_wk`UDs&F1<)B)!}{176ZbaczZ&B2pyiIDKa4J+ zADI6zF_3Q2FRPW%57<5EVeHe5`|pwtBta*l_jew;606ar--mW^3Z22<=o07Y9+fME z4!jn+T6XXr{_M$5%->KPTxfp%03U4eQby&d{pj%TB{T|dpCJ>KxB~YA%htQGEMnA!Cp`Xk>=%M-q z%i_=I$n*A!8Z3$qxB|Kb4bYYBh|ct0w4EX7-j7BnItlZ5{}&Okfi1!P=&AoY#IyB| z8ZL%5SR>d9U77pQ2~5FGxE^a@x<1jVZ-5SHD0+BDp=aqi`@&JQqciAj`3v2eJpH4kE`oMk4ij60eu6vVojAHb_urZB zBB2SMLiecDfT%)MbY<>D2ha%}z;JZNGtds^qNjUJh<}6*>=b(FE~EX#9!UJqi6vuq zq7xp7C&gYSaEb&!rH>CxO8j?uZ(uFrDF-Db{jGm=oXnT*M{luRp;C-Eq&S)E2@oRLX=g>2930?9G4@K!Y&>0s%>sLbW ze@FDR55i;|iVkQdx^m0WTd)IZKOXyxfQRPs116s3qD!cXVK* z(9=94yLOXaG zZSXm?-pgpiE79_Ap%XfcF8K*`KWpsrK4~qs`13gRi(SdbGw`e%VozbHNY-kEPkXh(qS&w$OHNXG8jIEJb`ddcO~#hwIbeDYV`%=pLsS8FiQ!omfe9YwCscyW<3$S-((V7M38s z8lA}z^ekLKmpIF)=#Ujdm#{i|$U34k>WO~o9zq8&9lh4CU^0Gywtp5qtnsX)qmFJt zKNOA8E$NBw-D7CS)6f-Kik91mc6<<>*>QC5FQYTe@MyFJ#n7`=7Hy|mNNn-$Ym7Ai7oOFc~kS1I;xi+JY)*xq9fC=z`Yojc(Z(tbxnWv+*@1 z{{8>c1YD}5vC#mX3K-yu_Ez<=rxOti&ioX+D>kC z0A(=o^S?3yf7mof8+;P&U;(z7hTbz zXnV8J39iP(zyG^A6!-u=&F9d=^ar}b z=$0%*+kFjfZ%dr}Z$s~rP#!-;?{$jt(M(FBU$lGC89#~sw!9cq;4*XoE6^=ii!Skd z!7tH6{4;u1{y|qZ--Kvos!yOp2hf@XN8TMB=}@%dICKx6MQ1oOq_0BDZAVZ0`yu`f zI-qmGi|9=MLOV_~F}j|`&~lC91YDw)Xa^6X*Xv2NgC&@ZYtUa9KEX1+59-tOn8lCA}bk8@VhwcEnRj1LV{S__$AKFf#$!ksr~OyMRt0<W)Z_!WW&*;pvJs-_HA3CEF=uDfUd)Ey;3y+`;KY_(@ z5jyidXuY4&0cM^V)k{VPULDhW|63AhfSs`t&O-;VADzkJ5dR&$KG)DKNHr_E9eJ=B z@rvk5jz;%-657#RbPLy@E4mFm+($6+&;P$AV8ttF#n|kqVor1hrO}El(1vVyJh%R}C7b5eapXQS2fEuC`xci0h^M4=-Har$xs;AKrzJv~FCHlkUZFH-y zp$(>+6UB?6U%m=xy}QtX^gs{wXmo;4p!H{9GQK#6`(KT~b`omiZ&(G(&y9Xr?19yZ z&%@q$2%W)g^P)r40_~s!+HenaA`hSgABo901wC}Du{3VNZum`{fCcNm7kxke zJyh?8^smt`Th^DN4l3du#A{{04m#7Ln2cvadb&l?(icIus0=!RYFL#1 zV@*QF0CYyf(2kx7>5I{kuf)Vm&|9$^9pGuS-ZgY!xfVxTS{~i9259*n=l~|7pZ2Mk z+xtJ0fQMrxI{eEml2f72} z9+poD=xOxl`DHAHSJ5Rcx+FRqmC%)Fh&I$V#5b3I&%&1!|)4Hdqk{q7A=teU5%Hzr$qw3H=$8aaputrO_GJ zK@WRJbj5lvi$@(jLV`>89J;g{&C*a6mLYI1J$XJj55ZRCZW^)1k!d*cd%)315pdfmfN}>agEzez{o-+Rum-v^ozR(&MmwAt z@|U6m-GvVHD|BKfF!ASqKM?Q`{fXZ1)UQP|%!~7;WHNbSck; z^ncL9nQ>LLlKIiCtASp-mcjecc1B_1=l^5^{x0_tR>C*Yis#UgUqfe_ZFSUPDRiZ7 zN0+=Yy2RbFIF3Rmun^sv)tCYgpr`*ZI)N`&bN?OLNfKPr-_aSQToc8!qcbdwc2pT1 zNDK6^-H+BAhz@iV`r~{G*1&hLJYGfXm3%!KKwV5G-spAiza#2Hg1>4FME7nwdRSJV zBVC1lN;jZ~bthKDgXlnFYa?$$S0+2U5(Uxv4bksQ3v{IhqZ4{EPQZ>AqaTd-&|j%O z37*CJ#8a({&Ol?dVsmuHz0m=UL=V?w^ejzBJ6eSf;63zqeT44)S!|5)s|0MI-ulS4 zXhS{GmFSP2h4E;Ev(S#$g#35V`d^|ebQa6v6|`QFH=@6NzZLy4-VZG|7HKaYn@qsN z@-n*jYta$Djqd#?=oXzsXZ{1)P;5hVXmg?Qs_4v{q7&$iwl@&1|0p`p@ge;=EaA`p z#RP14FFN8==ykh-?(JXb08?&^%!YPY7~Sh?=+@OkSF9P@UQhJUjlqHVJo>}#8rH&6 zn;4k)zc&FpegLib7`nuBgR9U}{x&+G5Aja?6dPfI&C!qRp6JX#5(+NFn8_*ejgnppT1XI5m4d51Z3!0)^&>mg6uIQ~A zg0AQ+wEfr70UiwT@89J9JL9z5qP@$5?sY}9fja0+dxrcc(WPA&;%m?j_n;koiO%pZ zbU@j*NA2ZDCsrE$;59)fc3+%;6-J^2^djEQb!X z3A!Z%(GEwVD?AIG`3AJz573p1pCI5!&!Qb%LT8fUt?00oM-S0$=m6W{9oP#~;&Sv* zt_<-F=m58%?Y)m~!3lJw|3t52y0;Spi1U9G8jUO;I`RtWVY(fic>}a!hhT4X#fGB; zor2DA4LXsJ(3yRXF7YXJCH_GNly7G=pvsut``?0qr?gwJFFKo*^I^Y$-E$G(lMOXS8bj8l26Z$6}67s$uEn!J?@9Ur= zya#P?AbP0Api4au-OIIT`3>m64x(Fd23?`c=-&T>*2}XuYOg%HHSszG9Lb&NNP7jx zp!akpdfMlqOZW!5r0=7L_GIu3+TbrC{wLbrf9L@6d=S;Ig05&2EbY(#dkHwQCqjXj z&;hMQm+C`wCSRdv;#+hne?c4i2kki9zUb`aM^~;6TE8`VX1byS>5mTV@kBoN?HKxM*(1G+Qi?@d%d0n?8yL zQW+Ef|GzB>xW|35D#p<**bveWpeyqudaY7_94&QmwEUe|4aeXdT!-zj=_k>j3%-P- zi66$n*z!QMV%rXI|6P(VNpJv{(51_GF#6KvL{E85tcZ2c6&Z{Ua00pl3(x^BN53EM zqFeYqy3`lYaw!i*E0hu4k|Kw=|29;G1piK@HG1kF4vs|kcpTc`40K87qXS-v4(MI< z+I@kX>ey-Y%w#?swO2e?7Oh_yJ%sh*1l;q^=qc@sj`U%4FCRq@*K~BH)}Wux56~H0 zLCd8%5|zu3Udx*3%ch z(3y`xPw}gmj0f=+ynqfU*XPlI%c8fcIu^&fus)7NS7Iv`_UHdD0$!(6=;8YbU7Abi z(&hdlT8aGV%u0uNC3Fw#qASx0Jp+Bv2@DPC&!S5{A05bgbS1vP+Vmg$gMc%v_GMJC zDLV76Xv0H-arCfGLzi|Xy0p8{@`pqI_h^SnN23AdMpxn%w0s@(Y_!J2fB)NqfQRf6 zbRaX)Gq3_}XbW2LBXj^?qXW1a;#t3n%9leAac%VM+=*^kM|6uO;xJr}Zu!l}xc}bo z>c^tJsfA66k43N19<-xh(L8GrRB^PUikN5* zlZp33SA24uKy3ocu^oPgE%CN*qHFaydYCq#4Sa$Q_*-;KE{1r@lhK~$KnGSF-KsX| zAs&cs$q=;uW0<)A(+JqXdh`%|gwFIE^iz5nUAo+-q5%{{Z%JkJ8rBT)p6GxEpoi;G zw4g1}RlNUm2>1cokN%YUC(4Lb`7Zi1oIY5c^o8gie~#5K{psjG z%d3YyiBCfZ{u?GfRNqIZKPNi#BIsGFh~9=KSls*HgMjz;NwnZhbmT7w*JCpAUFiM& z7CnsVeu!2eC)Off8$BzdLVP(^vOKyKInG39r6Rggjj>uI0-XrBWK+;3T7Vv^{pe{u ziC(K8&=tCX&ZOjz(dn)`v*+L(aZ7X}#i92^cl}}X7>+>i+4vBjgr$g2L)UBzCN>|P z+BfJBe?mWT|Da2h^K6t~1RX(nG`-PTF0yNPS4ilNc04G=N1y|IJU9)@5}${ju080f z`UoA+ry+h8y}%dHHT(;mVD58~CD5h1?OZ%s!Z0{XQB6}{!h`&I$#On zeb6&kODw&zlj6zfK`-J?)+g^{*j^Ft(pMLnv{Kc)Sw@ zex}jlB+e&c67lWCpCJ4mh2IVX`<)8a2~VKhljO}KelvFTfbcv-`gF<{BixpEE^(hc zID|5*sGFL%6KOlC_buuB`9TtU(E^M#BZiP7fbDujX$8R^W?xeqk+erJGdaIG&6Jr~x_Xv5lDEF8DM_PY|hQ6hvU&tszq4^ZP z4|kIHC22Eg;4i{&ll~duWmJBZ@)t;(Ou1yzjuIX~*{=xSLb;bHQ;zr*(hm~zJ?@ufr8Bddtg9>g( z5#DLU4={))2(PEIU$^T|3(7x6UT%Dww;3Ibq|6+={#*#Ne2F$cqpg1AUw@WR?ye9& z?)|?^&KfFg;C-F9XsFzag3pFqvEmj zl*>Y$L!_@J{4(XL@IFl0J4pXJlp90-=P6n6M@eiJ68SAAR?fzG=Ye-m#_+VfdV{i(d`NSi?$jY*H=FdR?X+thjX`u*dVgV@wi@iJzo z;(z!s1#{pQ8hns&7c50Q9q%Ou@&jqF(P$aUe@Ghx(WeUGVTAK3{|tNIS&)2Jhxjw;E;Q`6zH7vnWj=p9Lgdf0l=i-=snw@|WO8ykF319}0D$-U7<( z4&}CzHh}yll)Z58KB%vt! zT%}+KUY~j)Z3W@%gey?)`tvPihSA9zyzv`4-c5m5DEED+dpF?`4DwdWj0%I=V4m~e zKxQ`*%iPfLGdDD5XQ@NpQ7TQ~9mJa|4DdGc#)tAl=B%(S`L5y`&0>;hIi6nT{1J!(Ql#gKX4{x%7>XHk(ZOS)x?JqF3I~7 z;hJ>j^I#}vcp2|f%8ny1na)%4o+SS??cL`0e>@pIiQI{s$#|c44VBv9V&1J(C>jRx zE3V=_O1jT*I)00K*Pp#%cH2pRiZ*`<8IO|QBh(od(q5pQ5B)ZeAv1%ccAdfdwma%H);pB1;Xg?2N8))B?xDb^G>|f6+HfDze1?-Yi$-Si zmLu&Y>b%Q)Z^-XL`ir6Q&XjFNcp0|kElFMu1~Z?uQ-rTSD;&JP=hvhWe-H3^8<*cu z$Ta>&F!6kLL;7jbTGQa7Fo4^zYAAP1fam<@Qjn9C;ae(^`qAV?^w6%GM9{O-dqOAjI4GFVe3K zkrxKXrIGLON#gHQb})@h=KYnjW$-+CQwXo2-kX%2 zLENVz;l-iD)r5;t=K7O{_?PbgR^Cs@s7iuQL*iRP!I7kmB>p+^|7d(Ajb$Q!{ozlz z{>L+lSY_TN14cv`ALg8;I^G9ej zEsdn$?ML23e2nxR_$Gtg70T2let@?#ZO+1-)c=RKBz5lOy_vLZ?tf7#w5MWAI`gsq zAPRg({9eq=>oWwK+9+j9(x^{G;u%RVO4;X0_c7~d!e?O3dWuct96z(T9EcHZ*j_|NzMF^ghFR2w3r5$ zQ)m&Ht9btj6)m!m^d#cxupW)iChY`e_(S3U@tg|-zXfaCmM`IgVPMw_H>chsuK(v0 z_=$#7(%5ivM^G>Y;p@-F(4g@lq~Ai>G1!`N?~!+z_$u1?n|IO;^~TXbao+WmIY-?F z4wUe}p}p$H-Tx1%xRgewk8(U!vV4|!cfCm-LC zUL@4%K-!(;r{q0D{Rc_^06)j4Xk$0&PZ0O{gqJ@?k9|O$YAKk1VIrqO;}$4OrCOvd zq`*7Gi;(A^?KNfOzmoTJD0?^I>rY+Ej$@TxC*c9or`*uq^W?oq+6y5qcc}MBBJTS0 z)F*PtrQ~^^3aJ=Cej2Pv_3w)d^Y$nG`m>vG9m?E?zffli@AYRF zfia=}>(u*=H?jZC4e&h8`yk;8cyAcY6f<~c(a;jo%7zB|god*cpG;@%LiyCBrzJd? zS>B4bhVr(tgYdC1`@5*Khj6?b9hN7v8-?Gp6i){-@4=U8>>*4a8u^-ZpQovqpLa|Y zjkTwZZ-}p@+$qv(5T8K&?J%e%#BV3OleD~quRjA*#~zFwAmKPE=WZD3X*zm_ckK0& z_;HwV8ydOsSxLDbVPNgZn@PAe1v2BKw7C#7(8nU)M78QExkG-``Na4e90RXC!$^Z8MhoK(L z#2zDDk@QohV{P8ngp;Y8{f3q45+~yk622j`6YmQ&SdjN3jdZ1vUgY}}!#^o^3_lAE zycY7z=O5h0J|;asY46j?_DsX+N7&4sI%$nxQSU0{YLoZBp9e{Q%|G(=X&nkYOarHh zcf}&S4^ij~X5({?@EjU!Lj1NUDVBqJt%wf^0~|!1y9wXHyC&32L7LBh#P`rf4c=*? z{PpvfD6pQ4SrmGg%m;W!{@+6U*;trWKRdGwHD03p|9|%WIRqqpV7R>Ny|f8F*@}rO!z48S2XqxX`e;O|KqRO zh}EH!g|st~GUq9ugR}xSl&VDjJ>(6%zW%jIxP`Yb?>s6Vq=VcPc!}4iZ_scr2DOHA zvyAY(N(a}Uj-*c@zMVGqlUSB_F7c(*Z%A4$@}CcdUn6{{zw-J#MWdBMLj}oLM)(6N z3}qmnM@3@K6Th9jM|sckUVk!D_h%wEk?(VyIv?@++(A1fqF~~$jfiIs{hUzy??vJE zG%_#DvP@{`dc6_Euke1zn~k?>$f$wu@s?pQ)u`|D4vki%o!3cwE~I6}2GqMRbUZus z(~^GUPmp+l_hu^WAmJej`rID;fbe<3rK$7-UdFM!od{pJVHK?7KlJn2M0@YhR=O|% ze-Y~+I^97yZ3s_y{#$5hBMtSYVlyhur_x3W`OGFS1Mz=Dyc+QeR8A2Zu*??16>%zU zG^c)Z$~@U3w3?&qO<$3W+;C@>GzZN8Xl&jJ8AE0@+#mnIF7P=$&WuB zI_bT-4$lmCXBvAup}Mspztd=2dB}|$29OVTX%{{2wL0WKgsAVs+U8%g+xN~dYur#RuBxSse-{MAGs8uIzl!O(ai z!i6c5hHx@(-cWxU(6=8Cli^<+m`Tp98Mdr`wwA$r=m|45`0?n&Lr(jXy6;l ztfj$Lq<5zBSi&6$e}K=E*DQ4UNvKa&Y&LcK5O2g=g7*#L5AnW59iLR8?J$3qmxLx{ zOrYa?2sftDr8HhSH2xlG)=h~kDASqnc$`X^+`LT*`{bdsy?9q5#&?4HSqPUR{fkhh zKMl1ae#XD$^~uY-nnrvcql2bYYRG$)a5^d-!A+Q)D8cfRx0m?%5Wk7Ky=X8i@As4) z$~!N#XOZrt`#j2fmG@QZ`>gekyay85LWKdmSqQ&R;Zm55Q63_#NLaF{3O~t0!v#Yl zf0N%mWPVKE1Ejwk;)jW6qm2(p`<`;w81y^5Z;+mY^oPCw5AdcX(w)SEWcFqN<%wUT z(kdEyC5--(Wq4Cj?kCckQ13VLHxsU6-B9jk%KS(>*PrKUXD#{sFZK(0oel7upnSY7 z2|izj#KnX=5^fwC8%6jn%1q}yOou)#Y5X$z+X+`7y#wj3a7CzNnWL1M$a_2K-}3tW zOSvjhF!8S!)4*LPy((|3ms8A$~hypW`=l^hJ~uYfG6D4E7P) zdyf2Bq0ANr@p+isH5^V45E>{X?#2d4-wBrybj^lNvlUZ6@~8( z9i=Bcj`xeuXnGpULK&ZNl+;QXf($VrCJD8e-f@2279RCt;ACxn~fjn7iz?}vn2$^V)7lF-KU#P8ts z$%-e!%s*z3SxFm9T4lmdCfa2EOOVi)Li^~j1n)&M-=eX3_$}`t@=BB5J#?@u3}yxC zzmPVSw-0Y+(#KKmPdcfL*Pqu2)T5n=%8k_yeNKP&x) z-=3eBq0*p|eMSu!HoWJ9!($DG_Ub=iM4zF_|4&+Ssn&gxhx8nlJhV@*q3^!dXK3jS z@rB*HO zMxrts|Ig<-5C50vcfOvp_p$eJ-gkU^ewPlUxw0=!{7CjxlVUtaQ^#WYF@McitZX`b z+SFL=>+!MJ9NdbZ;nNdhvE^8HVl1`=f5uWcmsSemuHbpRm3Zd2W3dKU1nDC77#7DT zF*z2C$KD`Nh=fnDDDJ`{_$OL0_vBct1lGe0*bQyy8O(|U&;g7_J6wV}aSLX~Lzo@^ z7vle5dg2+U#A2D~KbD(-4Hw5WSQ*RU?U)U_p$$KedGJ*<|9#AeJ1`d>LI-*g9a!F} zu~-KzgB5Wk-hwO834DfW=s)&FNZ5{Ic888QyL|1P5YD95tQwFHc}>$XJaw_!ZjV&*<4Wi*7;28DZw=fGeRL z)k3%69(1PNuo(73&T?!DI*|9!a%)5So*AsaD{z>E+wd23k5bKymMT3uqx|Te)j~UN zfcdc*x+2{$Ee=3C8WQ4DgYTjB7N8SZiVozfcnBOp8~6)7z5j;v9J8Vsmqk0OgN3mb z+R-y;y)o#($73>1!2-A%o!}4XL{5Zw?A>Uk{b}V);-il4IE4n4~&~{g1W!#CBkH?bUiwa~$_p$(bN~>T^Y=SP; zAhd%CSPkFB!uUNp^UG+xf3P!Vc|R7bfzMzioQt-+@xx$>_?=#0Iz;9q?5wiRtI_^~5UJ6rV!R(5L9>--%W6_NRvr7NV#5FqXh;XoH0pM0;Bwt=9*WaV&av7NRS50`2%JI^j$U zqX`vX$oe-Vp#cerdy5vB8sbYr!EKm<^b?p4f5*f?ur%?)i=q$K-FOS}w&;p>4E95> z@2lv*XQ2J8i4$;X_nXT@>YiPMt zpF|zyL|32^n%)>odH>sljF-`wzlqLdGCF`c=uFpOG29*Em(T_?Es3@!8T}rVLnqJ* zi(_YWpd&F2evD~x1s3rBZy->Xgdfq7r~5Q&@K&^gLg*G$L6`DQbfzuQhPq&S?1?UE ze{^r(#OydPxE4M2J3>6gQre~eSWW^qSUOlAS(?}b=nMv7TYL{|;Z>}JRhC5q>WUuT zC(*MsEX1c{X5!1y+p`(HRmaekPO+TzcZBH(SRg-U!P=MuTcAt!C_1AaX!$s1!|`aj zIp|8PM(b}v%kK&K|3kOtKWv7DS46kx$rY@>9luF}hwNj_gxk=L_M_M3S9ELAu8fvC zJKAvpycMgUpWr*u4tk<9{S@!SJ?IwYT@{rthOSJlRjj`QXhwnqcpRPCP_%;y=;@vp z;$NWyJB)r0&Z8Y&$Ih5 zcKjQ9?XIIUPhJ%E9hXcpSuCUl@Xk@n)T{RFJ=YsmNm z-P6C(2C}Y?C4NV&j?SPfCSz}OK(C`KHyiWdO0&eGQ96imGL;hUMMSKl9z}@JKPNL;5qV1&kJlcYsXt|Q;fa;*_HbJjxN6Zl? z@H_$cdMvsU)6oX!pcR*)4X;C2WEVQ4ztAO5+87NiE4mUT(Sg-NSD*#jaSycPIF`hz z7le{-bQ>i7Qnq|hZoT;$g(-A zS2S1$lSzMIGwWZDz;h({shy3*@GEpB&SElN#@d)?OEiNA&>1|8u0%I<;7_3+u$Myq z7<45j1m~awT8`G+8V?z}u@ni%FcoI_GTOte!2)Q-GUy)HM>}kTu1Ht(@V*q%C!!O3 zKjiPi62#A7Va)PXI17~txWsp(hpaQYg#FM%_7*y$8Q2sTpaZyoMKI0R(F&D8JGdKd zr!U&k2=qHK7u}LC(5*X)^c#=;PQWF)WouM07usE-ous7PkNKA`wqZ62g zsc{+F(OPtc_M>OxG&-OZ+oJZ0VP5Zl9Rlgdco38EQM7>}XvG=mwONJfaSuA6AF&kv ziM6o6_Nc?QX#L00l^TW)a0=SbB6NjTV&dojHUlIaL6`m_+CkQDqKYMhb+IDp_v0-% z6pP^~ERGA&71)EW)B&u67t!`Ad>ggj6e|($ig7DUB;bhNL1+3gn*KF9;+n$ zX-CvxesoEzqFePKTD~{>Luf$AAA=c*FThN=3f=NAcd-5$2>cKV91j`4V;a(vc18`S zLzl2Hy5}{}jvJs`(gkh!DYU&8(GEspd7O-{)E0Ci|HCp^a2NaU-ZkG9{kl91QxG4C z4qy!0@muH?eHdJWS%~jI_xcFBb=T3Q&bvDrKqYi#??4CI2Cerfx`ln>1YElQA!8g` za0a@E^Fn+hI-qZYd(oL5Mms)(g)sG=s9Xtjg({%!--lkqC(!m^!DNiTK_DA}Pp}eh zLTB^`+HltIqBBteOB25fJ@tLj+wl&%v@6h=9m2BsE821Hy;1uW(Ji_It#>byACL7U zkW9ibwBz?NGk%T^U?)2BbLfo!!UmZ1ee{L91CxnAjoI-HwA_1G5ZMepWPI5$&)B zmc{z$3iS->FJs(}Mi6jsr=eT08NFsdqf7TcbOwK;dsyf|lwTfm5wC#`8yU_u5MOS1+i ze~b=v1-fFJu?!wZ`^kJLYA@d**58JzlHj3ejLxV%X2oaFEf|V6^cs4o7GOR64lS4M zaP&tlMX(X^_UJ&S<83$xo$&_raQ_<8uf+-2K+Yedfs{ZC)IgW6DY~Q&V{Pn)O>q{w zmnYHsSI{j;cO;rXPAo*c96ErO*cyAFXJZX|c;g!hIK%JJ29E~+z=p(A{}kF2>IKwF#X3)5pbqyk4Jk~5IvOD z(T1C1aeNdV&otOD+qXf)}v=& zGkV>Az~*=!ZSeM!(KTv<{tW1YUZ*MOl74_5-t}k)-=g&{pl9T7ERR`FMH8rhiuJc* zXA*2^AXdPU=n^i+8n_EBm*#Y|)+2|Dtbn2eudTKo=6<6-QCseg^iJ&txf z5bNPW^i2IPq{ma8jlOI(F+CY=u@QE`<~Rpe;BQzEKR6eCnm41Te=B5l{dvUa0Idp)HF&nlFb_za&aWjSy@K8-eE6xjUz^uggp{MvX7Q$kGL|f1V zUCR6L7VL=*^cl>8qk~h>J)eiAa1nZT_Wi;7XD4ui1o!YV+EA)Lqj-9B2D#C4$>@Er ziVpl5!iOTGU}NG`||=!Pe+Nd!aMygC5EO=-C;AZr$7Hz-FTp_ynE6dMxDq-$B3%zhQa2 zj!m)j_2|$2`(Rn(Ut&4Dh{dtc-_epcMF-FlJp*kpA3ls8=I7CYPr@>|6y54076!kCMqU8(6EBDEU31Kdj|BUn<;S3VJ{1e#Lac<_(0bR={4D=Qx1q?t z+OH%3x7nnC|4{gai5!@1L%Os*d@e=VFTi$F*kmV zo|U8MKu@4Q#Ln{f--*+D1uK$}E-5K7klWEEYlIG{ExHnY&;}-`lq zM6YqK6iJEiNpi3bHYB|*dIsW?30QGDI^z}S_1TKv=Y!~B`Wfx$A9Mh@QYIzNL_u`# z>tIv78?FCV@IADhrRYkmK_|8cX)hi-MZk{#3k9;LiW(?`E>Ruy^fyB*_QT3J3UlCU zwA>DKfCtgD@&|hDl5U9xm=)doWOU1_VB*jJYK4r}=&9|N$l#|UI`ir13|65HZa^E@ zfzEVqNI!`si2sSMXuj0ZfUBcR-5fn*tQ_02{@B}=q(tH?%f1*$!4GpF2`KB z6MNw)ERC(xBqjcwZxA}LRp?5sN9*lDSNLr3KlC%h09& z8m<23_Tka(SbJzwne`uz0)Vf6TeWrN_26v((KY*U@vuKC0Y|*LDfX1_-1Iv#NyfS*0 z>Y??Upc83_iNF7UjzCEg#-k%$gU;|U+VOR?;ajptOPm#Lpe(wCccClR8SUUj^pK7V zPC_R%110`AfGn2f)n4P?1B8bEIJv=&CcU=7fFen0vpY=>UIG3Wpm zqBGuruGE+4fDeZJ%jkg9=ivUk$HfR(u{nAcI-(=(h0c6<@OAX?O+^peTy)Deh5Ro= z{%&*&enJo9pI8ku=xy4D9>RmUxc|=Z5(zGOQtoK4(qUQR+0laagAb!i{yh4v zpNGzLCwkpZ1pmShiKot!l=ziv5xR2w(ekH)*W(17dDgs9MoDy!>xOtMbi`eQ{m>Z> zM;m+xU9tJ-Kv#wMUUUVIqkDf99bm58qV`InXDVKkKp6rLqI)?6t?&vuu-WJqtU_04 z3%d8;q8*$;2ly|#HJS581IdF9v|6wwdT6_$hrK6q2I8^d1l-%n=&4;2T!l8c0iEeq zw80c?meeTIk5z zpiA8o9Z+BNdX7RnoQ8I=99_z<&=ow24)7XUFI}N%1qz}Qtb%T3Lv$ebVB9ZLI|82O z&S=F^!RctlC0HFdU`hN79Y}%XsN-7bKw4u}?1fHfR!CoquEbs}gcs1Q$X1y9Z-uIb zqYp$6oJ@Q=w#I5jk`jOZHwp(5Uyr@9R?+D6euxfaGdh5u(3QJ_e%NBgqC;IAD-tb@ zo{9G80DBjUNB4aU365|)IuPw_7FkX%C>%vK^YH`+h}^w5<>_q;KBC|jcgeFPn7 zcl4gWgs#+7^h>!6ok09&0v5c8budlI=o&UgXWjx+VMny#E@=6l=#1l78Q()2+>3q> zPND<-3!Qn&Qqe%OpaU<69QJsu1_Ae`CAw6D(C@$-=nA}zHoOQuJnPYNN6;BvK({Vq z>F6+)M$;Rk(UoY3 zmVX#M8@oWIg;UX6bS#*$QgjGwpog^)di|cO#QnG7aU@j5CFt*d zC(#+CsvPZg4s`Ddpx3b&TCWURt`&O9JE0BtL|0-smdDBHN^L<0eh?kt<#@;_TqQbu zHPA!U5^bOj*2gD8d@d#vUyCmJVe|}K!`4`{YErBvzKY(eAJDUurdrfq5p=*c&@GAI z84}u|d)fmX*+6t_-bYXI26Rg{qYdmq@BcBhgIlUcXDAt+X;t(~dKbEKJ<$n0i%xI^ zat-6LaUo$jI-+&xKz5)V9mP5LJ9-u-)ksSGA@U}yLi|^BPYc$Jen{PirjNv0xEgEX zMRbeH)QW!Abi!8N{|N-TkZ}whd6V0tYttS*{ZF7X?~k6^;plCchF-^IXt{$S{WLoB zq}tI|6~#MYbh$Al z77p>^Sc-T>bOj$m2ihB*=@4|luc6=m8R&{FugCqjz$OwL(TV5nv0z0kOT0EZk?!b3dZPpCAL6f~pYHMKioR2y`|k`_lAvFqOZNl1r0392?SCP? zP=ln{0^-%t)BH0!v%jzerfwK5ad{j~yeoS6&SFz6c1JXkp6CRhixaTJVaWfBP2nFC zi63l~6kCXW8Yd==l}+y9lnQ7Uumbeo9{o`4iE--+-Q#Z_p(_jt(q+^Q6RoZkG=$ z5+8t`{<-J`7NKWiS%`mziU0oZ3j&UOcPMZa9mpB0xB z^U)>Ugtm7IZRam^h0@#|O`rfekTO`r`(K5C1s+6Kq8B=&x6!4Xi+=0ZpdX(7=#pMU zPw_wKDbL$78c+pvAkEMv?}c91foMN3hx7>;x53#2Y;Y}lIKD);;1oLZYv_p6-xGC| z9o>SG=uGQlF}w%;KJ-ObW)NC#Qb=EjZs7{_XT}%zaR1$-BP6&~C(s#PLia3ttEl6= z=#S09=!(=w@A3U;M-PX1zu+Krz$4I!j6(-9JGct1zq3_5T9W-C<2Q81x7-_bloS1y zmqI&gfmZB_4*V%h#=htlO+aV31f9tG5I=~n^l7xcr2C>3C>kf=VXBW-Y>UpcE4l(h z&^;T4Ueg)q7JZJEKZ^I_Ic$RU?vJ))7~1YzSQ+P|``q=*SnNGvAHY`vE)SFIWRxJP`fR8j5!CDLR3#(DFZ`13Hftz5j*VL`!o& zdMJ8f9UO@^xCtH5RdhyKAB;|SDKy>^ZMYjc;O9g7aCFPw!DL*9uHg50Ctkta{`_yy zHo9)@&^>zsE8r{W43-AJMo;^X=zz`!Q?`p{cpEz4O6XqqK-(FL4(tC{BPC*;pYx9Veb3pbz>I*8t?6LA8b-n@@Sho~&t;2mheN6-d(pnLWL`Y$N&qD#F2 zEw>jfcLeR|Jh}quJ4fjS&>!0s(DZib#N#~)IFo15dpa1M=|uFKz97VRp%qV~TXPNl z9;EIPO`sGOCte#JXlG1=qtP$so9LOEie+&nGVplpH~||xhjwrk-GYpdMN65C&a?#D zP#tvdo1inj7v0;QX#HWqN$9Dc7vhJ}cF&{jrR=KQzdQt7n)2uj+G1NAgthQH^wekU z77eH#`eA8|9;S{V{yh49cmtj3O!QWLhA#DCbb!Z0{w2&p|FIm8M<}OMMpY_%bH8rbqM%PDVRug3k0cyb~9q_5MK1|BJ3n_9vnN6h;To;0f-(Gwwiw z9dt!c_X{CD86DU{^o(pkJKBz&@mG8lTRxc-n~e+6FKMfuNs0g5?q#e)d3c;h z_Yiv6yYz}jKNJR#;9gEcN4yN(^RLnSeifb3zrl1*MGfUZx28a_V(<=hzz?7kdK6uO z!6AJdmLWbh9uhXA*Kikl?S4dOo}zb@o)cZNBIseNk2cs8?Whe}uQU2nZUoxiJoKzA zN6*N5bjA0D^!O11&iFLiz;*QgCqEsX_L`VXydFBBPUzA-i{64!Xb112XJ-+j*RdSte=a%;&7b4`d+7R*;Psk_$v6uOysH1%73e`f-Ml*CkkD=|og08?j=vFSrWPko|AmHIS zif+L_XuC4(EN}v<>J@ZpXQ4COjAd~z z+Hq`n)IlC}i^`z&YN7cLU^4bX`;EUwz(Y149l$Dd=KIhYAHfFrKlBS%=9Q>{cIZ;S zfR-DJC2=x3!wtdR=(RkKmGLTirpk^;e9+>tY6LvR?a)2%f-YTu^t!x-MR7{V{|sHB zUFeqm4=tB+Wb`RdkA5k$pcAQrwqG0lRjdg*(XN=spZ`M%c<82~d$kx{+BIl}ZD>Qk zpfkOIcK8okF4d?go&znH58aZY=nCB%(jP4_fNIOg~MzfHg;S&A;*XXp%epnG^B z9n0Waw4+mK$A6&hWOy|?6Zu}{{yU?}B=`Zj z3;i&(M;m$sZFms+0eTbd@Y9gL21^n@5Ym&zMk|&MJ#@Lz!(AS|1$EJW+Mxq^Vl4OH z0xyu@(v3owbUN0?53wo!jP7O0*P;e$qi5l6bOPJqu5wBkhY0YyL6>|yx^;`tFXT#e=7-Ul zpFk&c0iEcrZ@G2cztRLe3=PqS@5AEQ6P@{+XvLN2H9LUr`LF1}Q;ZLLigyq%f_~e( zp#zwNPGm-iZ$xj;R?P1G-$}shaSWT|HFPPPOo;aSUbLgG=uBQfmvjVrcxR$pun4X9 zIeJF6qxF75C-5g)FW1DVor)N*Ktf#tE@3aMfg{m^>(C|N7d(M}nlGXaXPy*wTogU5 zHP8VzLszN|I>7Gefcj$t9D{Dv)=Aud8~iRLoJYTWSJ8_3-;M@S7Cp61&>7x`HqZf+ z@o}t%Be5>7#VU9OYhl^R(H~HD!*0ZvJFXX^EkJ`eq{9YWi`7AMe%K$>aM-nYON#3!PM^6qz{ zPjd%!D>|cx?`ibRj0o`==!z{v&%zgI$NSL3_B*Fp-{4qu zrgJbEKMm>Mp-X=j-J-wHL-rqfX0pwU(yO5ZsE>B^U`X$U4!l1mCW3{%|KkWa!o_IC zt>{dSqI-G;-Ls6dqH9zZ9l$;4x4j)&uM;}J{^-C42j2|77hHz6`z7Y`{vR}e7tp0o z`)<@xUMxhs4!Q*$(1G?q_jD*a&{61FnH5}&{y5)&rEoL4qUX@FaUETW%(J=wHk6Nm z35C%aR6q;XM6YKHbVl9L0la`N?fBq4^fs(V%byA9sosm?w_!!nYoP6RNBbH09{1m+ z9Y%r!n2mliKgMKSf&LKr0bQ~`(HW26UB3(dtC@!($eT*t$?mvvk<=r9e8(ishqwx&qgNDL;&6k`e9TwqO}_AhpqkTB03xKnM0zh>r9;nbAA*xR2Cgr9dxByVI_PD ztv4g&FF|j^W^~04p(}L`6Mz4Ig@7~7z99O|rz|>y`_Zj=6jR_ZbjBml8H_~-HUVAI z`RD{zg!mS;!#(JsK7kJ8U-YcyT*&>mV!?&cOv<7^$LnJ)?1$xXAzJYuI)Dq9jF&?^ z&!Xs8tb*v)HA2tI!{|Uep<0??!O~hN`iidF3lD!j=RtXE}Y!h;MrcQ!&;blU z&xGYYMANY;E<|T^F_`j`sGS_>O5{V&LRGZAW@yKqLw>v;0UH>LF41%>i}TQmd$BT} zL4V%gwj?T75pA#zdRE$?d;b_Zz-Q6DABt|-1a#(8(RP+1hc+JjIwYJzXMP=BiQJz? z4HiTjD31=bYDjN_C5S(OHvA$w;ECu`&qKF#5jwyX!OiFZ_F#JN|7im5-9>cC{ze!V!4lMVwsN(`?y~^kk-yQ6P9`a|=0S(4xI0~D1|9287g*lc- zho>I8ln2A4I?< zAB`@}8)(CG(8ISJ{SK@{8$KHHFQZ?)v@4_AQ4$kBoY1q;9lZ^4^aC|5xC$M>zLng6 zM}D0Iw;=VZXz8+|*QzMGq|MOl*99Hm@DQJZ&Ug*Fb=%OrK8Du+9qlN`>L~wqbY<@k z@y@Hc|L)ZbB-p`NbcT!20c}Pb+=0&QF#5&2iq0&{ny7pkbj9vKXWkku*9&cbC_2E2 z=l~X?16&&?;0%94M|u_Al7efa4$GiR+zg$0ceLS`(3N`&9q4qlgAdV(tVa*qQS=P` zf)4PO&!T_d$b~71$J-OI;3FZSJ37LiXoCaM0ltMU^#b(NuSEy25gph!=)iwQ&(b+` z=6|B~(yWWjjjnJ>WT5d_eFDy~Gdhzv+VB{3i6^2QzX#4k~Thu-w_pdJj8yFi3Oh8ZT4D<`O7M=08=s>;;>A#}`NU3ZY9?9UXBabjdoR6}kss#&X0bV&V*- z<-S1=-#+v#TtW9f)u!kW=0M9=LRY-bChos`)i@Mr8GHgA=_}|!=AbiJkIr-tdYVt8 zdwB&v#B5(g16_r#%uclYkHL!}Kh5SSz2N3}w8vFLLQ{0a4+ndqTk|5?;CS?Qyo+9| z#UZ{Oy_N^jz5g8@V5Timdj-)mRRJy665Yzj;smVF9bMw#=oU;vmuN1!_lwbr+t2|X zMVI_{bRgHzf#&)$vI2T&??hLqCAxx-qboWPy{7RAAutVXaCV36-wM5^kDx2r2kq!JwB0G_%D#twXI7&F+>bf^`Tr*YN0@$VG_&mJ07{}A z)z6uPo=(ehid8vcXv$por=6a8uR zHmpIsz_-zVZr28T6W@WJ-nu)Yfjo?M)E`~B*U>NA+vurYixqJLx+3S%B~Q6CT7g37 z088!U{yVa!B)Dfi(53Dd3XVXR_H}ei-bWi+hW-2c$_vhRvkv>-a* za_E4XqPML5F7CglxH}0Rk~h%?=LQ#{Te1{AbQ{qcxs>p+oFf?Np$aCK@a2XkiHfz zw+~(7U(lKVgC62Cdy`_x*cyvsKV(4h*kl5ZcoEv*YAlZ5VMDx%u0-wcqX9KWuTxj_ z@byMlra!uJQ_z)|flh2eh<}Q%#OLVB?8l7W|I-AV*`FaJ%f4vI3!($5impU^tcwHD z8LmLLW*a*5pU{Rc29th>4r^BQY?VV-wlP}1jrsH+>p{SVhNGu)3c3;>pcOWtXJZ#8 z&H{RPE~5jgZW?OGl%Jbs~EGzC_#o39DktL)?GA$u$o}BWjE8 zb$4{{`k>eGd9>mnbmZ@%9ejc|{296u-(z|F1zm~Uhoga)LkHL#y#@V(V-9owJw&re z@KDV~J6eK?1~HlVFX)n||1mlPrLZ;e$FU`@La)^=N20S-9j$*KI^b^TmOK~YBhW3K z6er-w=AwJG8$HG6&@H)$HW2$MI^|i>!&((RM6J-7c0s?S&!a0h1s%XFbb?FKYq&PV zkD~*M|4P7-{Ec>$`DpZ?+Z9C5!WUQyf5$4A_vdI&TcSUt2BYcAuoj-inwWen+T(|? z8u8b#6>h{XnDuyK;PF^r0*Nmbdivi+XZ}8VYL}q5;cN6d9z)BeJrR}5i4MGIuqq}K zZ;Y1jhMtvI(G_?b>)?7U@BP0P5=xy6e{Y9w#U%8wEJ2s*D|9CN(G|;dDq5jJXt|c? zVSNm}RZpNR)DNA=eDrXCj&9LbO#I*f+C{($`_Y*kN6)|?=%KuVUb_^hqj+j`OR}PS ze>*150y@(!=zx2pU%bJXSlN*OK02VqnE1c{^(6t9{5!PZ&uGWLh4>Y8fVZ59%!*}+ z=R;@G3_WD6&;hj#@m}bR`=Kj32%X@R;Jh>3f0u3*2`=dl^iz8jO^^K&{pWVM(9^sL zo!LGtfv3?W&iucm*eGm*9=>m|DW>{0nn(+Df^E=tAHyWPlm27(6Y!~J3eW8+BJ;7C zw==!IA>GuaA+I{V<(}}|N`4c<1wy&Y9s(YI6^Lb{Tm!PW;1YV=D?+91mokQH`cHZ2f0pl$h^-2TbxlH^;-kYChwDTeLS2L1t3H!7s z{0i-i;QjQb@>5cJ|9JimofP;#BQ&oAZ&^E{v3is{%KHmx6L=q|qc>>02jN#k!_5ib z{QQqdg^+iax}!p0lS#{X3;iz+ogSuxax^%W0xLWIz9L-q{|szom{}t_zl-uY zun}nuDED9J;O0RX&P0AK-cGbxjq-_S!tEn7#2=;Bc~ZRslR|C&WIOSraS|o>lRu8U zPeZNS!)Uh9+IZ4aQg%Yfn?agSInsRkFrx_}&G;jP-z4uo-i?I&qzZdrW{DfaB3zDv zoTKtPq$N@Kecr!$`|+OT%|l+%P<|{vLY>~E`OFIT44RgeI;Dxf$Ka2ez*8%c&mQEY zvu(WfdDn#5)n#!5+Mfx5b&U=K$CQ@bwoem-V zAny>;+Y(2u_!D(9leUGh&zqt13bgqZ@%|y+Gm%Su?_f6)3(&wlygpCSKz)>dB`h8 zxsOw_{IjyPDlFpI04^{^N%w$oOp0D@nvNC+=cH@=>yWLlXsd9YZAYYa7G&Z z6L%2j2TJT$@_c#`-@to;@Q>6lflrzdo*|UI=SBoQf3bH-EJ*`DP|@dCI`nyz_?=-e zMd>U*1!WpRW0&k48@wk|`7!ChGd;sM$kyQqLUZs3>!p`a-?oFifGnumf z(%`d)`kkqt7e7grn17Vfh|0(5bQpzwo+i8uzfHvW3j*Rk+sW@p**gjQ+o#X1q*cQ& zC^L$@x9GeN;V0?D=hcYVLE@{zs{CPl_WwpGv@m##2F`>Eg$TE%@dqe8kasg>nvyn? z4%X7pRPrw2dd$Gt!H?7ME*eNjMkxyJqTqJIci;#r@1$UT(g*PRY#=WSZ#Uk@sMnPI zS+wyqd80`CmT+fYe~V2#lqpABJ$RoZoPxXpw6zAm_WuS>CL;b@fzN&#Xh(xSw@|?6 zLEMmySFK>R)O_E7E$uTQ)>1y&On zOM#zAT!%M5uM@w8N+T)vA^9&dkbS%-NNW~4dgrD(y-0hR_(U2R!Q|3V=S>_<`~+_@ zdEe94qqM=3IDfIJRJwz=WFn1IPNmkogF}2fdEXHJi1$w#Xo$5)^Ld!Yo(thE!D7_y zM+d!lA0gl8Z^CKGFHfFN66s@8(0>ggxf4lzxoG@<6ez>Hh<5<->$sVU1E?^|d>ZnZ z9~!=m*_9yOCmU(q@I`!K~`0F_e2Ll${aG9oo8svI8me8D$?Q?H=BNlQvTn64kND&9i_(xv{g2= z`xo`b(8f!|cTuG$;n}>MZ_Gaf1uE02&s++9;cS)0eE5^kSR2at^rP|R^YQv*!(`HC@|NY@&ztCf5S1#@&;z_(LIZz?&T3kS$3Lam&U+{E zr+BB)*nG3=N$cvp?qm0fAEeDv*rz#L(`IC$+yV{6)h1H1-gcM=|O~#GB)N zr2UNjct57bq|kV3^4HMNdo=zJ?+D(Xc&n0Lh_WTZ!0eXo;vKOC<>%5y z9&c-YDjWy}Ej*NXB{D~l_9@}rR2Ya^Y2*v?o0I3WpZMD}^c>!JE>QNyvy}8s)O(e* z|47V4y`9A8l3owbk{17(%n7_xZ`2CDO@W0Bpb(W_p_9*fA0wWXvYiOucv6MV{|pmY z6*BIo{!!8jhjf!4CEO;|JsM4d|BD?ou!Kf$JP(H1-G~lxs)+BFa8WBk%D}pp4HR25^Y7-N=89a`*Vt!lxez+oE8s1BLFQP#YRpN&5RC z{Q!+L4FhZBm<^A$c%yepj?rVhj=U^miVrtV1c8WS!VC$T*Z zOs2p`WDFwy5*bhP{zck2JV#nxUY~K4{g$+)=#w@$ga*GLJe&6p%BCe=nDBDEkMc_> z`xBYYVX^M9J*-AmyGWaeTJYl)|#k{4dhm(s2vY z3KFkFc-u`K4I|$t4f#3A_qm-8o(p9jA?*d;z2rZ@dx^Y-)F~axPI3RACDG@V;5VW2 zXbQbW;YUc%8!A}tOTtg`{(DneIvOv<;2yFS%N`Ark zO@)qA@C`CAQMj#z=)6CT9SpOyp%=(2j$L_EllLcfCv6R7{vq6jw+88hX!jcF&1mN^ zuHf|#Puo(i9C@!1A4E8@|AWXFN&Vy%6?6mk3*g8q&JPK#C{-c74K}ywd8F~{Xe4i;)%cV*-ydBq3~-Icque;FCFaR zy_d$ChqPtH=g@%9Im+I6o(KcX6nrw2uR_@eLb-w=Zvkm@Y4gt1;r`o55fZY|_~@G& zHT^L0mAp^zuBPIXxQX;Zl=u0MI=9kU{?NE-e-i(McdL=`^rRerRTV2h8?RA!G386& z)PJJbGZZLDMW4TUJB3C+4i?43RQ`-c+7hlwd7shL`HX=TA^sD2--kB(;&$Rb>8N*s zGKZsRtO;fPUyQ_#&`=W!-9mv}=%H*HDm@e$>PedaYIEahPMrnR-ABTc)+gWRIoh}* z3dZgZb>Af4rwwm@@_iPNSJnIfHwgtoWoV!>;a5rX`IK^> zhvm$S*LeRW?K|>M;xyuq6aF&P-HW@aH!Re#jmM(zAOF5Xt@!_P83w15)Gm7?pqRtv#pQ)6&=KaqWMrh(D zDt%AEfuWFTJ}D@CUldII^Ai6&K)tGz{fN9b(C0Vmttb6H+UbB_5bwn6-||)=tqWy+ z8j|)5`Tzg-Cj&FfKt^f`T&Lg~GSlOWH0dYj66J>9V;oZ<#Xg*ei_!P>Opw977??p0agtp@I zsrdqt$u#7Xi*Pn7btSzo$iRXFS@cK+7??=)r z(9SEw_hB>AiY9XTGnyNJTeO5i`RHUF8I5>r6aS2NG7XIh1GCP2-lD{_^G@gOK$%uF z`WWRtAbu~6=RlwIq%Y-tCW^+^2k)cIT*951;1~XB;lDKE)1HjIglmxD(=Q^Hg7`Ny z^bHNqq@#w!pCJ5rs27UG-X;C*Q1?CZj)ZV=>J+E#TPb*v@WGI7y`ubqN#c2yf4)rk zFz@70U@2+Ssc?~adm4O>ysErY7|hG073ZDGKwc)^iu7us-uIO4LHtMFN#wWU_4(=Y0@%1M&K%ew+;!gxDI*)Fjz;!gejS^!CKTU}egtL>Ec*ygqL$jsu1Jd6o zts>oC=KY-bK;D_;f08H}{bLdwCI7}#i@@u=ooWBPe}428m8#ItIuh!KPUchLVLJEO z$(x>dYx1*Dc01{R@vb25^OhZwULcAl{`q>S+ltt`l>3_c!^0q2&_{F9CSwNw{%Aav zzYC37dn1*{)98NE9w5Gh{Gk+n3vWEl2p=cyAKXT{VWED@P~a+U%nXCbj3X(Vi#C1M z@b0AEbv)!RS-+F{0q?hruoZ<5;p|Y^3bo1m%>Ykx(%%d-F{2wth>Hmd6HN_;}^5ps4 zLiwE`ZwwZrVV`?>mxc7Zs9!py=cD`x(tq_QQa?KSEp%?BmNYtq_h%}+LHwbR*M~vpKi~2asNd_f^VF3+a6b`;?`@56SzGa9z^o(AJG-To~Xf%DhgQjv-@r zoCKd16h3)Vg$@oR(Xs~hU_z2}GPugJOPm^Dlw6?sbN$(Nrry@TMX*ZrP!}+@rk5!}KF$$#)1A0Ep zst0MW)98D|^OCof_Z7+>CH_k&Ya_i#dporD{0*t=vx7GmZ*3zyzfm^zY$_i}xwQU- zFET8xGwZ?jE1Q3qv@&Vwqt`YToBZ6iq^c`lDU@`uB3ak+t{nel(yY1`xK?x}dBckQ Ef3O}ynE(I) diff --git a/loko/assets/locale/fr/LC_MESSAGES/django.po b/loko/assets/locale/fr/LC_MESSAGES/django.po index 77dd8bd..c4257d3 100644 --- a/loko/assets/locale/fr/LC_MESSAGES/django.po +++ b/loko/assets/locale/fr/LC_MESSAGES/django.po @@ -8624,6 +8624,21 @@ msgstr "Zones GIEP" msgid "Aucune localisation GIEP trouvée à proximité" msgstr "Aucune localisation GIEP trouvée à proximité" +msgid "Supprimer de la DB" +msgstr "Supprimer de la DB" + +msgid "Supprimer l'existant de la DB" +msgstr "Supprimer l'existant de la DB" + +msgid "Ne pas créer (Ignorer)" +msgstr "Ne pas créer (Ignorer)" + +msgid "Archiver l'existant (Ne pas recréer)" +msgstr "Archiver l'existant (Ne pas recréer)" + +msgid "Archiver l'existant" +msgstr "Archiver l'existant" + #~ msgid "Absent du fichier Excel (Sera conservé ou archivé)" #~ msgstr "Absent du fichier Excel (Sera conservé ou archivé)" diff --git a/loko/assets/locale/nl/LC_MESSAGES/django.mo b/loko/assets/locale/nl/LC_MESSAGES/django.mo index 5c4777a3941a1629cb6ef7982c341565d20a5bcd..9196b46619958529f3a67427e900eb6b5873919b 100644 GIT binary patch delta 37707 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 D8owBs diff --git a/loko/assets/locale/nl/LC_MESSAGES/django.po b/loko/assets/locale/nl/LC_MESSAGES/django.po index 9676da3..e1c4ac1 100644 --- a/loko/assets/locale/nl/LC_MESSAGES/django.po +++ b/loko/assets/locale/nl/LC_MESSAGES/django.po @@ -8572,6 +8572,21 @@ msgstr "GIEP-zones" msgid "Aucune localisation GIEP trouvée à proximité" msgstr "Geen locatie gevonden." +msgid "Supprimer de la DB" +msgstr "Verwijderen uit de database" + +msgid "Supprimer l'existant de la DB" +msgstr "Bestaande verwijderen uit de database" + +msgid "Ne pas créer (Ignorer)" +msgstr "Niet aanmaken (Negeren)" + +msgid "Archiver l'existant (Ne pas recréer)" +msgstr "Bestaande archiveren (niet opnieuw aanmaken)" + +msgid "Archiver l'existant" +msgstr "Bestaande archiveren" + #~ msgid "Absent du fichier Excel (Sera conservé ou archivé)" #~ msgstr "Ontbreekt in het Excel-bestand (Wordt bewaard of gearchiveerd)" diff --git a/loko/assets/templates/assets/trafficlights_import_cross_plan.html b/loko/assets/templates/assets/trafficlights_import_cross_plan.html index 99021ae..349b975 100644 --- a/loko/assets/templates/assets/trafficlights_import_cross_plan.html +++ b/loko/assets/templates/assets/trafficlights_import_cross_plan.html @@ -342,20 +342,25 @@ {% else %} {% endif %} @@ -438,19 +443,25 @@ {% else %} {% endif %} @@ -537,19 +548,25 @@ {% else %} {% endif %} @@ -652,20 +669,25 @@ {% else %} {% endif %} @@ -753,6 +775,7 @@ diff --git a/loko/assets/tests.py b/loko/assets/tests.py index 89215f0..d22c291 100644 --- a/loko/assets/tests.py +++ b/loko/assets/tests.py @@ -3025,6 +3025,308 @@ class TrafficLightCrossPlanImportTest(TestCase): if os.path.exists(tmp_path): os.remove(tmp_path) + def test_parse_cross_plan_com_and_alim_wires_ignored_in_detection_sections(self): + """ + Verify that auxiliary wiring rows like 'Com', 'Comm', 'Alim', 'Contact', 'Radar' + in detection cable / Detecteur sections are not parsed as detectors or lanterns. + This fixes the bug where 'Com' lines were erroneously created as 'Traficam wide angle' detectors. + """ + import openpyxl + import tempfile + from assets.utils.cross_plan_parser import parse_cross_plan + + wb = openpyxl.Workbook() + ws = wb.active + ws.title = "kruisjesplan" + ws.cell(row=1, column=1, value="Sleutel:") + ws.cell(row=1, column=2, value="SWB01") + ws.cell(row=5, column=1, value="Câble 48 TWAVB 10x2x0,8 mm²") + ws.cell(row=6, column=3, value="Detecteur") + ws.cell(row=6, column=4, value="kringen") + ws.cell(row=7, column=5, value="A01") + ws.cell(row=7, column=6, value="A05") + + # Row 8: Com on A01 + ws.cell(row=8, column=2, value="1") + ws.cell(row=8, column=3, value="Com") + ws.cell(row=8, column=4, value="COM") + ws.cell(row=8, column=5, value="X") + + # Row 9: RpC on A01 + ws.cell(row=9, column=2, value="2") + ws.cell(row=9, column=3, value="RpC") + ws.cell(row=9, column=4, value="TMA-122 M") + ws.cell(row=9, column=5, value="X") + + # Row 10: Alim on A05 + ws.cell(row=10, column=2, value="3") + ws.cell(row=10, column=3, value="Alim") + ws.cell(row=10, column=4, value="24V") + ws.cell(row=10, column=6, value="X") + + # Row 11: RpB on A05 + ws.cell(row=11, column=2, value="4") + ws.cell(row=11, column=3, value="RpB") + ws.cell(row=11, column=4, value="TMA-122 M") + ws.cell(row=11, column=6, value="X") + + with tempfile.NamedTemporaryFile(suffix=".xlsx", delete=False) as tmp: + tmp_path = tmp.name + wb.save(tmp_path) + + try: + deduced = parse_cross_plan(tmp_path) + detectors = deduced["detectors"] + detector_codes = [d["code"] for d in detectors] + + # Only RpC on A01 and RpB on A05 should be recognized + self.assertEqual(len(detectors), 2) + self.assertIn("SWB01_A01_RPC", detector_codes) + self.assertIn("SWB01_A05_RPB", detector_codes) + + # Neither Com nor Alim should be in detectors + self.assertNotIn("SWB01_A01_COM", detector_codes) + self.assertNotIn("SWB01_A05_ALIM", detector_codes) + self.assertFalse(any("COM" in code for code in detector_codes)) + self.assertFalse(any("ALIM" in code for code in detector_codes)) + self.assertEqual(len(deduced["lanterns"]), 0) + finally: + import os + if os.path.exists(tmp_path): + os.remove(tmp_path) + + def test_integrate_cross_plan_archive_and_delete_actions(self): + """ + Verify that users can choose 'archive' or 'delete' for assets during cross plan integration: + - When 'archive' is selected, the asset's status becomes 'archived'. + - When 'delete' is selected, the asset is removed from the database. + """ + import openpyxl + import tempfile + from assets.models import ( + TrafficLightPole, TrafficLightLantern, TrafficLightDetector, + TrafficLightCable, TrafficLightPoleModel, TrafficLightLanternModel, + TrafficLightDetectorModel, TrafficLightCableModel + ) + from assets.models.sign import SignPanel, SignPanelModel + + pole_model = TrafficLightPoleModel.objects.first() + lantern_model = TrafficLightLanternModel.objects.first() + detector_model = TrafficLightDetectorModel.objects.first() + cable_model = TrafficLightCableModel.objects.first() + sign_model, _ = SignPanelModel.objects.get_or_create(code="sp_test_mod", defaults={"name_fr": "Model SP Test"}) + + # Assets to delete + pole_del = TrafficLightPole.objects.create(intersection=self.intersection, code="SWB01_P_DEL", model=pole_model, status="active") + lan_del = TrafficLightLantern.objects.create(pole=pole_del, code="SWB01_L_DEL", model=lantern_model, status="active") + det_del = TrafficLightDetector.objects.create(intersection=self.intersection, code="SWB01_D_DEL", model=detector_model, status="active") + cab_del = TrafficLightCable.objects.create(intersection=self.intersection, code="SWB01_C_DEL", model=cable_model, status="active") + sp_del = SignPanel.objects.create(trafficlight_pole=pole_del, code="SWB01_SP_DEL", model=sign_model, status="active") + pole_standalone_del = TrafficLightPole.objects.create(intersection=self.intersection, code="SWB01_P_STANDALONE_DEL", model=pole_model, status="active") + + # Assets to archive + pole_arc = TrafficLightPole.objects.create(intersection=self.intersection, code="SWB01_P_ARC", model=pole_model, status="active") + lan_arc = TrafficLightLantern.objects.create(pole=pole_arc, code="SWB01_L_ARC", model=lantern_model, status="active") + det_arc = TrafficLightDetector.objects.create(intersection=self.intersection, pole=pole_arc, code="SWB01_D_ARC", model=detector_model, status="active") + cab_arc = TrafficLightCable.objects.create(intersection=self.intersection, code="SWB01_C_ARC", model=cable_model, status="active") + sp_arc = SignPanel.objects.create(trafficlight_pole=pole_arc, code="SWB01_SP_ARC", model=sign_model, status="active") + + # Minimal workbook so we can run import_cross_plan + wb = openpyxl.Workbook() + ws = wb.active + ws.title = "kruisjesplan" + ws.cell(row=1, column=1, value="Sleutel:") + ws.cell(row=1, column=2, value="SWB01") + ws.cell(row=5, column=1, value="Câble 01 SVAVB") + ws.cell(row=6, column=3, value="richting") + ws.cell(row=6, column=4, value="kringen") + ws.cell(row=7, column=5, value="P_ARC") + ws.cell(row=8, column=3, value="A") + ws.cell(row=8, column=5, value="X") + + with tempfile.NamedTemporaryFile(suffix=".xlsx", delete=False) as tmp: + tmp_path = tmp.name + wb.save(tmp_path) + + try: + self.client.force_login(self.user) + from django.core.files.uploadedfile import SimpleUploadedFile + with open(tmp_path, "rb") as f: + uploaded_file = SimpleUploadedFile("plan_test_archive_delete.xlsx", f.read(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + + url_import = reverse("assets:import_cross_plan", args=[self.intersection.id]) + response = self.client.post(url_import, {"cross_plan_file_upload": uploaded_file}) + self.assertEqual(response.status_code, 200) + + # Test POST integrate with delete on db-only assets and archive on others + url_integrate = reverse("assets:integrate_cross_plan", args=[self.intersection.id]) + post_data = { + "cross_plan_filename": response.context["cross_plan_filename"], + # Delete DB-only standalone pole + "selected_pole_db_SWB01_P_STANDALONE_DEL": "on", + "action_pole_db_SWB01_P_STANDALONE_DEL": "delete", + "db_id_pole_SWB01_P_STANDALONE_DEL": str(pole_standalone_del.id), + # Delete DB-only lantern + "selected_lantern_db_SWB01_L_DEL": "on", + "action_lantern_db_SWB01_L_DEL": "delete", + "db_id_lantern_SWB01_L_DEL": str(lan_del.id), + # Delete DB-only detector + "selected_detector_db_SWB01_D_DEL": "on", + "action_detector_db_SWB01_D_DEL": "delete", + "db_id_detector_SWB01_D_DEL": str(det_del.id), + # Delete DB-only cable + "selected_cable_db_SWB01_C_DEL": "on", + "action_cable_db_SWB01_C_DEL": "delete", + "db_id_cable_SWB01_C_DEL": str(cab_del.id), + # Delete other asset (signpanel) + f"selected_other_signpanel_{sp_del.id}": "on", + f"action_other_signpanel_{sp_del.id}": "delete", + + # Archive DB-only pole + "selected_pole_db_SWB01_P_ARC": "on", + "action_pole_db_SWB01_P_ARC": "archive", + "db_id_pole_SWB01_P_ARC": str(pole_arc.id), + # Archive DB-only lantern + "selected_lantern_db_SWB01_L_ARC": "on", + "action_lantern_db_SWB01_L_ARC": "archive", + "db_id_lantern_SWB01_L_ARC": str(lan_arc.id), + # Archive DB-only detector + "selected_detector_db_SWB01_D_ARC": "on", + "action_detector_db_SWB01_D_ARC": "archive", + "db_id_detector_SWB01_D_ARC": str(det_arc.id), + # Archive DB-only cable + "selected_cable_db_SWB01_C_ARC": "on", + "action_cable_db_SWB01_C_ARC": "archive", + "db_id_cable_SWB01_C_ARC": str(cab_arc.id), + # Archive other asset (signpanel) + f"selected_other_signpanel_{sp_arc.id}": "on", + f"action_other_signpanel_{sp_arc.id}": "archive", + } + response_integrate = self.client.post(url_integrate, post_data) + self.assertEqual(response_integrate.status_code, 302) + + # Verification of deleted items + self.assertFalse(TrafficLightPole.objects.filter(pk=pole_standalone_del.id).exists()) + self.assertFalse(TrafficLightLantern.objects.filter(pk=lan_del.id).exists()) + self.assertFalse(TrafficLightDetector.objects.filter(pk=det_del.id).exists()) + self.assertFalse(TrafficLightCable.objects.filter(pk=cab_del.id).exists()) + self.assertFalse(SignPanel.objects.filter(pk=sp_del.id).exists()) + + # Verification of archived items + pole_arc.refresh_from_db() + self.assertEqual(pole_arc.status, "archived") + lan_arc.refresh_from_db() + self.assertEqual(lan_arc.status, "archived") + det_arc.refresh_from_db() + self.assertEqual(det_arc.status, "archived") + cab_arc.refresh_from_db() + self.assertEqual(cab_arc.status, "archived") + sp_arc.refresh_from_db() + self.assertEqual(sp_arc.status, "archived") + + finally: + import os + if os.path.exists(tmp_path): + os.remove(tmp_path) + + def test_integrate_cross_plan_plan_asset_archive_and_delete_actions(self): + """ + Verify that for assets that exist both in DB and in the plan (status identical or modified), + the user can select 'archive' (archiver l'existant sans recréer) or 'delete' (supprimer l'existant de la DB). + """ + import openpyxl + import tempfile + from assets.models import ( + TrafficLightPole, TrafficLightLantern, TrafficLightDetector, + TrafficLightCable, TrafficLightPoleModel, TrafficLightLanternModel, + TrafficLightDetectorModel, TrafficLightCableModel + ) + from django.core.files.uploadedfile import SimpleUploadedFile + + pole_model = TrafficLightPoleModel.objects.first() + lantern_model = TrafficLightLanternModel.objects.first() + detector_model = TrafficLightDetectorModel.objects.first() + cable_model = TrafficLightCableModel.objects.first() + + existing_pole = TrafficLightPole.objects.create(intersection=self.intersection, code="SWB01_A01", model=pole_model, status="active") + existing_lantern = TrafficLightLantern.objects.create(pole=existing_pole, code="SWB01_A01_LAN01_A", model=lantern_model, status="active") + existing_detector = TrafficLightDetector.objects.create(intersection=self.intersection, code="SWB01_A01_RPC", model=detector_model, status="active") + existing_cable = TrafficLightCable.objects.create(intersection=self.intersection, code="SWB01_CAB01", model=cable_model, status="active") + + wb = openpyxl.Workbook() + ws = wb.active + ws.title = "kruisjesplan" + ws.cell(row=1, column=1, value="Sleutel:") + ws.cell(row=1, column=2, value="SWB01") + ws.cell(row=5, column=1, value="Câble 01 SVAVB") + ws.cell(row=6, column=3, value="richting") + ws.cell(row=6, column=4, value="kringen") + ws.cell(row=7, column=5, value="A01") + ws.cell(row=8, column=3, value="A") + ws.cell(row=8, column=5, value="X") + ws.cell(row=9, column=3, value="RpC") + ws.cell(row=9, column=5, value="X") + + with tempfile.NamedTemporaryFile(suffix=".xlsx", delete=False) as tmp: + tmp_path = tmp.name + wb.save(tmp_path) + + try: + self.client.force_login(self.user) + with open(tmp_path, "rb") as f: + uploaded_file = SimpleUploadedFile("plan_test_plan_actions.xlsx", f.read(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + + url_import = reverse("assets:import_cross_plan", args=[self.intersection.id]) + response = self.client.post(url_import, {"cross_plan_file_upload": uploaded_file}) + self.assertEqual(response.status_code, 200) + + # Post integrate: + # - detector: action="delete" + # - lantern: action="archive" + # - cable: action="delete" + # - pole: action="archive" + url_integrate = reverse("assets:integrate_cross_plan", args=[self.intersection.id]) + post_data = { + "cross_plan_filename": response.context["cross_plan_filename"], + "selected_detector_SWB01_A01_RPC": "on", + "action_detector_SWB01_A01_RPC": "delete", + "db_id_detector_SWB01_A01_RPC": str(existing_detector.id), + + "selected_lantern_SWB01_A01_LAN01_A": "on", + "action_lantern_SWB01_A01_LAN01_A": "archive", + "db_id_lantern_SWB01_A01_LAN01_A": str(existing_lantern.id), + + "selected_cable_SWB01_CAB01": "on", + "action_cable_SWB01_CAB01": "delete", + "db_id_cable_SWB01_CAB01": str(existing_cable.id), + + "selected_pole_SWB01_A01": "on", + "action_pole_SWB01_A01": "archive", + "db_id_pole_SWB01_A01": str(existing_pole.id), + } + response_integrate = self.client.post(url_integrate, post_data) + self.assertEqual(response_integrate.status_code, 302) + + # Detector must be deleted + self.assertFalse(TrafficLightDetector.objects.filter(pk=existing_detector.id).exists()) + # Cable must be deleted + self.assertFalse(TrafficLightCable.objects.filter(pk=existing_cable.id).exists()) + + # Lantern must be archived + existing_lantern.refresh_from_db() + self.assertEqual(existing_lantern.status, "archived") + + # Pole must be archived + existing_pole.refresh_from_db() + self.assertEqual(existing_pole.status, "archived") + + finally: + import os + if os.path.exists(tmp_path): + os.remove(tmp_path) + + + class AssetDefaultPositionTest(TestCase): def test_assign_default_position_hierarchy(self): diff --git a/loko/assets/utils/cross_plan_parser.py b/loko/assets/utils/cross_plan_parser.py index d7be181..cf6c1d5 100644 --- a/loko/assets/utils/cross_plan_parser.py +++ b/loko/assets/utils/cross_plan_parser.py @@ -26,6 +26,38 @@ def is_hp_or_ls(text): return True return False +def is_wiring_or_non_equipment(text): + """ + Checks if the wire/direction/circuit text refers to auxiliary wiring, communication, + power supply, contact lines, or reserve wires that must NOT be treated as equipment + (neither lantern nor detector). + In cross plans, 'Com' / 'Comm' / 'Communication' represents communication wiring/bus + for detectors/cameras or radar power supplies, NOT an actual detector. + """ + if not text: + return False + t_str = str(text).strip() + t_lower = t_str.lower() + t_clean = re.sub(r'[\s/\\_\-\.:;]+', ' ', t_lower).strip() + t_upper = re.sub(r'\s+', '', t_str.upper()) + + # 1. Direct keyword matches (word boundary) + if re.search(r'\b(?:com|comm|communication|communicatie|alim|alimentation|voeding|tension|contact|reserve|reservee|réservé|réservée|réserve|libre|vrij|spaar|terre|masse|neutre)\b', t_clean, re.IGNORECASE): + return True + + # 2. String starts with or equals COM, COMM, ALIM, etc. + if re.match(r'^(?:COM|COMM|ALIM|CONTACT|TENSION|RESERVE)\d*$', t_upper, re.IGNORECASE): + return True + + if t_upper.startswith(("COM_", "COMM_", "ALIM_", "COM-", "COMM-", "ALIM-")): + return True + + # 3. Radar power supply (not a detector code like RA, RB, RC, RD, RM, RP) + if t_upper == "RADAR" or t_upper.startswith("RADAR") or (bool(re.search(r'\bradar\b', t_str, re.IGNORECASE)) and not bool(re.match(r'^(?:RA|RB|RC|RD|RM|RP)\d*$', t_upper, re.IGNORECASE))): + return True + + return False + def is_cyclopieton_phase(phase): """ Checks if a phase code corresponds to a combined pedestrian + cyclist signal (cyclo-piéton). @@ -283,6 +315,11 @@ def parse_cross_plan(excel_path): pole_has_hp[p] = True continue + # Check if wire refers to communication, power supply, contact, reserve, etc. + # It must NOT be treated as an equipment (neither lantern nor detector). + if is_wiring_or_non_equipment(richting) or is_wiring_or_non_equipment(kringen): + continue + # Detectors # Check if push button (e.g. Dka, Dkb, PBa1, BPf4...) if richting.lower().startswith(("dk", "pb", "bp")): @@ -383,7 +420,7 @@ def parse_cross_plan(excel_path): # Richting codes are typically: A, B, C, T1, T2, F1, F2, a, b, c... # Ignore wiring/cabling categories like ALIM, Radar, Com, contact, HP/LS, etc. normalized = re.sub(r'\s+', ' ', richting).strip() - if is_hp_or_ls(richting) or is_hp_or_ls(kringen) or re.search(r'(?:alim|com|contact|radar|tension|comm|\bhp\b|\bls\b|hp/ls|ls/hp)', normalized, re.IGNORECASE): + if is_hp_or_ls(richting) or is_hp_or_ls(kringen) or is_wiring_or_non_equipment(richting) or is_wiring_or_non_equipment(kringen) or re.search(r'(?:alim|com|contact|radar|tension|comm|\bhp\b|\bls\b|hp/ls|ls/hp)', normalized, re.IGNORECASE): continue if p not in pole_phases: diff --git a/loko/assets/views/trafficlights.py b/loko/assets/views/trafficlights.py index feaff8a..3cb0a5c 100644 --- a/loko/assets/views/trafficlights.py +++ b/loko/assets/views/trafficlights.py @@ -4867,12 +4867,18 @@ def integrate_cross_plan(request, intersection_id): from django.shortcuts import get_object_or_404, redirect from django.contrib import messages from django.db import transaction - import json + from django.db.models import ProtectedError from assets.models.trafficlights import ( TrafficLightIntersection, TrafficLightPole, TrafficLightLantern, TrafficLightDetector, TrafficLightCable, TrafficLightPoleModel, - TrafficLightLanternModel, TrafficLightDetectorModel, TrafficLightCableModel + TrafficLightLanternModel, TrafficLightDetectorModel, TrafficLightCableModel, + TrafficLightController, TrafficLightControllerHardware, TrafficLightNetworkHardware, + TrafficLightVoltageHardware, TrafficLightElectricalCabinet, TrafficLightAccessory, + TrafficLightRadar, TrafficLightProgramming ) + from assets.models.sign import SignPanel + from assets.models.its import ITSGeoAsset + from assets.models.publiclighting import PublicLightingLightFixture intersection = get_object_or_404(TrafficLightIntersection, pk=intersection_id) filename = request.POST.get('cross_plan_filename') @@ -5406,6 +5412,18 @@ def integrate_cross_plan(request, intersection_id): PublicLightingLightFixture.objects.filter(traffic_light_pole=existing).update(traffic_light_pole=new_pole) except Exception: pass + elif action == "archive" and existing: + existing.status = 'archived' + existing.updated_by = request.user + existing.save() + elif action == "delete" and existing: + try: + existing.delete() + except ProtectedError: + existing.status = 'archived' + existing.updated_by = request.user + existing.save() + messages.warning(request, f"Le poteau {existing.code} n'a pas pu être supprimé car d'autres éléments y font référence ; il a été archivé à la place.") else: # 'keep' (Ne rien faire) if existing: @@ -5424,6 +5442,17 @@ def integrate_cross_plan(request, intersection_id): TrafficLightPole.objects.filter(intersection=intersection, code=code, status='active').update( status='archived', updated_by=request.user ) + elif action == "delete": + db_id = request.POST.get(f"db_id_pole_{code}") + qs = TrafficLightPole.objects.filter(pk=db_id) if db_id else TrafficLightPole.objects.filter(intersection=intersection, code=code) + for pole_to_del in qs: + try: + pole_to_del.delete() + except ProtectedError: + pole_to_del.status = 'archived' + pole_to_del.updated_by = request.user + pole_to_del.save() + messages.warning(request, f"Le poteau {pole_to_del.code} n'a pas pu être supprimé car d'autres éléments y font référence ; il a été archivé à la place.") # Fetch active poles to match parent relation for lanterns/detectors if not resolved above active_poles = {p.code: p for p in TrafficLightPole.objects.filter(intersection=intersection, status='active')} @@ -5492,6 +5521,18 @@ def integrate_cross_plan(request, intersection_id): new_cable.save() existing.replaced_by = new_cable existing.save() + elif action == "archive" and existing: + existing.status = 'archived' + existing.updated_by = request.user + existing.save() + elif action == "delete" and existing: + try: + existing.delete() + except ProtectedError: + existing.status = 'archived' + existing.updated_by = request.user + existing.save() + messages.warning(request, f"Le câble {existing.code} n'a pas pu être supprimé car il est référencé ; il a été archivé à la place.") else: # 'keep' (Ne rien faire) if existing: @@ -5509,6 +5550,17 @@ def integrate_cross_plan(request, intersection_id): TrafficLightCable.objects.filter(intersection=intersection, code=code, status='active').update( status='archived', updated_by=request.user ) + elif action == "delete": + db_id = request.POST.get(f"db_id_cable_{code}") + qs = TrafficLightCable.objects.filter(pk=db_id) if db_id else TrafficLightCable.objects.filter(intersection=intersection, code=code) + for cable_to_del in qs: + try: + cable_to_del.delete() + except ProtectedError: + cable_to_del.status = 'archived' + cable_to_del.updated_by = request.user + cable_to_del.save() + messages.warning(request, f"Le câble {cable_to_del.code} n'a pas pu être supprimé car il est référencé ; il a été archivé à la place.") # --- 3. Lanterns integration --- for dl in deduced["lanterns"]: @@ -5570,6 +5622,18 @@ def integrate_cross_plan(request, intersection_id): ) existing.replaced_by = new_lantern existing.save() + elif action == "archive" and existing: + existing.status = 'archived' + existing.updated_by = request.user + existing.save() + elif action == "delete" and existing: + try: + existing.delete() + except ProtectedError: + existing.status = 'archived' + existing.updated_by = request.user + existing.save() + messages.warning(request, f"La lanterne {existing.code} n'a pas pu être supprimée car elle est référencée ; elle a été archivée à la place.") else: # 'keep' if existing: @@ -5589,6 +5653,17 @@ def integrate_cross_plan(request, intersection_id): TrafficLightLantern.objects.filter(pole__intersection=intersection, code=code, status='active').update( status='archived', updated_by=request.user ) + elif action == "delete": + db_id = request.POST.get(f"db_id_lantern_{code}") + qs = TrafficLightLantern.objects.filter(pk=db_id) if db_id else TrafficLightLantern.objects.filter(pole__intersection=intersection, code=code) + for lan_to_del in qs: + try: + lan_to_del.delete() + except ProtectedError: + lan_to_del.status = 'archived' + lan_to_del.updated_by = request.user + lan_to_del.save() + messages.warning(request, f"La lanterne {lan_to_del.code} n'a pas pu être supprimée car elle est référencée ; elle a été archivée à la place.") # --- 4. Detectors integration --- for dd in deduced["detectors"]: @@ -5658,6 +5733,18 @@ def integrate_cross_plan(request, intersection_id): ) existing.replaced_by = new_det existing.save() + elif action == "archive" and existing: + existing.status = 'archived' + existing.updated_by = request.user + existing.save() + elif action == "delete" and existing: + try: + existing.delete() + except ProtectedError: + existing.status = 'archived' + existing.updated_by = request.user + existing.save() + messages.warning(request, f"Le détecteur {existing.code} n'a pas pu être supprimé car il est référencé ; il a été archivé à la place.") else: # 'keep' if existing: @@ -5678,6 +5765,17 @@ def integrate_cross_plan(request, intersection_id): TrafficLightDetector.objects.filter(intersection=intersection, code=code, status='active').update( status='archived', updated_by=request.user ) + elif action == "delete": + db_id = request.POST.get(f"db_id_detector_{code}") + qs = TrafficLightDetector.objects.filter(pk=db_id) if db_id else TrafficLightDetector.objects.filter(intersection=intersection, code=code) + for det_to_del in qs: + try: + det_to_del.delete() + except ProtectedError: + det_to_del.status = 'archived' + det_to_del.updated_by = request.user + det_to_del.save() + messages.warning(request, f"Le détecteur {det_to_del.code} n'a pas pu être supprimé car il est référencé ; il a été archivé à la place.") # --- 5. Other associated assets integration --- for key in request.POST.keys(): @@ -5687,36 +5785,39 @@ def integrate_cross_plan(request, intersection_id): asset_type, asset_id_str = suffix.split("_", 1) is_selected = request.POST.get(f"selected_other_{suffix}") == "on" action = request.POST.get(key, "keep") - if is_selected and action == "archive": + if is_selected and action in ("archive", "delete"): try: asset_id = int(asset_id_str) - if asset_type == "signpanel": - from assets.models.sign import SignPanel - SignPanel.objects.filter(pk=asset_id).update(status='archived', updated_by=request.user) - elif asset_type == "itsasset": - from assets.models.its import ITSGeoAsset - ITSGeoAsset.objects.filter(pk=asset_id).update(status='archived', updated_by=request.user) - elif asset_type == "controller": - TrafficLightController.objects.filter(pk=asset_id).update(status='archived', updated_by=request.user) - from assets.models.trafficlights import TrafficLightControllerHardware - TrafficLightControllerHardware.objects.filter(controller_id=asset_id).update(status='archived', updated_by=request.user) - TrafficLightNetworkHardware.objects.filter(controller_id=asset_id).update(status='archived', updated_by=request.user) - TrafficLightVoltageHardware.objects.filter(controller_id=asset_id).update(status='archived', updated_by=request.user) - elif asset_type == "networkhardware": - TrafficLightNetworkHardware.objects.filter(pk=asset_id).update(status='archived', updated_by=request.user) - elif asset_type == "voltagehardware": - TrafficLightVoltageHardware.objects.filter(pk=asset_id).update(status='archived', updated_by=request.user) - elif asset_type == "electricalcabinet": - TrafficLightElectricalCabinet.objects.filter(pk=asset_id).update(status='archived', updated_by=request.user) - elif asset_type == "accessory": - TrafficLightAccessory.objects.filter(pk=asset_id).update(status='archived', updated_by=request.user) - elif asset_type == "radar": - TrafficLightRadar.objects.filter(pk=asset_id).update(status='archived', updated_by=request.user) - elif asset_type == "programming": - TrafficLightProgramming.objects.filter(pk=asset_id).update(status='archived', updated_by=request.user) - elif asset_type == "lightfixture": - from assets.models.publiclighting import PublicLightingLightFixture - PublicLightingLightFixture.objects.filter(pk=asset_id).update(status='archived', updated_by=request.user) + model_map = { + "signpanel": SignPanel, + "itsasset": ITSGeoAsset, + "controller": TrafficLightController, + "networkhardware": TrafficLightNetworkHardware, + "voltagehardware": TrafficLightVoltageHardware, + "electricalcabinet": TrafficLightElectricalCabinet, + "accessory": TrafficLightAccessory, + "radar": TrafficLightRadar, + "programming": TrafficLightProgramming, + "lightfixture": PublicLightingLightFixture, + } + model_cls = model_map.get(asset_type) + if model_cls: + if action == "archive": + model_cls.objects.filter(pk=asset_id).update(status='archived', updated_by=request.user) + if asset_type == "controller": + TrafficLightControllerHardware.objects.filter(controller_id=asset_id).update(status='archived', updated_by=request.user) + TrafficLightNetworkHardware.objects.filter(controller_id=asset_id).update(status='archived', updated_by=request.user) + TrafficLightVoltageHardware.objects.filter(controller_id=asset_id).update(status='archived', updated_by=request.user) + elif action == "delete": + obj = model_cls.objects.filter(pk=asset_id).first() + if obj: + try: + obj.delete() + except ProtectedError: + obj.status = 'archived' + obj.updated_by = request.user + obj.save() + messages.warning(request, f"L'équipement {obj} n'a pas pu être supprimé car il est référencé ; il a été archivé à la place.") except (ValueError, TypeError, Exception): pass