From 79af86fb7f6e2eba31ac1a12d4aa6c0e7b1f19c1 Mon Sep 17 00:00:00 2001 From: kdeterme Date: Fri, 25 Sep 2026 21:29:42 +0200 Subject: [PATCH] =?UTF-8?q?feat(interventions):=20am=C3=A9lioration=20de?= =?UTF-8?q?=20la=20chronologie=20et=20tra=C3=A7abilit=C3=A9=20compl=C3=A8t?= =?UTF-8?q?e=20de=20l'historique=20-=20Ajout=20des=20types=20d'=C3=A9v?= =?UTF-8?q?=C3=A9nements=20'assignment'=20et=20'modification'=20sur=20Inte?= =?UTF-8?q?rventionTimeLine=20-=20Enregistrement=20des=20attributs=20modif?= =?UTF-8?q?i=C3=A9s=20(field=5Fchanges=20JSON)=20et=20des=20descriptions?= =?UTF-8?q?=20d'=C3=A9v=C3=A9nements=20-=20Cr=C3=A9ation=20du=20service=20?= =?UTF-8?q?InterventionChangeTracker=20pour=20historiser=20les=20changemen?= =?UTF-8?q?ts=20de=20champs=20et=20d'assignations=20-=20Refonte=20visuelle?= =?UTF-8?q?=20de=20card=5Fchronologie=20avec=20vue=20par=20d=C3=A9faut=20(?= =?UTF-8?q?statuts=20+=20assignations)=20et=20bascule=20vers=20l'historiqu?= =?UTF-8?q?e=20complet=20-=20Pr=C3=A9servation=20des=20shortnames=20pour?= =?UTF-8?q?=20tous=20les=20auteurs=20des=20modifications=20-=20Ajout=20des?= =?UTF-8?q?=20traductions=20i18n=20et=20de=20tests=20unitaires=20d=C3=A9di?= =?UTF-8?q?=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../locale/en/LC_MESSAGES/django.mo | Bin 119369 -> 121073 bytes .../locale/en/LC_MESSAGES/django.po | 103 +++++ .../locale/fr/LC_MESSAGES/django.mo | Bin 134813 -> 136681 bytes .../locale/fr/LC_MESSAGES/django.po | 103 +++++ .../locale/nl/LC_MESSAGES/django.mo | Bin 124738 -> 126538 bytes .../locale/nl/LC_MESSAGES/django.po | 103 +++++ ...tiontimeline_event_description_and_more.py | 28 ++ loko/interventions/models.py | 70 +++- loko/interventions/services/__init__.py | 8 + .../services/timeline_service.py | 393 ++++++++++++++++++ .../static/interventions/timeline.css | 82 ++++ .../detail/card_chronologie.html | 180 ++++++-- .../interventions/detail/styles.html | 80 ++++ .../tests/test_timeline_history.py | 235 +++++++++++ loko/interventions/views/calendar.py | 25 ++ loko/interventions/views/detail.py | 46 ++ loko/interventions/views/mobile.py | 32 +- 17 files changed, 1453 insertions(+), 35 deletions(-) create mode 100644 loko/interventions/migrations/0014_interventiontimeline_event_description_and_more.py create mode 100644 loko/interventions/services/timeline_service.py create mode 100644 loko/interventions/tests/test_timeline_history.py diff --git a/loko/interventions/locale/en/LC_MESSAGES/django.mo b/loko/interventions/locale/en/LC_MESSAGES/django.mo index e14ba9a5a27b6d34733691fc25fc279a6fb10464..0e5c6107ff007525e093ad336460923f7f272c03 100644 GIT binary patch delta 34516 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 delta 33096 zcmZwP1$0%{pZ4*4NpKHdELd;}!GgQHyB8@ArC8x&#ogVVq5)DI3KW+j#i2lf;!>ng zXy5O1_b;=US?^hM`q}RLB+$>(jqrF9V1HDF(HM-2kuiD>U|f8OaqyGHV~%v`NzC*ZoBW&@fCVufhGSa# z_cSJ;2EM}>I1FRq7-S(lQ&BUTiy^oXli?*ygio*venQo+_=Crj8*8BI4?>k6fm)%t zSRPMeN&5FB8s!SsG82&BTlQ8Nu1UgRz@A3Dwai%!(Kz@?sXOh$`20EbAYgzz`C`aU^PF`%qhQ3S;7B)ET&q>hQg#CmQEgDkW-w^-%d8 zP!sWCLY#rIafP`NRsN@OtiNV@k_2^h8#U60m<#_!4KU|;mmZ2Sh*!pVSPPqDa}2?q zm>qw|3>asEE0+s3fN+e3@a1e7opE8r$ff^Shv zAA5$!lLvF6$~8ru_Wr2bu>|wteoTrl@GA_Q>9#6879rjqv*AKZ{{`dHzbEc2cc@aJ zW||Il=!&2kEQvu_4|VuDpuS|?P)pv+;zLmbABnntb1)dUq1w5Gn!sb!0AtN&{q@by zL_nv%H0pF#Mh&12rocv+2zy{09EuvycvOdrP-kQ-CdZSQ81G_Se1j>_GskUhO4N$h zpTqjA;}Ikj#PO&G52Dg9VGF#8SFqSzkLM3eI?o-V4_JtJmig|`Hb))GiKzDGVOczf zH8IHows(h@au3uj|0xD1nwPzK~MyNgSjDa{1Q=<V z?vGh;II6)l7T<*G_!6qaC#aS3tZ`eE0u|4PX|WP&MZR9c`s=aaaQReX(VFxn>9aZ=PwvY_(wS-do=UNzJJ>!Qw7JJiI+ zVSL^H#RRk`8;}us4r4I>irS;sm;n=RcBelS;}dU$TDh+=E)K#3I2v_JW}#-h2eaZ~ z)Igu2&enTOqx&DU#mzJ?>QIGSye_Ijb5uheQ6ukx>S(0pPe+}hMX28&enx$OZlKP} z->CX|wz`2ALbX#KeVRcN0y-o;P)jxugK-9`q3xItf5jk-7U2e#3^kKr)WD0OR;s?m zzeAmg$*6jBFd?o-t=R4eyZ=W?&`htR_WS|r)B6&&XW6&88Pvuk#2aH`>}u&lP-kY8 zr7uDaXftYn$1VR4^AoCm((SCj3WjWV9hAaE#4Di&)EG6OcBqxwowEJS<=s^9HC0{#jZt_rAYQy|h^yZWg7A*d}{XX(c<2l3aa zp8;uqa$mmUn4Ne}490n=0q#bXJ83>fZIv(fPM47rwI@|kOV$uI!(NyIM_@3{$7Hw% zwNmF%D|HVwpy#L+O0~zp!(^6p}POQ3Fwflz*M*a)zDG&Uq8!FxZ9OW ziE1zdD!+`Sw?u7GN7RhFqXserb^52H>di-O)ozTT`+tjoI=+vZ*?;&ICfnm0%7<#8 zG^$)>)M;*u$+0hL1ty@%&Bipi82u}S{*^*~VeeV`Lrg&bp3emI(=Xm$ce+DSOH{$E zgK3GkKpnBM$PO#7Q@&-vpQG-tKwo*LyxfpraI(Spb@IWuBeHOKrQ`J)J%7ww)8ye ztlUDCf8-;eYvDQU4p)54Kr|~Vy$WW+hNz_+h-z>qmc|XJfjmd8M6M&Q<9evW+7+|n zC{%|VE&T`v6ZhRFpu^(%#p5Xq$*~32M4g2nQA>Xe)xd9<51*Ooj=B}Bg_%kBp|*4d zs@Tjjd0G?DlFq{dcpSC2|DtA)=(uYz2kH=(LS3i2m>t`pmU<%U z-mgNH+kt_29M#?#)Yklt>F{67ult|&g!?emM$Mon@@4YO#F}^%vtja+oC7R{mGK9x zfoHHFra8s${#X}#;c^^|$xgfc>8N_gu|5W!VYTSr(~&?Ce26(P_^eyfYS@AJAS{D- zQ6tZM&aGHE)FJJSxp5Aww>){yJ3U zNJx)Ou>lUmYIqJqG0ku89@j*j_Fh;KH=(ZQJ5>4Fm)Ra%fa>T5YUb}zXQ|K?*IsSR zMSS=b)?Z7ziG-~93bSCUt8R%)p_aTmX2gl8mD-Fe@H`g8e%IXL+JIV#lb8Z8nolt< z@xbfuP$t3z#FP05Xy%zQK9{ z5b?8E6l2_S*R%{W0H3E00bRR}sKYY>6XOn4!^cn^UPq1iHO9nPw_S&cFb47Lm=N=! z23i_RVN*=nez*5y(J5hou-QqaJF{+M`y$XHG*6WF>0Fj-XcJ zF{Z`WsF@|Y>*5(v11OCeXbp?kMNOa;`ZVJ{1a#^rpk}@m^`$$AYB=UScMGy$0P*se z5i4T|c0p~yG*tb$s4ZKAn(=-tg_kTp*&p^}{15hDOOuTR8H&MJ6txn~P)perHR7?T zm0E}axEhPr0IS^8bnS$Kt7iMaP&xs<4SA@^B-WfUYqGbn3T!9e1*QA^qY zQ)5Srjw4W8GZxk10#t)*EIkr6;1ie*Z=qJ=GiJsl58UqoMSKKQu^g(Qx~PU*q8jLh z+JYZY16htbtlLp5bOik~Ht%9I(x02JEd32?0-lHN$9x)8`@Z@F)IcZ9fZt+OoQ3)E z4#vTxf4YIB$85w)p!T=}YKaG0_%D++dqd#^7i;tRVR@9ajL$y~Li_*WRJOQ0f zAFAMf)QB&juHh4l$9Up?5lM%dc^JmRs;HH!hhaDhHPBtCawjkx?_dl}{nVYIjF^J{ zJ=qB8P?SbB^tCc@4r)M~Q4Ji%!uT)hn_uXe`)Sq%lM-Ku+KR2Hl{|&f@h)oV|3saw zz~^o&Q=m^HDrgDCQ4KXk4WI{V0HaY2&qvL8JF0_y7#}a9&dy!biUq!KXCOW5kmkhn zSRB=Ub5#4iUaaaEHRt!gdCuU$=+=6Ov zFKP?!U|posF{t# ztT-Q4?+~iqRm_gBP#vazaeGT2k6N**s57$^bq3a<25YZnJyGq=#MHX~n+a$}r%(g=4Rwfaq8fUH zs_-u+$5em2Jl^i~c&$QA^hs z^(FfOQ{hC5uSPBDCQJVba}Ym|YUeZRu%-M+o0tVtU>no`2B5ZT7W#q->?NQEZlOAi z{g3M~F=`+=QD>wWs-c<|?|>>l0JXHkFbS^0M7Rr6;z?A!KTz#_!mlvlC)Qtko#T@` z#r08#>U&Iu!!Zpmz=F6F3*igY3`0JAwhYK&TPA8Lihp|)~5Y5!3brMS5U*9AW9p zQSI&X5zwi=jGEDB)CVMv$Lk+RN>stjs2P<&tw2RAf`d^jwF7J6Im-|Bdi{SwYJ{5k zBGgvxKuu^Lc0=Da0(A*gj^_3MQEEPxC;k@IV9@}tE{SIxR>3%dUe8mkk8QC`bg%!% z>I&2V*P?FGR&yt6fCo??vTLX_^$FAJ{>O{q^#qfU168paYR~JU?tc#~jz6GQ=4UK} z=TIvb6w@_W1QQdljM=a$YUxLywsy9;3bhj3F}kL-6s59^YbK+~vjp<@} z{fDbMs)0tR!`cdUhQ3Bkpg(HHKGf3B#g4cI^_@u-+v`6wnb80D|3wLC0F6*H?u=S0 zpQSIwVB!&|8C}Fu_$QXcY;oM4c0`?(5f)!y@t;sz^DAng*HA0;41MZ2d0aQLY^VbH zQ3I)fIxNkw6ZS)W;eJP5x3{P*NfXcO{~?qEb*<{6{(R8Q;#17^sCIur4fIAlug|~N zZ%If`LQs5{ksq}c)leNZ$8a2hTGG9k4lkh&>l-YJ;R#&*Z*c+fiP#l$By{y=qXxJM ztK*4;J~zV@iQLkLq3&}f)XKEPKmRX7RbGhL)ik+KD=pS5e=I`>4bB+S30v1A|<-M5vC^pjNT~ z>b6us)$4*9n6DQB&2SiM&qkr{{aQ=^fa>^P)TcU55_g>np!U8TY9;ER2G$XEhQ390 zINH)TpxWPs&G062wtSxOr2Y?qrvd7o_CZw~j=E-REPXSof&Hj!bQjg(Q`7)Ip!PO; zGG{Pqz{SviJyG@gqb58Y6YKtuCZHM2MV-n`s69UBFTg294eYu388wi2$z8*F&9bO^ z4X`eDMs2|!RQ-#n0pGLuOG*Ep{|M*AS}L#q7m-lZp>2mgjc_u7Vz?Sr@SeqkzH%#46N5?b zh;?ub>H~Gn@;{-ze92O~tw@79)Y(wCCKPqpieo;kj`?wLYVN-Rn@P}hyN5chZ&6zj zBaJ%)=}}9Y74>N?X6X%3KXzN7W;6!1BHOS4-o#uOl-8|qDJ(*~8;0SkwA_C!)in~N zH=X;CWJ7&$+M#~jF2qp0h`ljJdN+dsSfBWhsC;j*+rlu^mbSynI2CoPuAx>gM+Udj z)qMm?lQ0N1qCKel`4Y8s?@%-MW^`vF8ESab2l zee+MF%Eij=_5a01B`i#Q8fxoKV0rZBa9dgtbt{HqRo(wz2vj5?aZcAkV^oK;P-oyF zYRNL>a%ZF-YEK8E2671X3(9|}2^7!muIorFLHtM53Oz<0&ZK$V87YBTb^p5&Py;hj zr};bv;AhnR_vUpUj^wECLMGJDhEPkdj5;d~P}jLN>J0R^^hv1i$6VCb9<=xa^l48M zOy2j^GEB64kRRO*NE|41aWeY=fT*J~kpjKiC>fTR9b+ioAVJaxro%;1y6JMdW)K|KY>$oMV!TzWj&cOn>4fP3qg!+ajFU)mfGed9>@h(N& zjI)J%J;B5);dtzXxF|zZK#fpp|0Ci)R}mQ zIx8>Ccc`uTj2SRd2^Y_gIx7{hJT^krTY&lwEJw9>8WZaNUm_5K_fgj|UP-q^#ZU#? znO#tO+Xpk_YSi^Rg&O#E)S-HT+RB)v+{Ch?CXy3XJ{+}`mC>h!#soCuj;QO_A5~$v zrBAW=QdId(sKdGs)zB5x0RBX6$tQ~km3HMqP}i+AYGtZfyhUm5zY;o;puHc6+M}tc zd%h4kB%WoKeg<`quc4Oop`|}Z4d5ec0tw2vA37;f>2*+B^)+gu{ZSJcTgK-;Jab6U zmuit^tVRuN2WlY4Pz{|%o#s0j9b=Yt1CNgyP-gTmH8vm~j#`n)s0pq_t=t~eM1J#G z;2vt^FHs$QMD1m8Iaja<79?H)qv0Ubhhzxqhsu1^7w<4?z%MWpzOi^p?ra$Gv}PR) zCGPuyfJPjN`e}6pwd4U6+*ag8-Tz{k8#|#6Q-DqZRtnU zfMZm2zn*78>iaw;3Fr`2K~-pig>Vq6!L67N52I%I7PW`LmE4ksVs_${QRRDM9vq2k zCj#|Bdu;hJD!bc}68-=Ee-Q%OtGcKqUxS*_0rLWC1s`0bD{ROGU}7s z3bn_BQCl+`HLwGya_3QB)pq>Rj83S-wGefvmZQG$>n!~cs=?!^fnG@JQ_UUTgs4-W3AGjZ(SQGI5l}-d&0gk6RKv4Td%g(O!75Y->riKB zH|q8rM|E)Cyo0(mFD)Ke-EDOe)JkTm&iz+`JS1r5Wl>Ar&kC%-V#GJ08h(Nr&_}F_ z-Wp!dMy!t8@gLL{Y^mvfcAQ0>jsH-GGJ7o-55xS#Th!wItAi;dXaJ{7Z*A8=A=Dmr zKwYQF=s#5EW7O7UsN+_mC~BaUQD>tOYN`96_I`@F8npuZd<3+V$58{hX7S{8UBg*X z*QYel-+AJo7iusB{uZAsF4ZmBb(29h6@UK6!d%~31q`IqfYx(i$AgWKNgSQz~!e!b&wY|p>n7_ua8NwC92~-7>uJZnSTFYO&~J~ zdr^nyE^5y_4P87fYKFy7D^wT5uoY^c(@`DFM|Hdz)zLwVU&JEB?^}AhMy{Pu^#A=| zNlR#kTGCFaz3ztU;0M&t^NFa2H=y?LfW?oaR_=zS-$fnDC#b_4*x2RgMy+HRYNaZm zPaQTPprvk!ig!ny&OWFC3_&gBC{(#AsK07if*Qzf)K9s?s6%xPHQ+m_j=W9W$|OTg zAOy8y;Z5x4e@zn9U~AM;4?=Y`4fX5vGD|;*+L|k<>-yHr(bUCTVGhz~peC>%HLw#{ z2!BU?Us5!46D{A2`>!RbLV~VYGt?>Wh-#oOYKB8CJ{DDe2CCdDi*K{|FQ^$_wD?0* z{kP`7mL9XYE0@eiKn-QHghHtMTm^M+yP>vVtmRKdUB4Bm0Y{+rct7g!{)r(NqlGg! z>W5K%RQc|x6&{E>BfhBw)ZjYQjCY!cQ3E@R`sUw6oq;>36?lT$Em!<`K}L`4P3}5vYz2p*s8()xdSsOn$fYkEo>$Y~>DDeAHn} zhuVVtsOwq*)p1>mw@2NUUYJn#zaIfD`DoNitVa!C7iy`Fp&Gi4YWS)79|jW-YVE!s zVWL?$o zq0*=US27z|dOOrse1mFlggFaCiLXVUI=)UohvN=vrq56vd_*mIoVIQYGNT&Ij@rYr zs58(Cb)S8x0nV`a0@Rjl!C*Xsx{eP}1OL>P`>z=Xv~x?96t&lxP=_%aY74?p1FVW+ z*bp=0I8;NMPy^V3+Ut|3c5YhyE^39|SUg&LH?XAbeJ+sA5{jc{UfbfWQ4M{IYG45B zP>wdIqE>J|s^g_*1giWI)Y4xtAD~w518QZG`@VJsa-i;U3DgpGKrQX}s6(>=HN&4# zU&PC(pAqj+ddZ;UG69d*bjq7LO2(|5oMoHd_g1`5RQ=qlz#EqzT? z!%a~$>SOUys4ZHI>Tm~YOHZLz<|byvdzK%!lUuycGQ;SMYUG~19ksv6VTo@Kz(vMqBCJtO4L9zqSAAq%9X@;^zW%fK%dy=meCqD z(q5>o@S#>{DQbl_qHf17)QTKIt-w9h;e3kf@Exkde^I}J1$A-pf~d1o1%0^)v>~7s zn1q`764ZcJqdHoTn)wb?LuXN^_%&)K3A?&O6^uG;c~L7@6E%P~s9V$*b-M-i=$Cz zc39BTxgm zkE-_;)p6XOZbdSp(hK8Oy z`nna$Y8FA&tAd(oPt>g#gBtKO)LB`A33UHg5YUVwP!-OgKDiH2D-rKIcP4V68m@;L z@IcgU*oFo1GSk(F}_aUx}6Q7Iwps{$5WXoPnXb|FH(RzbGtv_Vw`!Yt5jEg9sGl_{zUTfcP?~^d))_V9 zDd^uT)agHrIy}E)aeR-ZvA|&WW4JGBp!2XM9z}JOe2BZA;i&e@;uP$Rx+NcnaR2iY z$i+3(b!&yeI0Ut~i%}hK!-jYgbw)A{b$=(+6m_`9VQHvafj9xeDsK)a znRq?a7qUO9-Y`svb5Z4eYYFIj>_sj0QPefNg)#7@#owc55POs>pBU9(YBLN~zna+= z_2C+T8u&O%UufyukQMTIju6O4fw!oFA*0=rg`>_yE!2mkJF3B1s1;g`8t8UQKZ;tx zE9l=c)CAt5X8Z}Y^zp{HtffcCBfs)M1ZnNCIh;xHH0z+%)VdXu>e)zJ~u zHM@yg($A=YBp&NN?a5K!mrST1Y9&$mHKgu;T>|Q$5$Y^-M9r`d>Sx0+OP_?=>v^b# zHlfPxLtWQXs6D@n8hFfcu3UW70MeL+QT6Jg|M&ma1T?b_s4eJ)n%PKHg9}g%9>lVE z6jd(HcsHQ5sQmn>B`$*6x;m(p?1>t1f7C!nqqc70cq#CN>CKwHSpgQc0n%FQ@dlOLQXQ9fkn85v4$Gb?-QXewUnKw~~ z=&|_kkoPy;B7>bM4KV9ihy_{K*-hi)Wl$!DULYy+yo zc2on0P!-Rh&dN>HiabM=i!sTaousIV1f%NZHjAJJUJkWFl~EJ-RU@F0)W@9I9kn#` zP=|4|#rI%&;^(mdrkLzzSRHk^8e$ggh1%QMsEMsb{Q|NJHK1Flv-8O5^L!$pnJ1j$ zDrQCf@CZlEv^i=(T~S*x9Q7$4i~2df3bg|3P%HG4#gCeoP!qX_+L9Nj57h@us-ORf zrn;rcf?Ap!7>2nqFSbFAc&fPqwe*qZIZJ7-xoyXF~N; z5dHuEKg9@Wsq3Tmvb`1XS^NjoUM@imY>UMYqqgP}YGzMRTk#%sxT4Q=`3cO-sQjX+ zfmNQ#{a1%gEupU!9F1yVA?hrwLRCDDT9M0`2j62ThRkv^YK;1E+|uITTYNa`@GU_N zc)fXW7WZEXmq}2E&rmabXYtsxUBw{OAx&%Xf@W#d%2h+ns2S?|c0;w(7j-MfpxWPv znoy+0ulWf0PbZcjOdSP@yluWi-QW0&+|q@h8YqMsa0%1^Yg&3E)Bsze z+Usrcv8XLuh+()E{r~;%O#)i-7pUtMf3Y(+YH4erI{XgR@L<%IO+^i0G3pj=w)iio z@|RJE@D^&%1C}_Gpw3#RCER~CScC-q)T)m99yCE6vTsoh%tL*#_ML zv#3LL(efW+A>uEv2!^b118aq~hz~&JAIEa&S?MO=D^EZTHn)T}*n;=~EQyz~EGA#& zKDkY>6!9_G509Z5EWO(6Ig2B)2G(EW+Fgd4z-o(cLY<9m$jbTn-+FStLR~_g&R3|V z`i%OcSf;hELIw0+AJj^9M$L36YAJVO2|S8gnds}>mZn5q!|bRJT`|>g-g* zTDt%3tUv^61$Lnt{>9=?P$PbC@t8lla!F9vHa+V0l)&6r74<#okHNSCwQ@&L1GtO2 ze*d6PGfuR@HJA!Rh-X19S#{LRTUxw>*&p>yABSymE$WjSZ=*|3jhb;$)NjXSP!ni@ zYPTC|i+mfo|61Z{BxtFYqvBhv;LoU$UPLwU2(`2yP)iuF$^ErkYE=E2s1BN2dUwo0 zd?~8kQ}{jJ#3tBuGxuK^+cvunj$mHmmrxx<-{P)kS~CoF_^P08O>5NNe~tQ(^+a9g zk(d?dp;q{3%Rh;l&}~b9<0GIi-e=25xz!cOjatI8s1HmP)XdwVe+f}b>qB)g-||%UJqY)PN?UuGMT* zhr3ZLaun6UdGofVKSfRGJyM_l{%f0C($rXEj z;yr4HskXa;WJJaDpgJs!+R{3xb~>Z~{!bvFQ$8QHr^``GyashjccE6`w58ug4d@MO z#sNE=2~i!SMy)`YSrWD6Rj?YiKn;AY(sloL5zvgzpekNL|8FpujreObb)=h7d9w!U zUN=OoR3FqWy6ck;wZv60 z4|YMV%sg`gmL`4xwF2HR`A^sljzm}-z9{0nf6NV9A zib}tPDj2ZWEm=McC*B41<8&p4;ti~e3HI5a8L=4gsi>7bZRzh&hc9Hm`{`Q6XMr)O zr8|l$a2qx9Xb0RkJ`ZZis-u>&E^3P!p-y>c)OG7^`cNw~0psFgRQdH5--|l*zT*V6 z=f9%%_$6k>po3oj50ApAL)93S{yl17OHrTX)2OYwiTb@D-p}s8j<1e7TQgBBxEtH! zpI8uU9P+QQkN>G8_bb&FEJMa4i|0J-mZ+V%46BlV2X%UL9dRF|j#!xZCe+?O#C(|M z7wgCzf!f-g<})m=KmTVq>I$~R$`qJ^+S8k;FJ8i9?uSex)Bwk!8ajnKWS-;hTIEFj zLQ)O&Gh`&{3~jUYyQu4$`h;u02nOr^e?veS<55ez#ypMc=(WW|PP)CXhVe)Ruf_`J+&0V+QJMEkxa(?UsHLeY$oR38>>wsCb4`ZcnSA_O3r_&sL&lcHNA7 zni&u;hB^byQ9m8WqYl?H)X$K07>FCq2-IQz=`{D>OJJWBJb;?XVJmpn3SLBgC$6Dp z{s=X*_oxqy=ZxzpCTd0EqS8~M29h523D1f;l*Lg4YJ0}#J}ezc&^76gTEda224Q3E=Qn)yvs{Wqwy5_r}Ps3L0V>!Ip(Mh&QkkAUvwNK^x}FbQt3 z^n<8-d;wMAfu;Xr#y{ukr$-GW6xB{Ci#J5gxVy^tYk=$5Wg)I|Z7Pp(m5+V*KR$h86bL z_~IYK2rr`YcI)UAaekP2rt-EUeF5<*4YdM1(Hk;W3^P~vTAU;}x-5RPVLca!#rGSPWo@|Gu0 z&%dPW7ten9n)<{2shk-+MH?gV8?FBa-sQaGX)rB?Z_`M7)botA2p9CkCjAg^JYGGy zdGFHjY#Z!QQ+a`^Pu=ajsV%(^?k8PeNIk7+$M=ALWU|ioy7d3~=T`F8@TQ~_J;7ge z@C|iVTf8oL`n!TY){e?v{vzC)`l+mqzi=ai+Jfu&`Quqj;cmQzNH}B-Mz_M7&7R~Z zAiS4~lNeCclib4mJn}yW$Zta%yY!MWl=OF2M!zHIDNdPhNXw}=8tea<#C5#Msq|hY zc)lZZ5(V|V##79uDfwTM-W8h>KhL|+$|NN{J@K=|Gtp@|!g{_ToSJX}@<(7@e9XIy zaxrOVo{z|FBK%px|G#X%i9&10SWB9I(bUt4GWAJ&;-a2s#24}EsYSW3EF4OB8twef zo0jr#iR+1^&2ZxFtz37)6G?AJ+!scqG6DU?z;p`g$6Q+)xJP=_6G^x^FMkg4|7FrY zsAmivj3B();!0aZ{gVpV!;crPii^y|^k0*bIB`0`f=_59U{N+>JJ(fu`wCj z3IBoTsc?aC3mQJcTbTT^#G{^ClsUtIUh|Gr8`%5)(8H`<=>`~MUu z_eG7}gu7Dk3LS019CXr}w1b3`(@=lH!wAQtotVVu;5pJNSi6HMf0y*AXN3h~P)Cn1 zBLy~oF^K-eH@iH~Hq!4B)^Edy8Ne&6^e5q{=PKa})X|fl@*^=J<|Vx?;aB9{Bm6ys zC{B78;x}+5d3*Hp=OCF|$$W}>O5$I1RFSk76nm-ZDN}}cb>2tT<`Bv>ATKFz5a}(6H`e}Fqwq0Y#k-J9J=;iIY+=RuvxBFU#n%%L zBL2NKoRx6YQ`E}rBViTk;k-j>>p2!7FFxrRsn?IR+QgYZ|302T0}`rPLp4boM%qHW zO5xvlyAr-c8h>i?93-BXu%1NJ8^LVqkp7VHEo_LFc=hyicwSLQPeJO%q|7PupX&R6 zg32X`yd)z(8G8OCp3xd8Lq+{U`j-5Z)~UY`|9D89W#lg=u|pi(z0)QAHAklqya)FK>g1DtDVzgWF0)XU2ImbWeS8@MW- zpDCY}vYjb+hxGM?n^|3d5$oR{u1kULR`Dc-K2zz2#nWRj?-0^gV>1l510p=U(#ift*R##=Z2KfJ;imw=n|MIS*P}EbF!k>66 z@fMlx?UKZIl~5P5b!YUXwWiOIUXS<^-mT=_;$1*Xtw~?Xa5_>h!s=`wTwC=>Pln4# z&rftV;e(W~W99y!{ua`so&@?;RnI&MJhRjv34h=Xwqf70^iwpxfwY9!lSaD}o=FFB z2ik67ax1f6%ih;YG$-=`;k4G^ zB*Mce7{EJ)yu`e3NE2 z{!OWro{a7!ezppQh-aZdB$neHPxwChJLza2<#+IAq3rjhwI;s^;Q`iYJ?n8}C*tr+8e_ z8&YPVb*eNylZk&#J4Gq`BMzX<63h^t{u2|~W)07>hF4p>I+e3fxjGe}lGn@Mocl*A z;>CC`*#O#O91AC+{?~-F(Md__zqj_Hs&^;;fb{fMG_D3 z&alb>6y*Ort9T!hHqR>QFJB9i(V2IYr3G1?hQ#xde$CQTkgmTo(en)x*<$575?(?$ zF6lS*qpCK6Xtq3?$^3x^v?}wlJ{BM?A8#GPKk;TJoRadlG3x0-`U&FYdBX@Fpl(si z|CKQRTEtU>_qg@5h>DddH&y5FFA~QwqCY4Q^+Y57h)8}4eZUbkmKe(tze>5e)FGI*RuOZ`8Ay@Iwmj!W9f|BZc|9 zbrRkTo2i ziWw--hDPG^_9eXsdybV!Sn} zlajJ)d83}A1O}1*h_W##6ZM?suSz{zi9Mrm4c=H}9%f`cu`=oXtnsJ{J4ye6cN_`t zH6z{w)ccXfCz2kE@<&Pgmi)g-n~8NuA3#`7a`Jv4e1^0myp`zRv(%r(pNB}8NP#Cb zlIZ_*ywS?Ep-cht9^33rTEnL;u3|$7H=>>Ict;ZMNSV^qtAa;J3ng3>n-Ew3{wIV; zJQ52KJ4&U3mi{H*kRSD=ppgZfDz2|*H<_6T0jslr@^^7I07mXeuT#xWT>$C*%bA)@7H=FeASc*E?d5_VS zo~sT|Zpuw2f3mfig!EATr@|j8*p$jKtU@C)22&_A6>g9o7gzD>xx`!A8kk@{vb^*qL+INN5Fin4`x-_yo&-frX%B5w(G^du$i3TbXq6Bt8*wWw#YGAZ1Qa7Ds3c@q==K*gA(wZWh8GmWjJ-X_8!?rbmq&4@KCRii~C2y7#h$MokF{)umuMa|BvuG!dI=M-lVN0 zZ5pqhE99NAx{L8=m+YxRcrcyr<;_Xj3(9w*Y$f7XtS#Rd5(|ID)?7(pDy||5y?d zkx-d}zaszV|F=Wn8AjT9RidF>IFrl^l+R9F&l(yjPkbdtJw*sKCr!^!IK>73=bw+% z0nc>*KkfUsf(EZqIHxsSga+qPaI(LU`$sMYvyw7_l=%&tVSUP^rtAmedfM?$rQ9$Z z&>G4VBCWTzyPWb#D4SY^d9M2?xR}6gGV)m?C1@ZH74};r-;>_T8W>1gI?Cs#yq@)> zKcxIb(mxXKijllM2oK^NL4G0ff5pqRlZHG!*Qwu@cnd|2P@od8o?aNs8h0st!>QcK zBFU`*FO~05t~l==!q4!8}$e|Za2s{v^x)jFjY*$Dgv z_(xsRK2oM1=@qP=@^+HmleB#F@+WW9b1^D_g(-gxL;NR<3Qqv>@VLc&GE8=1pb;*hd?+D7T9`J1O@a79#JJ|Nj|M&2sC zi7DSsCoB&I-jUGD3iyccC9Kn5!zz!*I8@N{BXtH^xSiF>XPut2^isqxQ}z#wXS8-y z|F8|LtNKV`1;Qw>%`*JQP9=E`l2*ym?@%__I^1DawLDjvWseGAEE`mD+Ac=9OVs~F z`hV8vX#Ip~Po$+arn*n{51w(>a0@I$eq-KGG<5NcvU4f7+Tv4fhT|#!mT+6zy~_aJ zVH(PLv7#F0Nk^G{*iC;KK9554sgR9?WQ22*naUb{PNk2$t4S|Mx}MSI6Y6BPPXD$v zi_- z;l8{t$!}tr-{EG`Dnu2=J>>V*!0J7EWd^GJhwt z5skzpJd0OPK`O^2{E@sF*6`P)|L2WpIc!wS>G8)_j2J$4THy5XNqwfjpR_1q?c|k# z5xyC#10zb$y&E&4^wL++BC4$z5HI4+=Fb5U-t7&}i<**hJ@3%1`BN}?kM~jTt#9Ka2WZQP$ zSpkvBJ9<~fiagQ7yE0nj_r1M|qR-yb&l`L8#(v%vkzM+Gk0hI2eUi87?1PiM{UWPQ i_Wl+>vhYIh{Unk67ogt;L~h*XZ5AAv@RIj#!2bii@Vn>$ diff --git a/loko/interventions/locale/en/LC_MESSAGES/django.po b/loko/interventions/locale/en/LC_MESSAGES/django.po index 75297c6..9e5956f 100644 --- a/loko/interventions/locale/en/LC_MESSAGES/django.po +++ b/loko/interventions/locale/en/LC_MESSAGES/django.po @@ -8137,3 +8137,106 @@ msgstr "Control:" msgid "Équipe de contrôle" msgstr "Control team" +#: interventions/models.py:1260 +msgid "Assignation" +msgstr "Assignment" + +#: interventions/models.py:1284 +msgid "Description de l'événement" +msgstr "Event description" + +#: interventions/models.py:1285 +msgid "Attributs modifiés" +msgstr "Modified attributes" + +#: interventions/templates/interventions/detail/card_chronologie.html:9 +msgid "Chronologie et historique" +msgstr "Timeline and history" + +#: interventions/templates/interventions/detail/card_chronologie.html:18 +msgid "Filtrer l'historique" +msgstr "Filter history" + +#: interventions/templates/interventions/detail/card_chronologie.html:23 +msgid "Afficher les statuts et les assignations" +msgstr "Show statuses and assignments" + +#: interventions/templates/interventions/detail/card_chronologie.html:24 +msgid "Statuts & Assignations" +msgstr "Statuses & Assignments" + +#: interventions/templates/interventions/detail/card_chronologie.html:30 +msgid "Afficher toutes les modifications détaillées" +msgstr "Show all detailed modifications" + +#: interventions/templates/interventions/detail/card_chronologie.html:31 +msgid "Historique complet" +msgstr "Full history" + +#: interventions/templates/interventions/detail/card_chronologie.html:69 +msgid "Assignation mise à jour" +msgstr "Assignment updated" + +#: interventions/templates/interventions/detail/card_chronologie.html:72 +msgid "Intervention initialisée" +msgstr "Intervention initialized" + +#: interventions/templates/interventions/detail/card_chronologie.html:78 +msgid "Intervention transférée" +msgstr "Intervention transferred" + +#: interventions/templates/interventions/detail/card_chronologie.html:92 +msgid "Auteur de la modification" +msgstr "Author of modification" + +#: interventions/templates/interventions/detail/card_chronologie.html:93 +msgid "Système" +msgstr "System" + +#: interventions/templates/interventions/detail/card_chronologie.html:110 +msgid "vide" +msgstr "empty" + +#: interventions/templates/interventions/detail/card_chronologie.html:129 +msgid "Aucun événement enregistré dans l'historique." +msgstr "No events recorded in the history." + +#: interventions/services/timeline_service.py:217 +#, python-format +msgid "Assigné à l'équipe %(team)s (%(member)s)" +msgstr "Assigned to team %(team)s (%(member)s)" + +#: interventions/services/timeline_service.py:222 +#, python-format +msgid "Assigné à l'équipe %(team)s" +msgstr "Assigned to team %(team)s" + +#: interventions/services/timeline_service.py:224 +#, python-format +msgid "Désassigné de l'équipe %(team)s" +msgstr "Unassigned from team %(team)s" + +#: interventions/services/timeline_service.py:226 +#, python-format +msgid "Membre assigné : %(member)s" +msgstr "Assigned member: %(member)s" + +#: interventions/services/timeline_service.py:228 +#, python-format +msgid "Membre retiré : %(member)s" +msgstr "Removed member: %(member)s" + +#: interventions/services/timeline_service.py:231 +#, python-format +msgid "Prestataire : %(provider)s" +msgstr "Provider: %(provider)s" + +#: interventions/services/timeline_service.py:236 +msgid "Mise à jour de l'assignation" +msgstr "Assignment update" + +#: interventions/services/timeline_service.py:379 +#, python-format +msgid "Champs modifiés : %(fields)s" +msgstr "Modified fields: %(fields)s" + diff --git a/loko/interventions/locale/fr/LC_MESSAGES/django.mo b/loko/interventions/locale/fr/LC_MESSAGES/django.mo index 8ece14c6d976580ae63c1059ae1574ff6848c32c..dc5502010fdeefa4a2ec7d03f13b633a92443cbf 100644 GIT binary patch delta 35447 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 b=EPTzLQ?*pzAW{P`u5y&Hobb3DEj{bleDi% diff --git a/loko/interventions/locale/fr/LC_MESSAGES/django.po b/loko/interventions/locale/fr/LC_MESSAGES/django.po index 365e51d..8a2aa86 100644 --- a/loko/interventions/locale/fr/LC_MESSAGES/django.po +++ b/loko/interventions/locale/fr/LC_MESSAGES/django.po @@ -8244,3 +8244,106 @@ msgstr "Contrôle :" msgid "Équipe de contrôle" msgstr "Équipe de contrôle" +#: interventions/models.py:1260 +msgid "Assignation" +msgstr "Assignation" + +#: interventions/models.py:1284 +msgid "Description de l'événement" +msgstr "Description de l'événement" + +#: interventions/models.py:1285 +msgid "Attributs modifiés" +msgstr "Attributs modifiés" + +#: interventions/templates/interventions/detail/card_chronologie.html:9 +msgid "Chronologie et historique" +msgstr "Chronologie et historique" + +#: interventions/templates/interventions/detail/card_chronologie.html:18 +msgid "Filtrer l'historique" +msgstr "Filtrer l'historique" + +#: interventions/templates/interventions/detail/card_chronologie.html:23 +msgid "Afficher les statuts et les assignations" +msgstr "Afficher les statuts et les assignations" + +#: interventions/templates/interventions/detail/card_chronologie.html:24 +msgid "Statuts & Assignations" +msgstr "Statuts & Assignations" + +#: interventions/templates/interventions/detail/card_chronologie.html:30 +msgid "Afficher toutes les modifications détaillées" +msgstr "Afficher toutes les modifications détaillées" + +#: interventions/templates/interventions/detail/card_chronologie.html:31 +msgid "Historique complet" +msgstr "Historique complet" + +#: interventions/templates/interventions/detail/card_chronologie.html:69 +msgid "Assignation mise à jour" +msgstr "Assignation mise à jour" + +#: interventions/templates/interventions/detail/card_chronologie.html:72 +msgid "Intervention initialisée" +msgstr "Intervention initialisée" + +#: interventions/templates/interventions/detail/card_chronologie.html:78 +msgid "Intervention transférée" +msgstr "Intervention transférée" + +#: interventions/templates/interventions/detail/card_chronologie.html:92 +msgid "Auteur de la modification" +msgstr "Auteur de la modification" + +#: interventions/templates/interventions/detail/card_chronologie.html:93 +msgid "Système" +msgstr "Système" + +#: interventions/templates/interventions/detail/card_chronologie.html:110 +msgid "vide" +msgstr "vide" + +#: interventions/templates/interventions/detail/card_chronologie.html:129 +msgid "Aucun événement enregistré dans l'historique." +msgstr "Aucun événement enregistré dans l'historique." + +#: interventions/services/timeline_service.py:217 +#, python-format +msgid "Assigné à l'équipe %(team)s (%(member)s)" +msgstr "Assigné à l'équipe %(team)s (%(member)s)" + +#: interventions/services/timeline_service.py:222 +#, python-format +msgid "Assigné à l'équipe %(team)s" +msgstr "Assigné à l'équipe %(team)s" + +#: interventions/services/timeline_service.py:224 +#, python-format +msgid "Désassigné de l'équipe %(team)s" +msgstr "Désassigné de l'équipe %(team)s" + +#: interventions/services/timeline_service.py:226 +#, python-format +msgid "Membre assigné : %(member)s" +msgstr "Membre assigné : %(member)s" + +#: interventions/services/timeline_service.py:228 +#, python-format +msgid "Membre retiré : %(member)s" +msgstr "Membre retiré : %(member)s" + +#: interventions/services/timeline_service.py:231 +#, python-format +msgid "Prestataire : %(provider)s" +msgstr "Prestataire : %(provider)s" + +#: interventions/services/timeline_service.py:236 +msgid "Mise à jour de l'assignation" +msgstr "Mise à jour de l'assignation" + +#: interventions/services/timeline_service.py:379 +#, python-format +msgid "Champs modifiés : %(fields)s" +msgstr "Champs modifiés : %(fields)s" + diff --git a/loko/interventions/locale/nl/LC_MESSAGES/django.mo b/loko/interventions/locale/nl/LC_MESSAGES/django.mo index 7a7f1a940b49b4e7c38f7d8a1dbe342f7d576603..475ac13c19a9b1df361f0a11912705a592fd030f 100644 GIT binary patch delta 34615 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

s+||8dLOJ_wai&chB^yb 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 W9_)7B%kCBI?;j9#| delta 33096 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 z InterventionTimeLine: + """Crée et enregistre un événement dans la chronologie de l'intervention.""" + event_user = user if getattr(user, 'is_authenticated', False) else None + if event_time is None: + event_time = timezone.now() + + return InterventionTimeLine.objects.create( + intervention=intervention, + event_user=event_user, + event_time=event_time, + event_type=event_type, + from_status=from_status, + to_status=to_status, + event_description=description or "", + field_changes=field_changes or {}, + ) + + +def record_assignment_event( + intervention: Intervention, + user, + old_team=None, + new_team=None, + old_member=None, + new_member=None, + old_provider=None, + new_provider=None, + old_control_team=None, + new_control_team=None, + old_controller=None, + new_controller=None, + description: Optional[str] = None, + event_time=None, +) -> Optional[InterventionTimeLine]: + """Enregistre un événement d'assignation explicite avec détails des modifications.""" + changes = {} + + def get_obj_name(obj): + if not obj: + return None + if hasattr(obj, 'get_name') and callable(obj.get_name): + return obj.get_name() + if hasattr(obj, 'name'): + return str(obj.name) + return str(obj) + + if old_provider != new_provider: + changes['assigned_provider'] = { + 'label': str(_("Prestataire assigné")), + 'old': get_obj_name(old_provider), + 'new': get_obj_name(new_provider), + } + + if old_team != new_team: + changes['assigned_team'] = { + 'label': str(_("Équipe assignée")), + 'old': get_obj_name(old_team), + 'new': get_obj_name(new_team), + } + + if old_member != new_member: + changes['assigned_member'] = { + 'label': str(_("Membre assigné")), + 'old': get_obj_name(old_member), + 'new': get_obj_name(new_member), + } + + if old_control_team != new_control_team: + changes['assigned_control_team'] = { + 'label': str(_("Équipe de contrôle")), + 'old': get_obj_name(old_control_team), + 'new': get_obj_name(new_control_team), + } + + if old_controller != new_controller: + changes['assigned_controller'] = { + 'label': str(_("Contrôleur assigné")), + 'old': get_obj_name(old_controller), + 'new': get_obj_name(new_controller), + } + + if not changes and not description: + return None + + if not description: + # Construire une description intuitive + parts = [] + new_team_name = get_obj_name(new_team) + new_member_name = get_obj_name(new_member) + old_team_name = get_obj_name(old_team) + + if new_team and new_member: + parts.append(_("Assigné à l'équipe %(team)s (%(member)s)") % { + 'team': new_team_name, + 'member': new_member_name, + }) + elif new_team: + parts.append(_("Assigné à l'équipe %(team)s") % {'team': new_team_name}) + elif old_team and not new_team: + parts.append(_("Désassigné de l'équipe %(team)s") % {'team': old_team_name}) + elif new_member and not old_member: + parts.append(_("Membre assigné : %(member)s") % {'member': new_member_name}) + elif old_member and not new_member: + parts.append(_("Membre retiré : %(member)s") % {'member': get_obj_name(old_member)}) + + if old_provider != new_provider and new_provider: + parts.append(_("Prestataire : %(provider)s") % {'provider': get_obj_name(new_provider)}) + + if old_control_team != new_control_team and new_control_team: + parts.append(_("Contrôle : %(team)s") % {'team': get_obj_name(new_control_team)}) + + description = " | ".join(parts) if parts else _("Mise à jour de l'assignation") + + return record_timeline_event( + intervention=intervention, + user=user, + event_type='assignment', + description=str(description), + field_changes=changes, + event_time=event_time, + ) + + +class InterventionChangeTracker: + """Capture l'état initial d'une intervention et enregistre les modifications apportées.""" + + TRACKED_FIELDS = [ + 'title', 'description', 'priority', 'maintain_type', 'type', + 'sub_type', 'origin_type', 'asset_category', 'symptom', + 'source_category', 'source_ref', 'source_detail', + 'contract', 'order', 'osiris', 'pmo_number', 'linked_folder', + 'address', 'lat', 'lon', + 'planned_begin_time', 'planned_end_time', + 'expected_begin_time', 'expected_end_time', + 'begin_time', 'end_time', + 'assigned_provider', 'assigned_team', 'assigned_member', + 'assigned_control_team', 'assigned_controller', + ] + + def __init__(self, intervention: Intervention, user=None): + self.intervention = intervention + self.user = user + self.snapshot = self._take_snapshot() + + def _take_snapshot(self) -> Dict[str, Any]: + snapshot = {} + for field in self.TRACKED_FIELDS: + val = getattr(self.intervention, field, None) + snapshot[field] = val + return snapshot + + def detect_changes(self) -> Tuple[Dict[str, Any], Dict[str, Any]]: + """Compare l'état actuel avec le snapshot et retourne (assignment_changes, other_changes).""" + assignment_changes = {} + other_changes = {} + + for field in self.TRACKED_FIELDS: + old_raw = self.snapshot.get(field) + new_raw = getattr(self.intervention, field, None) + + # Comparaison normalisée + if self._has_changed(field, old_raw, new_raw): + meta = FIELD_METADATA.get(field, {'label': field, 'is_assignment': False}) + old_disp = _format_field_value(self.intervention, field, old_raw) + new_disp = _format_field_value(self.intervention, field, new_raw) + + # Éviter un faux changement si les affichages sont identiques + if old_disp == new_disp and (old_raw is not None or new_raw is not None): + continue + + change_data = { + 'label': str(meta['label']), + 'old': old_disp, + 'new': new_disp, + } + + if meta['is_assignment']: + assignment_changes[field] = change_data + else: + other_changes[field] = change_data + + return assignment_changes, other_changes + + def _has_changed(self, field: str, old_val, new_val) -> bool: + """Détecte si la valeur d'un champ a réellement changé.""" + if old_val is None and new_val is None: + return False + + if field in ('lat', 'lon'): + if old_val is None or new_val is None: + return old_val != new_val + try: + return round(float(old_val), 5) != round(float(new_val), 5) + except (ValueError, TypeError): + return old_val != new_val + + # Objets de modèle ForeignKey + if hasattr(old_val, 'pk') or hasattr(new_val, 'pk'): + old_pk = getattr(old_val, 'pk', None) + new_pk = getattr(new_val, 'pk', None) + return old_pk != new_pk + + # Chaines de caractères + if isinstance(old_val, str) or isinstance(new_val, str): + s_old = (old_val or "").strip() + s_new = (new_val or "").strip() + return s_old != s_new + + return old_val != new_val + + def record_changes(self, user=None, event_time=None) -> Tuple[Optional[InterventionTimeLine], Optional[InterventionTimeLine]]: + """Détecte les modifications et crée les événements correspondants dans la chronologie.""" + if user is None: + user = self.user + assignment_changes, other_changes = self.detect_changes() + assignment_event = None + modification_event = None + + if not assignment_changes and not other_changes: + return None, None + + if event_time is None: + event_time = timezone.now() + + # Enregistrer l'auteur de la dernière modification sur l'intervention + if getattr(user, 'is_authenticated', False): + self.intervention.last_modified_by = user + self.intervention.save(update_fields=['last_modified_by']) + + # 1. Enregistrement d'un événement d'assignation si des champs d'assignation ont changé + if assignment_changes: + old_team = self.snapshot.get('assigned_team') + new_team = getattr(self.intervention, 'assigned_team', None) + old_member = self.snapshot.get('assigned_member') + new_member = getattr(self.intervention, 'assigned_member', None) + old_provider = self.snapshot.get('assigned_provider') + new_provider = getattr(self.intervention, 'assigned_provider', None) + + assignment_event = record_assignment_event( + intervention=self.intervention, + user=user, + old_team=old_team, + new_team=new_team, + old_member=old_member, + new_member=new_member, + old_provider=old_provider, + new_provider=new_provider, + old_control_team=self.snapshot.get('assigned_control_team'), + new_control_team=getattr(self.intervention, 'assigned_control_team', None), + old_controller=self.snapshot.get('assigned_controller'), + new_controller=getattr(self.intervention, 'assigned_controller', None), + event_time=event_time, + ) + + # 2. Enregistrement d'un événement de modification si d'autres attributs ont changé + if other_changes: + changed_labels = [c['label'] for c in other_changes.values()] + desc = _("Champs modifiés : %(fields)s") % {'fields': ", ".join(changed_labels)} + + modification_event = record_timeline_event( + intervention=self.intervention, + user=user, + event_type='modification', + description=str(desc), + field_changes=other_changes, + event_time=event_time, + ) + + return assignment_event, modification_event diff --git a/loko/interventions/static/interventions/timeline.css b/loko/interventions/static/interventions/timeline.css index 172c407..e27fa1d 100644 --- a/loko/interventions/static/interventions/timeline.css +++ b/loko/interventions/static/interventions/timeline.css @@ -142,3 +142,85 @@ background-color: rgba(13, 110, 253, 0.05); } +/* ========================================================================== + Historique et Chronologie des Interventions (Detail view) + ========================================================================== */ +.history-timeline { + position: relative; + padding-left: 2.25rem; + margin: 0.5rem 0 0.5rem 0; +} + +.history-timeline::before { + content: ''; + position: absolute; + top: 14px; + bottom: 14px; + left: 15px; + width: 2px; + background: #e2e8f0; +} + +.history-timeline-item { + position: relative; + margin-bottom: 0.85rem; + transition: opacity 0.2s ease, transform 0.2s ease; +} + +.history-timeline-item:last-child { + margin-bottom: 0; +} + +.history-timeline-node { + position: absolute; + left: -2.25rem; + top: 4px; + width: 32px; + height: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 13px; + z-index: 2; + box-shadow: 0 0 0 3px #ffffff, 0 1px 3px rgba(0, 0, 0, 0.12); +} + +.history-timeline-card { + background-color: #ffffff; + border: 1px solid #e9ecef; + border-radius: 8px; + padding: 0.65rem 0.85rem; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); + transition: border-color 0.15s ease, box-shadow 0.15s ease; +} + +.history-timeline-card:hover { + border-color: #cbd5e1; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.07); +} + +.history-item-modification .history-timeline-card { + background-color: #fafbfc; + border-left: 3px solid #94a3b8; +} + +.history-changes { + background: #f8fafc; + border-radius: 6px; + padding: 0.35rem 0.6rem; + margin-top: 0.5rem; +} + +.history-field-row { + font-family: inherit; + line-height: 1.4; + word-break: break-word; +} + +.history-field-row:not(:last-child) { + border-bottom: 1px dashed #e2e8f0; + padding-bottom: 0.25rem; + margin-bottom: 0.25rem; +} + diff --git a/loko/interventions/templates/interventions/detail/card_chronologie.html b/loko/interventions/templates/interventions/detail/card_chronologie.html index c85bfd1..8e97430 100644 --- a/loko/interventions/templates/interventions/detail/card_chronologie.html +++ b/loko/interventions/templates/interventions/detail/card_chronologie.html @@ -1,28 +1,158 @@ {% load i18n short_name tz %} -

-
-

{% translate "Chronologie" %}

-
-
- - - - - - - - - - - {% for event in intervention.events.all %} - - - - - - - {% endfor %} - -
{% translate "Date" %}{% translate "Evénement" %}{% translate "Statut" %}{% translate "Utilisateur" %}
{{ event.event_time|timezone:"Europe/Brussels"|date:"d-m-Y H:i" }}{{ event.get_event_type_display }}{{ event.get_to_status_display }}{{ event.event_user|short_name }}
+
+
+
+

+ + {% translate "Chronologie et historique" %} +

+ + {{ timeline_default_count|default:intervention.events.count }} + +
+ + +
+
+ +
+
+ +
+ {% with events_list=timeline_events|default:intervention.events.all %} + {% if events_list %} +
+ {% for event in events_list %} +
+ +
+ +
+ + +
+
+ +
+ {% if event.event_type == 'status_change' %} + {% translate "Statut" %} + {% if event.from_status %} + {{ event.get_from_status_display }} + + {% endif %} + {{ event.get_to_status_display }} + {% if event.event_description %} + ({{ event.event_description }}) + {% endif %} + {% elif event.event_type == 'assignment' %} + {% translate "Assignation" %} + {{ event.event_description|default:_("Assignation mise à jour") }} + {% elif event.event_type == 'creation' %} + {% translate "Création" %} + {% translate "Intervention initialisée" %} + {% if event.to_status %} + {{ event.get_to_status_display }} + {% endif %} + {% elif event.event_type == 'transfer' %} + {% translate "Transfert" %} + {{ event.event_description|default:_("Intervention transférée") }} + {% elif event.event_type == 'modification' %} + {% translate "Modification" %} + {{ event.event_description|default:_("Attributs modifiés") }} + {% else %} + {{ event.get_event_type_display }} + {% if event.to_status %} + {{ event.get_to_status_display }} + {% endif %} + {% endif %} +
+ + +
+ + {{ event.event_user|short_name|default:_("Système") }} + + + {{ event.event_time|timezone:"Europe/Brussels"|date:"d/m/Y H:i" }} + +
+
+ + + {% if event.field_changes %} +
+ {% for field_key, change in event.field_changes.items %} +
+ {{ change.label|default:field_key }} + {% if change.old %} + {{ change.old }} + {% else %} + ({% translate "vide" %}) + {% endif %} + + {% if change.new %} + {{ change.new }} + {% else %} + ({% translate "vide" %}) + {% endif %} +
+ {% endfor %} +
+ {% endif %} +
+
+ {% endfor %} +
+ {% else %} +
+ +

{% translate "Aucun événement enregistré dans l'historique." %}

+
+ {% endif %} + {% endwith %} +
+
+ + diff --git a/loko/interventions/templates/interventions/detail/styles.html b/loko/interventions/templates/interventions/detail/styles.html index b646f41..10de605 100644 --- a/loko/interventions/templates/interventions/detail/styles.html +++ b/loko/interventions/templates/interventions/detail/styles.html @@ -489,4 +489,84 @@ background-color: #6b226e !important; color: #ffffff !important; } + + /* Historique et Chronologie des Interventions (Detail view) */ + .history-timeline { + position: relative; + padding-left: 2.25rem; + margin: 0.5rem 0 0.5rem 0; + } + + .history-timeline::before { + content: ''; + position: absolute; + top: 14px; + bottom: 14px; + left: 15px; + width: 2px; + background: #e2e8f0; + } + + .history-timeline-item { + position: relative; + margin-bottom: 0.85rem; + transition: opacity 0.2s ease, transform 0.2s ease; + } + + .history-timeline-item:last-child { + margin-bottom: 0; + } + + .history-timeline-node { + position: absolute; + left: -2.25rem; + top: 4px; + width: 32px; + height: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 13px; + z-index: 2; + box-shadow: 0 0 0 3px #ffffff, 0 1px 3px rgba(0, 0, 0, 0.12); + } + + .history-timeline-card { + background-color: #ffffff; + border: 1px solid #e9ecef; + border-radius: 8px; + padding: 0.65rem 0.85rem; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); + transition: border-color 0.15s ease, box-shadow 0.15s ease; + } + + .history-timeline-card:hover { + border-color: #cbd5e1; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.07); + } + + .history-item-modification .history-timeline-card { + background-color: #fafbfc; + border-left: 3px solid #94a3b8; + } + + .history-changes { + background: #f8fafc; + border-radius: 6px; + padding: 0.35rem 0.6rem; + margin-top: 0.5rem; + } + + .history-field-row { + font-family: inherit; + line-height: 1.4; + word-break: break-word; + } + + .history-field-row:not(:last-child) { + border-bottom: 1px dashed #e2e8f0; + padding-bottom: 0.25rem; + margin-bottom: 0.25rem; + } diff --git a/loko/interventions/tests/test_timeline_history.py b/loko/interventions/tests/test_timeline_history.py new file mode 100644 index 0000000..3b6e9eb --- /dev/null +++ b/loko/interventions/tests/test_timeline_history.py @@ -0,0 +1,235 @@ +import json +from django.test import TestCase +from django.contrib.auth import get_user_model +from django.urls import reverse +from django.utils import timezone + +from common.models import UserConfig, Role, Thematic +from contracts.models import Company, CompanyTeam, CompanyMember +from interventions.models import Intervention, InterventionTimeLine +from interventions.services.timeline_service import ( + record_timeline_event, + record_assignment_event, + InterventionChangeTracker, +) + + +class TimelineHistoryTests(TestCase): + def setUp(self): + User = get_user_model() + self.user = User.objects.create_user( + username='agent_test', + password='secret_password', + first_name='Jean', + last_name='Dupont' + ) + self.user2 = User.objects.create_user( + username='agent_two', + password='secret_password', + first_name='Marie', + last_name='Curie' + ) + self.role_admin, _ = Role.objects.get_or_create(name='admin') + self.user_config = UserConfig.objects.create(user=self.user, is_intern=True) + self.user_config.roles.add(self.role_admin) + + self.thematic, _ = Thematic.objects.get_or_create(code='trafficlights', defaults={'name_fr': 'Signalisation', 'name_nl': 'Signalisatie'}) + + self.company = Company.objects.create(name='StreetUp Tech') + self.team = CompanyTeam.objects.create(company=self.company, name='Équipe Signalisation') + self.team.thematics.add(self.thematic) + self.team2 = CompanyTeam.objects.create(company=self.company, name='Équipe Éclairage') + self.team2.thematics.add(self.thematic) + + self.member = CompanyMember.objects.create(name='Jean Dupont', user=self.user) + self.member.teams.add(self.team) + self.member2 = CompanyMember.objects.create(name='Marie Curie', user=self.user2) + self.member2.teams.add(self.team2) + + self.intervention = Intervention.objects.create( + title='Test Intervention Timeline', + status='in_preparation', + priority='2', + thematic=self.thematic, + assigned_provider=self.company, + assigned_team=self.team, + assigned_member=self.member, + ) + + def test_timeline_model_properties_and_helpers(self): + """Test InterventionTimeLine model properties, icons, badge classes and filters.""" + # Status change event + event_status = InterventionTimeLine.objects.create( + intervention=self.intervention, + event_user=self.user, + event_time=timezone.now(), + event_type='status_change', + from_status='in_preparation', + to_status='planned', + event_description='Passage en planifié' + ) + self.assertTrue(event_status.is_status_change) + self.assertTrue(event_status.is_default_visible) + self.assertFalse(event_status.is_modification) + self.assertFalse(event_status.is_assignment) + self.assertEqual(event_status.get_badge_class(), 'bg-primary') + self.assertEqual(event_status.get_icon(), 'bi-arrow-repeat') + + # Assignment event + event_assign = InterventionTimeLine.objects.create( + intervention=self.intervention, + event_user=self.user, + event_time=timezone.now(), + event_type='assignment', + event_description='Assigné à Jean Dupont' + ) + self.assertTrue(event_assign.is_assignment) + self.assertTrue(event_assign.is_default_visible) + self.assertFalse(event_assign.is_modification) + self.assertIn('bg-info', event_assign.get_badge_class()) + self.assertEqual(event_assign.get_icon(), 'bi-person-check-fill') + + # Modification event + event_mod = InterventionTimeLine.objects.create( + intervention=self.intervention, + event_user=self.user, + event_time=timezone.now(), + event_type='modification', + event_description='Attributs modifiés', + field_changes={'priority': {'label': 'Priorité', 'old': 'Bas', 'new': 'Elevé'}} + ) + self.assertTrue(event_mod.is_modification) + self.assertFalse(event_mod.is_default_visible) + self.assertEqual(event_mod.get_badge_class(), 'bg-secondary') + self.assertEqual(event_mod.get_icon(), 'bi-pencil-fill') + + def test_change_tracker_records_modifications(self): + """Test that InterventionChangeTracker records field modifications.""" + tracker = InterventionChangeTracker(self.intervention, user=self.user) + self.intervention.priority = '4' + self.intervention.title = 'Nouveau titre' + self.intervention.save() + assign_event, mod_event = tracker.record_changes() + + self.assertIsNone(assign_event) + self.assertIsNotNone(mod_event) + self.assertEqual(mod_event.event_type, 'modification') + self.assertEqual(mod_event.event_user, self.user) + self.assertIn('priority', mod_event.field_changes) + self.assertIn('title', mod_event.field_changes) + self.assertEqual(mod_event.field_changes['title']['old'], 'Test Intervention Timeline') + self.assertEqual(mod_event.field_changes['title']['new'], 'Nouveau titre') + self.assertEqual(self.intervention.last_modified_by, self.user) + + def test_change_tracker_records_assignment_change(self): + """Test that changing assigned_member or assigned_team generates an assignment event.""" + tracker = InterventionChangeTracker(self.intervention, user=self.user) + self.intervention.assigned_member = self.member2 + self.intervention.assigned_team = self.team2 + self.intervention.save() + assign_event, mod_event = tracker.record_changes() + + self.assertIsNotNone(assign_event) + self.assertEqual(assign_event.event_type, 'assignment') + self.assertEqual(assign_event.event_user, self.user) + self.assertIn('assigned_member', assign_event.field_changes) + self.assertIn('assigned_team', assign_event.field_changes) + + def test_change_tracker_no_changes(self): + """Test that if nothing changed, no timeline event is generated.""" + tracker = InterventionChangeTracker(self.intervention, user=self.user) + # No modification to fields + self.intervention.save() + assign_event, mod_event = tracker.record_changes() + self.assertIsNone(assign_event) + self.assertIsNone(mod_event) + + def test_update_intervention_view_tracks_modification(self): + """Test update_intervention view logs attribute changes into InterventionTimeLine.""" + self.client.login(username='agent_test', password='secret_password') + url = reverse('interventions:update_intervention', args=[self.intervention.id]) + payload = { + 'title': 'Titre via AJAX', + 'priority': '1' + } + response = self.client.post(url, data=json.dumps(payload), content_type='application/json') + self.assertEqual(response.status_code, 200) + + self.intervention.refresh_from_db() + self.assertEqual(self.intervention.title, 'Titre via AJAX') + self.assertEqual(self.intervention.priority, '1') + self.assertEqual(self.intervention.last_modified_by, self.user) + + mod_event = self.intervention.events.filter(event_type='modification').last() + self.assertIsNotNone(mod_event) + self.assertEqual(mod_event.event_user, self.user) + self.assertIn('title', mod_event.field_changes) + self.assertIn('priority', mod_event.field_changes) + + def test_update_intervention_view_tracks_assignment(self): + """Test update_intervention view logs assignment changes.""" + self.client.login(username='agent_test', password='secret_password') + url = reverse('interventions:update_intervention', args=[self.intervention.id]) + payload = { + 'member_assignment': f'member-{self.member2.id}', + } + response = self.client.post(url, data=json.dumps(payload), content_type='application/json') + self.assertEqual(response.status_code, 200) + + self.intervention.refresh_from_db() + self.assertEqual(self.intervention.assigned_member, self.member2) + + assign_event = self.intervention.events.filter(event_type='assignment').last() + self.assertIsNotNone(assign_event) + self.assertEqual(assign_event.event_user, self.user) + self.assertIn('assigned_member', assign_event.field_changes) + + def test_intervention_detail_view_context(self): + """Test intervention_detail provides timeline counts and events in context.""" + # Create a creation event, an assignment event and a modification event + InterventionTimeLine.objects.create( + intervention=self.intervention, + event_user=self.user, + event_time=timezone.now(), + event_type='creation', + to_status='in_preparation' + ) + InterventionTimeLine.objects.create( + intervention=self.intervention, + event_user=self.user, + event_time=timezone.now(), + event_type='assignment', + event_description='Assigné à l’équipe' + ) + InterventionTimeLine.objects.create( + intervention=self.intervention, + event_user=self.user, + event_time=timezone.now(), + event_type='modification', + event_description='Titre modifié' + ) + + self.client.login(username='agent_test', password='secret_password') + url = reverse('interventions:intervention_detail', args=[self.intervention.id]) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + self.assertIn('timeline_events', response.context) + self.assertIn('timeline_default_count', response.context) + self.assertIn('timeline_modification_count', response.context) + self.assertIn('timeline_total_count', response.context) + self.assertGreaterEqual(response.context['timeline_default_count'], 2) + self.assertGreaterEqual(response.context['timeline_modification_count'], 1) + self.assertGreaterEqual(response.context['timeline_total_count'], 3) + + # Check that response content contains IDs, classes and shortname + self.assertContains(response, 'id="section-chronologie"') + self.assertContains(response, 'id="btnHistoryDefault"') + self.assertContains(response, 'id="btnHistoryFull"') + self.assertContains(response, 'history-timeline') + self.assertContains(response, 'Jean D.') + + from django.utils import translation + with translation.override('fr'): + response_fr = self.client.get(url, HTTP_ACCEPT_LANGUAGE='fr') + self.assertContains(response_fr, 'Historique complet') diff --git a/loko/interventions/views/calendar.py b/loko/interventions/views/calendar.py index 51f30dd..95f89e3 100644 --- a/loko/interventions/views/calendar.py +++ b/loko/interventions/views/calendar.py @@ -1303,6 +1303,8 @@ def interventions_schedule_update(request): # Déterminer si l'assignation va réellement changer prev_member_id = intervention.assigned_member_id prev_team_id = intervention.assigned_team_id + prev_member = intervention.assigned_member + prev_team = intervention.assigned_team assignment_will_change = False if member_key_present: @@ -1434,8 +1436,31 @@ def interventions_schedule_update(request): fields.append('status') with transaction.atomic(): + if getattr(request.user, 'is_authenticated', False): + intervention.last_modified_by = request.user + if 'last_modified_by' not in fields: + fields.append('last_modified_by') intervention.save(update_fields=fields) _log_planning_change(intervention, request.user, prev_begin, prev_end, prev_status if new_status != prev_status else None) + if 'assigned_team' in fields or 'assigned_member' in fields: + from interventions.services.timeline_service import record_assignment_event + record_assignment_event( + intervention=intervention, + user=request.user, + old_team=prev_team, + new_team=intervention.assigned_team, + old_member=prev_member, + new_member=intervention.assigned_member, + ) + if new_status != prev_status: + from interventions.services.timeline_service import record_timeline_event + record_timeline_event( + intervention=intervention, + user=request.user, + event_type='status_change', + from_status=prev_status, + to_status=new_status, + ) return JsonResponse({ 'success': True, diff --git a/loko/interventions/views/detail.py b/loko/interventions/views/detail.py index 214dc35..e6f81ba 100644 --- a/loko/interventions/views/detail.py +++ b/loko/interventions/views/detail.py @@ -63,6 +63,7 @@ from interventions.models import (InterventionSubscription, Intervention, Interv InterventionPostPeriodQuantity, InterventionEmailLog, InterventionAssignment) from interventions.models import STATUS_CHOICES, STATUS_ORDERS, MAINTAIN_CHOICES, TYPE_CHOICES, ORIGIN_TYPE_CHOICES, PAUSE_REASON_CHOICES, get_type_choices from interventions.services.document_sequencing import get_sequenced_intervention_documents +from interventions.services.timeline_service import InterventionChangeTracker from interventions.views.forms import (InterventionForm, InterventionNoteForm, InterventionDocumentForm, InterventionOccupationForm, PreventiveInterventionForm, AssetsLinkForm, LinkExistingInterventionsForm) @@ -647,6 +648,38 @@ def intervention_detail(request, intervention_id): for st in sub_types_qs ) + # Événements de la chronologie / historique + timeline_events = list( + intervention.events.select_related('event_user').order_by('event_time') + ) + has_assignment_event = any(e.is_assignment for e in timeline_events) + if not has_assignment_event and (intervention.assigned_team or intervention.assigned_member or intervention.assigned_provider): + desc_parts = [] + team_name = intervention.assigned_team.name if intervention.assigned_team else None + member_name = intervention.assigned_member.name if intervention.assigned_member else None + if team_name and member_name: + desc_parts.append(_("Assigné à l'équipe %(team)s (%(member)s)") % {'team': team_name, 'member': member_name}) + elif team_name: + desc_parts.append(_("Assigné à l'équipe %(team)s") % {'team': team_name}) + elif member_name: + desc_parts.append(_("Membre assigné : %(member)s") % {'member': member_name}) + if intervention.assigned_provider: + desc_parts.append(_("Prestataire : %(provider)s") % {'provider': intervention.assigned_provider.name}) + + synth_event = InterventionTimeLine( + intervention=intervention, + event_user=intervention.created_by, + event_time=intervention.creation_time, + event_type='assignment', + event_description=" | ".join(desc_parts), + field_changes={}, + ) + insert_idx = 1 if (timeline_events and timeline_events[0].is_creation) else 0 + timeline_events.insert(insert_idx, synth_event) + + timeline_default_count = sum(1 for e in timeline_events if e.is_default_visible) + timeline_modification_count = sum(1 for e in timeline_events if e.is_modification) + context = { "intervention": intervention, "status_choices" : [{"key": key, "label": label} for key, label in STATUS_CHOICES.items()], @@ -727,6 +760,11 @@ def intervention_detail(request, intervention_id): 'has_period_quantities': intervention.period_quantities.exists(), 'future_planned_events': future_planned_events, 'future_realized_events': future_realized_events, + # Timeline / Chronologie + 'timeline_events': timeline_events, + 'timeline_default_count': timeline_default_count, + 'timeline_modification_count': timeline_modification_count, + 'timeline_total_count': len(timeline_events), # Historique des envois d'emails (ordre chronologique) 'email_logs': intervention.email_logs.order_by('sent_at'), # Operation editing data (same as mobile) @@ -2704,6 +2742,8 @@ def update_intervention(request, intervention_id): return 3 return 4 + tracker = InterventionChangeTracker(intervention) + for field, new_value in sorted(data.items(), key=_field_priority): if field not in allowed_update_fields: errors.append(_('You do not have permission to update field: %(field)s') % {'field': field}) @@ -2717,7 +2757,9 @@ def update_intervention(request, intervention_id): errors.append(error) if updated_fields: + intervention.last_modified_by = request.user intervention.save() + tracker.record_changes(request.user) # Handle notes if provided if notes_data: @@ -2755,12 +2797,16 @@ def update_intervention(request, intervention_id): elif field == "realization": return _handle_realization_update(request, intervention) + tracker = InterventionChangeTracker(intervention) + # Handle standard fields success, error = _update_intervention_field(intervention, field, new_value, user_config=user_config) if not success: return JsonResponse({'success': False, 'error': error}, status=400) + intervention.last_modified_by = request.user intervention.save() + tracker.record_changes(request.user) return JsonResponse({ 'success': True, diff --git a/loko/interventions/views/mobile.py b/loko/interventions/views/mobile.py index e5b8a22..7922ff4 100644 --- a/loko/interventions/views/mobile.py +++ b/loko/interventions/views/mobile.py @@ -2280,6 +2280,26 @@ def transfer_intervention(request, intervention_id): # Record the transfer in timeline event_time = now() + # Add a note about the transfer + transfer_note = _("Intervention transférée de %(from_member)s (%(from_team)s) vers %(to_member)s (%(to_team)s)") % { + 'from_member': old_member.name if old_member else _("non assigné"), + 'from_team': old_team.name if old_team else _("aucune équipe"), + 'to_member': target_member.name, + 'to_team': target_team.name if target_team else _("aucune équipe"), + } + transfer_changes = { + 'assigned_team': { + 'label': str(_("Équipe assignée")), + 'old': old_team.name if old_team else None, + 'new': target_team.name if target_team else None, + }, + 'assigned_member': { + 'label': str(_("Membre assigné")), + 'old': old_member.name if old_member else None, + 'new': target_member.name, + } + } + # Always record the transfer event InterventionTimeLine.objects.create( intervention=intervention, @@ -2288,6 +2308,8 @@ def transfer_intervention(request, intervention_id): event_type='transfer', from_status=old_status, to_status=old_status, # Status before any change + event_description=transfer_note, + field_changes=transfer_changes, ) # If status changed, also record a status change event @@ -2299,15 +2321,9 @@ def transfer_intervention(request, intervention_id): event_type='status_change', from_status=old_status, to_status=intervention.status, + event_description=_("Passage en pause automatique suite au transfert."), ) - - # Add a note about the transfer - transfer_note = _("Intervention transférée de %(from_member)s (%(from_team)s) vers %(to_member)s (%(to_team)s)") % { - 'from_member': old_member.name if old_member else _("non assigné"), - 'from_team': old_team.name if old_team else _("aucune équipe"), - 'to_member': target_member.name, - 'to_team': target_team.name if target_team else _("aucune équipe"), - } + if status_changed: transfer_note += " - " + _("Statut changé automatiquement de 'Démarré' à 'En pause'.")