From d912313a27d01b8626f4f1752e69db6e6ab2c49d Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Sun, 2 Nov 2025 16:03:03 +0300 Subject: [PATCH] update --- db.sqlite3 | Bin 8568832 -> 8581120 bytes finance/__pycache__/admin.cpython-312.pyc | Bin 9459 -> 9855 bytes finance/__pycache__/forms.cpython-312.pyc | Bin 20307 -> 20971 bytes finance/__pycache__/models.cpython-312.pyc | Bin 34550 -> 37423 bytes finance/__pycache__/views.cpython-312.pyc | Bin 45755 -> 47997 bytes finance/admin.py | 17 +- finance/forms.py | 66 ++- ..._total_sessions_packageservice_and_more.py | 73 +++ ...ns_packageservice_and_more.cpython-312.pyc | Bin 0 -> 3240 bytes finance/models.py | 50 +- finance/templates/finance/package_form.html | 220 +++++++- finance/views.py | 86 ++- hr/templates/hr/schedule_grid.html | 2 +- hr/templatetags/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 156 bytes .../__pycache__/hr_tags.cpython-312.pyc | Bin 0 -> 633 bytes hr/templatetags/hr_tags.py | 14 + logs/django.log | 494 ++++++++++++++++++ templates/partial/header.html | 1 + templates/partial/theme-panel.html | 376 ++++++------- 20 files changed, 1150 insertions(+), 249 deletions(-) create mode 100644 finance/migrations/0005_alter_package_total_sessions_packageservice_and_more.py create mode 100644 finance/migrations/__pycache__/0005_alter_package_total_sessions_packageservice_and_more.cpython-312.pyc create mode 100644 hr/templatetags/__init__.py create mode 100644 hr/templatetags/__pycache__/__init__.cpython-312.pyc create mode 100644 hr/templatetags/__pycache__/hr_tags.cpython-312.pyc create mode 100644 hr/templatetags/hr_tags.py diff --git a/db.sqlite3 b/db.sqlite3 index 6a15e27f0fab15a8c52735ed7a1af2b0249445f4..7d98912a5c24ccfbc8ba778a29b952ddb7bf1590 100644 GIT binary patch delta 5275 zcma)=3v?9K8GvVIXLmNcJ2Sh1m_Q(G9*{&JnfLAl0;CWGae1gHh_cS?&O*ZGK@vbw zn*=ay<(%^7s;xFBRfCEGMwy~kQBRL}w7S?@!Pmj+Ijud_L$#+?snUOD2|--XlFhew z@4f$j=fC&<|9wnP&o;8>^fq!wao`Asxoa^Duf*UB!^pimr-)Ek^Yi6SC=r==;M-lh zvpr5Q@1W8%_=cefo}%+H%=JcU6^1!KPu&Pw;nc#RzcJ$jc=>K;P$^jEeUZJ!H^cj& z?|0sM-}~ND`V4)>EbZ|=_7+A5>d=vdzrGm=Bc zrRl|vBza&rwfJ3vJYe$ud2cw1$0SLtxH_xK(5u(iPjfs)J~Bk@xW(ZnpCg|ppCBJG zUpnKg!%Pq`d8k;D&Yl0%u~;O3Y2Y<+nT4iJC?AOR=f0w}-@S2mdu39~Pw0EP)f`sXRZG6M{Tc@pZghBS@U2NT}x&jjkLK=R>l9eVtui zlzGW)c#lqyBMO|Lh~iHv$bu@ECqAOZj~(NwZxD5iQ3>iBYl=)ti!OCy#oZ0($Bg4R zIjSYQjE?B}5s!AYb!o|Hr_tHj)YjTLTzq~aqFQS_+S1lxTx_aP$EkIkR3q||6c){! zjx&SrmJoMhPHY-RJ?vRRenrLM=S3eHl?GRjGKGHjYJ&9aA~u*k1MFxw;cPYcJ;pXS z?(5GdOK4vw#y-n-u{F%!eVx8@zN5@Ddk}At_MdIQ*kJfz71}D*%Cp-R6AnUt4*>lh?=>^$+FXoq_O(p&y z=^V}-w{kAXp`9;4W%GE*dM;!SLDrQA*$9q~P4Lemi8&zo5$i8Q_fPN#QO%7<(TpFt0Ol`a60bUF$pU)4bn$cY7y$o_Q&H z1UI=J??2u160|ddM8VoE|3 zVzOv(Qe4tPVKuDFD$m8kvaYL~Eaz^`8t$tMuQQSti5Pq=rgFL_OPVAJqO1!BuO$pk zl_3xmUd?HmH6N9R$8L<1!M3oVsH(OQM_*l(-^rO4vX}vCB7`iBS(S#{7LFORsu_~3$JDSSX@V{rN-P0x2R$$h zO-E~4X#PL&j7o#bG#};^HO7gY#0gRYnipdtCyF6e=5*W5EgQqr~d^8BjmXm|NlTTR5sk;m412>_-%gaj5$Ir4$$$de$ zcdIw(H@(5YH{C%meiZX9^B(jTd3y8y;i`7Fk#Qd>RbEglKW3Z;j56@fkX&&_Z3mDWhriJXzwbIZPjtHJ>0r6Qvxz+`*C3I=L zcV8Ot9!n}$jOW=#<%n&!-BONl?xrlMTp{eTgmOi#(-z7Rt)%_9kpS(^8letLDpybv z<&H>Ru3)r|aW1wTV_R60EoVPq=dru2=wk+$o1qFrliH(-wfB7CLo=^$bDHxb`S0Nq zZ7Xx^*De%%A-@78S^u6ZtjAam$G*=VVRy1grWxEVX!_Fy9^22H%{dyg-7Ht|+isRi z$cw%Qvv5}?aoR@W9y@W`ev?_B-e>(2(atDHl9|MTT3CMtY~5BejyQq8GqqsLRF5@ib4k?mix%hB-L3h+C}1>D09*kS0!6?WU@TA!j0464CBOtA2$Y(; zTgxi;&tKLYs*5z-9?`Ge*x4~>?nZT8!?FzxF}`z27r%CaF}I^bSkOFw!3_(O?X#CE zZ5I|i(LTHib)r}!sglA=M+(cwR55UPy{K$!<;-%R0+YzTs0U^MGl5w^gE{c&&-85$ z8vA%F)jk`T12h72fvbRdzDR2XDBd`ou4%`H+ z0B#0uF{$>I-!2*t4x5Ls!`KMZPk%+vb*J3(T?e z^Pb22*xMMZGp{g{kmpcxte<(#7x1=uKJ_feW_X+)rx`w!+>%Ga)wCHMJDO~y=A}AZ zg)3wf_?M?hZUu*kp1uX^sjn$B;4cVK-D62yB(gam{?s@U4-wh@3_qNy9C4-*Uo!ARV@RAQvbYa^ zu!zKKi8Z#r$KYaSY+Z403(yL*0qwwApabXxx`1`SdSC-^8*n?Y5x4`m6SxcbInWLC z0KMjldpA8?S@whFc2{OshaJ9|`JOoi3-8m+_RQ^z?p@=wPFGFc*5N91#W{7B{S^wF z194BUMq0Jeb#`r=b**{zf9%fT+T{+bc14p_YhRrn|BhXUR(;M^;50h?04$w8bk@pw z(Jxye=Rq@n4T%GN{{<8}(P693je73OuW;HsC^~Ijl?b%*ekh@=?F+GghP#=y+aT+% zh3BE2ZTS@i*Fta`xx}Z>OSq?^Uc+C67FUmQ77uF;rx$4>et)1~!ug7_U{%?O zOj$M9aQlyK7=9yQwIYjJBCZPAZNMjGu_24LZA1A*HjK!C4XabP!D$p%iA`|8g+uJ@ zVGBp3;I)MPJ}3$%g+w)$Q1ozgU2D_YpRfx7cxcJi?5Wwd778Ov_xl;96W zZnG=ZMHQ+larZ=f*0URuy%fjMfdO{BEAt?vbQ>}Nv%U~eL7|wYJZIN)Ls0NEXx1HV=An5+g|2+N2Tug(SaVpfu1GY zH6wF~;G7?F%t&oOr9(mmYG3WA(CLTReCNb1LTWvNcQupIU!P=4%-06k&u}#3P;#$% n)3eFt1bXg;B_J&fc(V`pN`69FvU`%0l0t9WT5N$*Hc9W0-bh-YEhz$(R%xLWxioFcr9u@o z368BYqm)(-KB%>$Q$$511FNW5eL$RHI_Lwac)^iT#}VzQPdZrtTLdpNCi&%@{m!2A z&3?OQBUkp5NMt`bkm9K4ICCC%>q78(N%KYD~=&d^~&Y7)_2J%n`zVRi8@tkiRFWUR5pr zzX?UEw^aM^3(5PHkZNvW;<#L@S8}#lYdI&6T}rnc$lR~wv)$?u;IY!5mWMkPA}Oa2ag zIYkkuo(^nS;l%W+n|*~Hzpf8fP6tMU_Dm*E(F~Kn;$}c$FUk6P<?^E~ z+LcEX`zggiA`0c-;PBkOYE8C86TVMaWo{FnGktBEYYdZ%#n;3N@5o@$;U%Kep7O-^6^{@QaR~N5)8{(eBc#tyfsD zHfnxauQaO8GJDzJIdD7VKrYOMc`zUHU;*UALQugC9`Hf| z6lysYMW2rd#blI;SBk>=CdwoIqgRWd7)qcN%3u*J1|O6|1yn+nHhQ(XeZL@c`Tb(g z67WL+YM>UD!ZKJ6bx;otumXb62rJuojx31@3~oVVx%SwEh-MqYa#e zyU58S(l1htdBD8PRA(Z5FKy>8(v2*AyfuYg8gG4CyExvuTTa6BkR-a=N)6GKTe~|p z?db?_?CoOh?}SGC$%R&EgY~ch+F>Jfz$Ul{Hp3R!3fnYtq4WBe30Ty{m2(MiG5L6C z_6!=Z#VIGhX>(Y^maCR#3~^e?@zBEwBsy!Lg^j-v3b62*&>F4fbm+Xmj{g{YQmh{6 zG`ZF+WbdB$q_Na%F^OIMA=XTy#RFSdu*sapo`{Fctox_f!9$HR$ru?AT@dQbbxb_a z#q_)Oir8OwxC^==3_Y+NcEC>91-)=D?1nwi2lv7KuooVH2jL-zKvb(c96OowCmt7y A_y7O^ diff --git a/finance/__pycache__/admin.cpython-312.pyc b/finance/__pycache__/admin.cpython-312.pyc index 8e8493b57798ce0e824e2b7b108651c2d026b054..59a774f3330d3bae101ed767e16cf0828c7338b2 100644 GIT binary patch delta 3067 zcmZuzNo*X)747QTcP=xW;S87IVoFUdktLZ@lvuXRMWGgo3JFP}Bad3sO{uL}i0Y=q zp%D+A$hN#fR4KM>7%-GW073S_Ae=)EIpts^7wHtG4QBy-FyM<~%Mp-Ru>Y^>X;MrE znAcVR|N2$`|5v~J>+$an#s3_Og(di19S;~aWjUT9yO%di1t3NY;Rq=lUQo+LssP{bWYA|p%SBmtr( z*Gao${2!7^1#WuqFp_jrJfxYdqn(iXA^JQyNAR15pu-XTyCLWlf{fmLlL$9_*LK)7 z>m0<_Rm&+IY{+BuhU~zUPR|=f-40Bu#dGQz-Htm0p;-CIqmpzIT+uW_20-!9796)S z#W%D^3~}C$z)jJL+b_0EQln^8&g2L3BlA?XjA})ZX$tji>>b}$(#1aUeG+a)0YV#l z*Z+EcM`K!qf%}u4(bt>Vsc3gy^J=~`@=Q?ko*^@#nqLXn$%oFak5@`YMPKX{&%COY zjY@vDO7o6c-U;5^O8wxQ<^b$~>0~5m>ZS?jH7ArX-H3VxVGv=HB-JGvLVI7is_7-$ zr!QDkr9VJz7s^}Jd8=Bimgh>kr59!my`-6RJF0nfJ8?ABfJb3q;vN^Jzj`NmyX|vi#rl`V?&SKfZMyAE(;Ys(mTe9kOzJ_*fELt3TG$}7vMlLg zw%nT98`feC8fbAXp*6iH3$5nTLu+ZsXT39#T2N`VqfUBQcUvd>Zy-ThStK}Eck92( z1lo#+z`845o;|u31sw>T024eFpmXgwfdn-YjVg@jmTHttpcP;J1g?G(p&KEO&?`wT z679#~074c(iLwLf{uZ8bOr#w!c)d;bT`-m4`F$L15q`wFLK`CoAd`u{Tk-y-{p@Jy z5%Ltf5E}LKay$-+Y-gW_zU*?tg!7Ey`c;9CjGJ z!a)EfE=a{yC)lM#)i0>U9wau6au4xwO|MwStWo5>rNK9`0{!r9amPid2i5cA6=(ou z(TF^Bl$D##J>urx_Km>dk%`>76Od(;b$XILXxdnxMwh1%urpB&!1hmBsx=R#DsZgv|EQp34Lh)e)m+TWt40;ed zobJhCwd^=%xp3A1g3;pHnkdpf_H8gDn12jcBRsbfX;Da+lN{&8<>nNdYW+h~4_f>b zVG02XmVBblg-9lc-X6MuO5_zi3Sb8sT=vrS4$ubAs}NB&H>>pjk@*6eBYX&d(*n3C z{geGYNd?O;u;ZzFWPu%O>wOgIV@Ky`wFnJa*9xa=;x*)@FMvj{i*u?DQ>fi@?ESWG zen}}x9u9>YqQ^z(KeaNX+r6G%Zcdj#DLnrY&C=6Ut(a;NUtJHeN2b3*%ZmuBu{LTK z6v?;|!6xPBH*9{jJkR4Igg>&k(lqaw(tvtCx?6D zj_D$%|uFABAcl%;N11Q*fb?xfqBS5 z@f^Iy6`$zQuX6VYZy>yh;Bs|MHeN)zllqs^4^_ac}bG}Hv5uD#>*?) zbH_-82a9)+zQS0?#y*|{AH9N-)kFvbkU{a6+21-g&tmv?&@c<<)smr6hSOL@*EO?1 z^@@H$Ezzqe3zbyUD$E0`R$p5D?nAej8Xs9(Z_!#jYxibzozvTX4Swh{!dvJucno(m ztQw@sJr{i&^>_+;jos@U@(aGOZC#lrJO_OTK_qbHL|2j!la;$q`V%Oo>{j=*eSH0M*t9B_;T%@!w3bv2=RrAnLLSfmWs^x=H9wfv0(BfQ8?D5+ij6yZx0yrCgMd(l zme8NAI!LvomL89+jSS?doYgYvn3dLGJ-~i-tS4)jB;E4(ApipGj`WUuYciD-(!(6w0U0faM8Vzhl3`&f_ng6ZXU_O17PD8yG{ zlHn{Q+Hg*Z3R7u>9rZ=`ATP87hyk5I8HeGR%qVKgaHyxURHo}8#|^DMI1U*w&c63W z&4c6l2fnj}^s#Awcw&gJ8IqorvpL-;pOv#oIbqJss+Q;rF!4Na7!YYWgk3HrrzR9R ztMdCE#?mvuE?|Ho=A#JCTpD5j`ZH1k=8f!R8v)UCB++9t}$V31iIo_ zoH)zxfU1#rdMraH%?D$nee7=KiMC?;4aWd?M(4LJjC(X)=MHAINtM3HPF8iyAy)bd zkN}Qy7}Br^{TdN*&Q^@>9ND!qGT0SQPiOdxkGbe5bYB8q295wC6Ea4}IE=DWlc_|K z7b}m34nn*eKy6b|VlgkTaI0D35yOY1B_=dpQ#3g-Bksp=YUz}gR`o))KZm`*RQ_~z zjCe#XVV+#946yHNuKOd<*az$fhS*}@={X@p+6z@}qd6?@0rqkj&e9u=K)AvHrs6pg z^Wut${oj(#LLIoue>w*9mb>ggEj5cQ%Wl>_AUXDRT}uxt$S9wpnWU=gs**T1W7d|P zzQI?_0uyER8lUp(JH;x3O>;;bh2-&2gd!}?^0qTG$uqv9?LeKr4hYM0P^%lEa$1*@ z=(3L$kd>Z+=2@T=>+^l#<4O{@)0Fn4oLf(XIRX>}D4ET-z^otz) z^6i`cwv!rG+qhtsziC$OKE~R-ZO^d11qoGY%sQ!XR|-U zBi)y{HboSa!J_LBPSmn9+|8n2^aHHJ3;H2bntCNOL+rDrpdWtFj{q})`CCmjgk;$7 zkt321;xy}T9+AYS;0n9k93^3Pqd6(kG#g;wL;|iM-YyFt!RQ{d(6F(a!*H6#tJ5o( zRqFiHm`y0Eo}}6os(SV9yo;T{KbCyHMIt`YJRlf~t)ZRlX6sh6;Zk&n4M*z|`2U6Y ztcs76;T@5Wq862ec)b@J&bl*?`_I&Zre@l@a;b^S48Rn diff --git a/finance/__pycache__/forms.cpython-312.pyc b/finance/__pycache__/forms.cpython-312.pyc index daa4432e5c8f38f9cbfe457fee6d45e6b4c02abc..6a081325a984cfb631efcd35bb08e796ccecfe74 100644 GIT binary patch delta 5081 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 delta 4549 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 delta 3990 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 I(%8WN0IrPvSO5S3 diff --git a/finance/__pycache__/views.cpython-312.pyc b/finance/__pycache__/views.cpython-312.pyc index 8071011742f702a2d435ca7934a7b870cb31b0ee..5fba37421deb6bc6a18884240bc5c12d3d2287e5 100644 GIT binary patch delta 1769 zcmb`HZA?>F7{~9qZEs6U3-pCrTCj?iT__A+vY~NSl*!~}fH>G3Tj}8H3KjJB%8V;v zD8>p%l_%)t%!Ve*cv%M6#Vpz8OR_JUSpv~yghXeS_`z+NFgs(GX?C95>gK*~H|_tP z^PK0L=br!lo%_Wt_Q5^Ya7C}zGW1$jruILKOc^E*lVP}ccu3jI^)S#7eh7nyEaX18 z2Qr8nwz#(_3Z*2tlfM{-H72;SJ{_*Rjmi*P%fNzriE7HN-w{**ST6HcZ5%pqnP>@7{MtM#wqBn5|%374KsmxibeNC;t zokDGVq0MwgEuC=|HuZV98!W>F55k_IMKIiFh6k%sS$;jFthTyy4dK#h^YWQw*SwKQ zwT2C`BqrB0Ys>u5{+>OiVE-|$f$BP|K}m}#=>P5ky5>o^UY`ffQZv|vC4_)4+hGVX zUKJgeFG&xb!eS^alFcxDLdNMNygJzs3&r_nsLs?V#S^qcr^4lDZ181`2`<%Z;TyM^ z^=jdwI}3i`;(3ITtZ=N+0f&Ti5`xQ(7ASmGr_GEn$uJ?9f7XI40`Jj-ImHb9wI=Ly zgb6V%*>Gl!8M-{$9G>0ppyoIwq0QGO#r^kn2=Y6jHW!HKK5vBfVoTR;+7!>CyiO8c zi$Brs+@dC5plNTwCkbAuUGfFIK_M9Qx3>l73{Un&6VCn(WgbO`GKKOh%3Ug>3UM>G zV<`8j1kqxr(<#Eb-khWbe0?`*1S(sy%<~*$wV(7K_d{z~*{_RnjOi(O`gvE*HC^V- zWK*Q#NJamPG%2@W!ai#Mp0AwYE3fiZ;gU%Ck@9QFF3@_5VSKYwEtbi&I|4O`?2RDI zCHXPf)OIN8%LXoD=d!3P!66xAPsH_KFg88Lc%BwM$%IG?f$nt~NG}bxBbuPolUznQwbde+yW?kDCN=RbNI+^3{{`sZ#v!F*Bl_wiaI3+&O?-oP9+Opu z!+%oQ??`+)UfSJEX|D4NZxvt>Z-+17Z(f0(e@4^ZVg3j3>e(jhbGJ#i6Q2vkpnzW@ z6=^Z0Oqf-bCsQfzgsRgv_`Q2m^rK@omh6IygFI@_QqX~&yb{fU5|+FPfuV1;t+*CS zIczwwjVosg-8jG#yTrUJhN@&8=$STqcw?>v|j$<031BTIU zoBq>DV4_5SsuO#%jrhsBzq-)OKM6Q~N2+r9UPZjBcFLkk#u+-t?l}X}9N6=Bzb$q%5YOk=RCd c?W6c~@zz=EvT4_v&)3EjG#cAaAau_27w|O`F#rGn delta 888 zcmYk3OH30{6o%)_&_@ciyvoChwt!$s165og0Sb{AL5&K;fQcfpMNuBg1U6b; zt8K)Gw>|9kyBr$%508=})aF3px!p%70 zL~XVx8dz|*I}9HjX#MCXp9xz1Z}z@qYsdl{1o+-EB!@1<%ypDmImXaZq5I` zBB`&G7gX<|I7N<{525I!uYQUMiVBiLk7qj`aH)eUseodc#iw@;g|7x}nir?#D^WEZ zhu@m^36{HYEL7puUOnM-O9IaJY9L(r(p$iS77cx`6lPkBg6rzf2D6aUKf*yhE)MX7 zWrIf{OL#n(4?Ak9j>1U(sV#(fYGJ;zGKqX8Vyh%)y>G3c8Xn`|tS~bgE{DrFH&zhc zOg_n$h4bAOfp51DbKztCP1;8IX;)-co45#PMQiLdW=V62BSW zBW;3nc^W|(+X;*8<|PW(6- zuNWa(axpfmz&?}1ZVklvVpDwv(@gw)OzLP+fFqeewt6$|%P*dfN%AG{oyZDsBpWbd H?v&{t`q~0_ diff --git a/finance/admin.py b/finance/admin.py index 43c8a7f1..5eb466cb 100644 --- a/finance/admin.py +++ b/finance/admin.py @@ -9,6 +9,7 @@ from simple_history.admin import SimpleHistoryAdmin from .models import ( Service, Package, + PackageService, Payer, Invoice, InvoiceLineItem, @@ -45,6 +46,16 @@ class ServiceAdmin(admin.ModelAdmin): ) +class PackageServiceInline(admin.TabularInline): + """Inline admin for Package Services.""" + + model = PackageService + extra = 1 + readonly_fields = ['id'] + fields = ['service', 'sessions'] + autocomplete_fields = ['service'] + + @admin.register(Package) class PackageAdmin(admin.ModelAdmin): """Admin interface for Package model.""" @@ -52,15 +63,15 @@ class PackageAdmin(admin.ModelAdmin): list_display = ['name_en', 'total_sessions', 'price', 'validity_days', 'is_active', 'tenant'] list_filter = ['is_active', 'tenant'] search_fields = ['name_en', 'name_ar'] - readonly_fields = ['id', 'created_at', 'updated_at'] - filter_horizontal = ['services'] + readonly_fields = ['id', 'total_sessions', 'created_at', 'updated_at'] + inlines = [PackageServiceInline] fieldsets = ( (None, { 'fields': ('name_en', 'name_ar', 'tenant', 'is_active') }), (_('Package Details'), { - 'fields': ('services', 'total_sessions', 'price', 'validity_days') + 'fields': ('total_sessions', 'price', 'validity_days') }), (_('Description'), { 'fields': ('description',), diff --git a/finance/forms.py b/finance/forms.py index 0d395b16..b683c1eb 100644 --- a/finance/forms.py +++ b/finance/forms.py @@ -10,7 +10,7 @@ from django.utils.translation import gettext_lazy as _ from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Fieldset, Row, Column, Submit, HTML -from .models import Invoice, InvoiceLineItem, Payment, Service, Package, PackagePurchase, Payer +from .models import Invoice, InvoiceLineItem, Payment, Service, Package, PackageService, PackagePurchase, Payer class InvoiceForm(forms.ModelForm): @@ -284,14 +284,11 @@ class PackageForm(forms.ModelForm): model = Package fields = [ 'name_en', 'name_ar', - 'services', 'total_sessions', 'price', - 'validity_days', 'description', 'is_active', + 'price', 'validity_days', 'description', 'is_active', ] widgets = { 'name_en': forms.TextInput(attrs={'class': 'form-control'}), 'name_ar': forms.TextInput(attrs={'class': 'form-control'}), - 'services': forms.CheckboxSelectMultiple(), - 'total_sessions': forms.NumberInput(attrs={'class': 'form-control', 'min': '1'}), 'price': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01', 'min': '0'}), 'validity_days': forms.NumberInput(attrs={'class': 'form-control', 'min': '1'}), 'description': forms.Textarea(attrs={'rows': 3, 'class': 'form-control'}), @@ -306,32 +303,45 @@ class PackageForm(forms.ModelForm): if field_name == 'is_active': if 'class' not in field.widget.attrs: field.widget.attrs['class'] = 'form-check-input' - elif field_name != 'services': # services uses CheckboxSelectMultiple + else: if 'class' not in field.widget.attrs: field.widget.attrs['class'] = 'form-control' + + +class PackageServiceForm(forms.ModelForm): + """ + Form for package service items (service + session count). + """ + + class Meta: + model = PackageService + fields = ['service', 'sessions'] + widgets = { + 'service': forms.Select(attrs={'class': 'form-control select2', 'data-placeholder': 'Select service'}), + 'sessions': forms.NumberInput(attrs={'class': 'form-control', 'min': '1', 'value': '1'}), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Filter to show only active services + self.fields['service'].queryset = Service.objects.filter(is_active=True) - self.helper = FormHelper() - self.helper.form_method = 'post' - self.helper.layout = Layout( - Fieldset( - _('Package Information'), - Row( - Column('name_en', css_class='form-group col-md-6 mb-0'), - Column('name_ar', css_class='form-group col-md-6 mb-0'), - css_class='form-row' - ), - 'services', - Row( - Column('total_sessions', css_class='form-group col-md-4 mb-0'), - Column('price', css_class='form-group col-md-4 mb-0'), - Column('validity_days', css_class='form-group col-md-4 mb-0'), - css_class='form-row' - ), - 'description', - 'is_active', - ), - Submit('submit', _('Save Package'), css_class='btn btn-primary') - ) + # Add CSS classes + for field_name, field in self.fields.items(): + if 'class' not in field.widget.attrs: + field.widget.attrs['class'] = 'form-control' + + +# Inline formset for package services +PackageServiceFormSet = inlineformset_factory( + Package, + PackageService, + form=PackageServiceForm, + extra=0, # Start with 1 empty form + can_delete=True, + min_num=1, + validate_min=True, +) class PackagePurchaseForm(forms.ModelForm): diff --git a/finance/migrations/0005_alter_package_total_sessions_packageservice_and_more.py b/finance/migrations/0005_alter_package_total_sessions_packageservice_and_more.py new file mode 100644 index 00000000..8409e1c9 --- /dev/null +++ b/finance/migrations/0005_alter_package_total_sessions_packageservice_and_more.py @@ -0,0 +1,73 @@ +# Generated by Django 5.2.3 on 2025-11-02 12:07 + +import django.db.models.deletion +import uuid +from django.db import migrations, models + + +def migrate_package_services(apps, schema_editor): + """ + Migrate existing package-service relationships to the new through model. + """ + Package = apps.get_model('finance', 'Package') + PackageService = apps.get_model('finance', 'PackageService') + + # For each package, create PackageService entries for existing services + for package in Package.objects.all(): + # Get existing services through the old M2M relationship + for service in package.services.all(): + # Create a PackageService with default 1 session + PackageService.objects.create( + package=package, + service=service, + sessions=1 + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('finance', '0004_csid'), + ] + + operations = [ + # Step 1: Alter total_sessions field + migrations.AlterField( + model_name='package', + name='total_sessions', + field=models.PositiveIntegerField(default=0, help_text='Auto-calculated from service sessions', verbose_name='Total Sessions'), + ), + + # Step 2: Create the PackageService model + migrations.CreateModel( + name='PackageService', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='ID')), + ('sessions', models.PositiveIntegerField(default=1, help_text='Number of sessions for this service in the package', verbose_name='Number of Sessions')), + ('package', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.package', verbose_name='Package')), + ('service', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.service', verbose_name='Service')), + ], + options={ + 'verbose_name': 'Package Service', + 'verbose_name_plural': 'Package Services', + 'ordering': ['package', 'service'], + 'unique_together': {('package', 'service')}, + }, + ), + + # Step 3: Migrate existing data + migrations.RunPython(migrate_package_services, reverse_code=migrations.RunPython.noop), + + # Step 4: Remove the old M2M field + migrations.RemoveField( + model_name='package', + name='services', + ), + + # Step 5: Add the new M2M field with through + migrations.AddField( + model_name='package', + name='services', + field=models.ManyToManyField(related_name='packages', through='finance.PackageService', to='finance.service', verbose_name='Services'), + ), + ] diff --git a/finance/migrations/__pycache__/0005_alter_package_total_sessions_packageservice_and_more.cpython-312.pyc b/finance/migrations/__pycache__/0005_alter_package_total_sessions_packageservice_and_more.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..575ba2d39ed5126e2ca333b8440ba660458e1d55 GIT binary patch literal 3240 zcmcguO>7&-6`ox#f0m*siIPm&66KZRNMce+hLHejQ^ZxJ+LBx=iewkIPENE4oNDw`pcgJugv8_!13Bf!RLZ5NzL{N0a-;wS z3Uoov?|X0Fd-LA+<{zD%aRgsuF>0=KAoMk#w7+mL*uMdTrwAh~mC(8*dU;)jUM_{o z%DPexuZJasLyypUL`GK;RvsZ7CQ32c7IoC`hWzn*bX&?szTuPQtjywNGfxfIv@M54 z$~Gn?Cnq0qp(ur(X4{DBiU$eHLk&T zT{w+rj^$!M(zV6PbM8gx6B;TC@J}lEtnNYb8XEn5X~a@pr>{MeU6u$+->- z8Kn}Z5^BLU=O{5;l8rFMs8k%*>EsHeZ0H1=u1zVwaT?ixa-JL}o)Pt?zommXei_Md%v z_v5>NT&z!D{=ENZ50_gJ)HnF_^2e7Oy<=YQ*cZJMkE1Ws!;SQ~mmY7V-}KUNevzJh zeD!7GTq7~+B}N;Gte40(2hQ`~*>kNZ>U`rnq;w{~4Wof6X!^4Ia5&2Grv0_EZ~yNQ z<4+M0xeIwK<)!tIj37Tn?zhSP9?O{TMNZ3Itl%(?>_yx0xEE`WgtYEgCGi4C zo!lew;+d1HxC1BP-?^9E4YF`k#$7+CQ8(_vsUwYmRu;4aCnb~4;?T*}V&asw;ZxSM zlWVva_wDt!eE?^l`9GeW#skOC&MWvVJ_omVCNJZ`f`o_upzLMZx`AFwarC4GBz5|F zaqJ}R-f$Z?g|vy26ma_aJ?#~$H%_M#e)`cVdn0%hr}1lh7j_kY_bA5l;q~

)A1; z`j7`ula(ol1g1h}zoq9K6AQ3l$yd{wa*VINK3jF|$(&KjRRItQ);6hK)`BdC-UqK* z@&<ss+E1h`57VXgan3l3b*A$DgKA(ZtVcbr}+RjC0*!KN52xALs3YMCEa z3E(mmkOHCE5IqlSu!!)c1I45w9tl~AB`5(|a0NMdE>I3Wa30TGpCcAn=+w@%Z4UGc z^kuPN;A9mpOaz60gVCTg(s3@1J7YOJz+$@C)pZuvd2Oqf2#gcD{$bT9@jK@;Oe(~} z#LAh(q5Q?d;XFw<{!gkNpWzj?=V{Hyl?*!^7D58$1RcA*g2R zNGl}wMIQdLl|bt7<9H*M@nV@~T5I-6w$8 zJ%jbk%(GuLGBaLg=0y*zz9-G`%~g4mQx4|^WdSJ9)rTgZU1=%%b33`k#1PYPc^6R*qb1j{mrs8T&-74_#_r z_(}b>cfM7_{mFx#BzR#IsTuBtAul#m&%FI&sWE@co4?hVzvIo{`Dg4d_w$jPxNip! z!XaP;pAT`yK`%Bad_LGrO>m!2c&Ul!#ro1lJ%1leT98+T+t&iOUzH|Ok>4))*UN7< z8)IkvsG7nXQv%YQsdi}5clq7F0}WFTiA0D~9@Zkt{P {% endblock %} @@ -55,7 +70,7 @@ -

+ {% csrf_token %}
@@ -69,42 +84,47 @@
{{ form.name_en }} + {% if form.name_en.errors %} +
{{ form.name_en.errors }}
+ {% endif %}
{{ form.name_ar }} + {% if form.name_ar.errors %} +
{{ form.name_ar.errors }}
+ {% endif %}
-
-
- - {{ form.total_sessions }} -
-
-
+
{{ form.price }} + {% if form.price.errors %} +
{{ form.price.errors }}
+ {% endif %}
-
+
{{ form.validity_days }} + {% if form.validity_days.errors %} +
{{ form.validity_days.errors }}
+ {% endif %}
-
- - {{ form.services }} -
{{ form.description }} + {% if form.description.errors %} +
{{ form.description.errors }}
+ {% endif %}
{{ form.is_active }} @@ -115,6 +135,56 @@
+
+
+
{% trans "Services Included" %}
+
+ {% trans "Total Sessions:" %} + 0 +
+
+
+ {{ service_formset.management_form }} + +
+ {% for service_form in service_formset %} +
+
+
+ + {{ service_form.service }} + {% if service_form.service.errors %} +
{{ service_form.service.errors }}
+ {% endif %} +
+
+ + {{ service_form.sessions }} + {% if service_form.sessions.errors %} +
{{ service_form.sessions.errors }}
+ {% endif %} +
+
+ + {% if not service_form.instance.pk or service_formset.can_delete %} + + {% endif %} + {{ service_form.id }} +
{{ service_form.DELETE }}
+
+
+
+ {% endfor %} +
+ + +
+
+
@@ -146,16 +216,124 @@
+ + + {% endblock %} {% block js %} {% endblock %} diff --git a/finance/views.py b/finance/views.py index 171c94c5..8aa377e5 100644 --- a/finance/views.py +++ b/finance/views.py @@ -731,17 +731,52 @@ class PackageCreateView(LoginRequiredMixin, RolePermissionMixin, AuditLogMixin, success_url = reverse_lazy('finance:package_list') allowed_roles = [User.Role.ADMIN, User.Role.FINANCE] - def form_valid(self, form): - """Set tenant.""" - form.instance.tenant = self.request.user.tenant - return super().form_valid(form) - def get_context_data(self, **kwargs): - """Add form title.""" + """Add form title and service formset.""" context = super().get_context_data(**kwargs) context['form_title'] = 'Create New Package' context['submit_text'] = 'Create Package' + + # Add package service formset + if self.request.POST: + context['service_formset'] = PackageServiceFormSet( + self.request.POST, + instance=self.object + ) + else: + context['service_formset'] = PackageServiceFormSet( + instance=self.object + ) + return context + + def form_valid(self, form): + """Set tenant and save formset.""" + form.instance.tenant = self.request.user.tenant + + # Save package first + self.object = form.save() + + # Get and validate formset + formset = PackageServiceFormSet( + self.request.POST, + instance=self.object + ) + + if formset.is_valid(): + # Save package services + formset.save() + + # Update total sessions + self.object.total_sessions = self.object.calculate_total_sessions() + self.object.save() + + messages.success(self.request, self.success_message) + return redirect(self.get_success_url()) + else: + # If formset is invalid, delete the package and show errors + self.object.delete() + return self.form_invalid(form) class PackageUpdateView(LoginRequiredMixin, RolePermissionMixin, TenantFilterMixin, @@ -761,11 +796,48 @@ class PackageUpdateView(LoginRequiredMixin, RolePermissionMixin, TenantFilterMix allowed_roles = [User.Role.ADMIN, User.Role.FINANCE] def get_context_data(self, **kwargs): - """Add form title.""" + """Add form title and service formset.""" context = super().get_context_data(**kwargs) context['form_title'] = f'Update Package: {self.object.name_en}' context['submit_text'] = 'Update Package' + + # Add package service formset + if self.request.POST: + context['service_formset'] = PackageServiceFormSet( + self.request.POST, + instance=self.object + ) + else: + context['service_formset'] = PackageServiceFormSet( + instance=self.object + ) + return context + + def form_valid(self, form): + """Save package and formset.""" + # Save package + self.object = form.save() + + # Get and validate formset + formset = PackageServiceFormSet( + self.request.POST, + instance=self.object + ) + + if formset.is_valid(): + # Save package services + formset.save() + + # Update total sessions + self.object.total_sessions = self.object.calculate_total_sessions() + self.object.save() + + messages.success(self.request, self.success_message) + return redirect(self.get_success_url()) + else: + # If formset is invalid, show errors + return self.form_invalid(form) class PayerListView(LoginRequiredMixin, TenantFilterMixin, PaginationMixin, ListView): diff --git a/hr/templates/hr/schedule_grid.html b/hr/templates/hr/schedule_grid.html index ecb167eb..3fc1f337 100644 --- a/hr/templates/hr/schedule_grid.html +++ b/hr/templates/hr/schedule_grid.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% load i18n static %} +{% load i18n static hr_tags %} {% block title %}{% trans "Schedule Grid" %} - {{ block.super }}{% endblock %} diff --git a/hr/templatetags/__init__.py b/hr/templatetags/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/hr/templatetags/__pycache__/__init__.cpython-312.pyc b/hr/templatetags/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9fc087fff639564df481cd60a622c0cc3f935b7 GIT binary patch literal 156 zcmX@j%ge<81Oo2tnIQTxh(HIQS%4zb87dhx8U0o=6fpsLpFwJVS?h-urxq3K=Oz}F zC*~#Qlqcq7>N}>VBo;ZR=9Lts>Sq+`m!#$v&M4u=4F<|$LkeT-r}&y d%}*)KNwq6t1)9YO#Kj=SM`lJw#v*1Q3ji3kB{Tp4 literal 0 HcmV?d00001 diff --git a/hr/templatetags/__pycache__/hr_tags.cpython-312.pyc b/hr/templatetags/__pycache__/hr_tags.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4aec00bbb2977404bbb9b192256035f1806d4a89 GIT binary patch literal 633 zcmZ8f&ui2`6n>Me*|@RTT0E4k-2qSW(DYaqStu=dkzTYOdReB;G|rkIWhQNj-O3gO z>&avN7fSyWFO?oF1A^em+sfWN`6eb^@WIS{@4aunH}551W@cJ|w)m_mHVD8^A}} mA71-x^_$oJ>b0-EMksrVO7l$fvp literal 0 HcmV?d00001 diff --git a/hr/templatetags/hr_tags.py b/hr/templatetags/hr_tags.py new file mode 100644 index 00000000..2a57c7e4 --- /dev/null +++ b/hr/templatetags/hr_tags.py @@ -0,0 +1,14 @@ +from django import template + +register = template.Library() + + +@register.filter +def get_item(dictionary, key): + """ + Template filter to get an item from a dictionary using a variable key. + Usage: {{ mydict|get_item:key_variable }} + """ + if dictionary is None: + return None + return dictionary.get(key) diff --git a/logs/django.log b/logs/django.log index d5953b9c..986cadbc 100644 --- a/logs/django.log +++ b/logs/django.log @@ -72455,3 +72455,497 @@ INFO 2025-11-02 14:30:00,006 tasks 16180 8648941888 Radiology results sync compl INFO 2025-11-02 14:30:00,012 tasks 16180 8648941888 Lab results sync started INFO 2025-11-02 14:30:00,012 tasks 16180 8648941888 Lab results sync completed: {'status': 'success', 'new_results': 0, 'updated_results': 0, 'errors': 0, 'timestamp': '2025-11-02 11:30:00.012252+00:00'} ERROR 2025-11-02 14:34:02,219 tasks 16180 8648941888 Appointment 8f028c27-4142-489c-91a8-417fa19038bf not found +ERROR 2025-11-02 14:47:58,725 tasks 16172 8648941888 Appointment a754db19-dbcb-40e9-a03e-742e2c13ea83 not found +ERROR 2025-11-02 14:47:58,725 tasks 16181 8648941888 Appointment 7d208dcb-490f-4f66-97e0-807f7a4cc9d4 not found +ERROR 2025-11-02 14:47:58,725 tasks 16180 8648941888 Appointment 4e16bbd2-83d1-46e7-a439-b2f3d06fc35a not found +ERROR 2025-11-02 14:47:58,725 tasks 16173 8648941888 Appointment 80157786-4d02-4e2a-960f-8ff0acdb443b not found +INFO 2025-11-02 14:47:59,225 basehttp 18386 6198079488 "GET / HTTP/1.1" 302 0 +INFO 2025-11-02 14:47:59,298 basehttp 18386 6214905856 "GET /en/ HTTP/1.1" 200 56415 +ERROR 2025-11-02 14:51:13,535 tasks 16172 8648941888 Appointment 1ba52899-1a8e-4bce-93bd-d1d643bb7b69 not found +ERROR 2025-11-02 14:51:13,535 tasks 16180 8648941888 Appointment 84999784-a5ac-4385-82c0-6beee6a870fe not found +ERROR 2025-11-02 14:52:08,315 tasks 16180 8648941888 Appointment 77bb0820-19c1-473f-a574-3cb8845eb3f9 not found +INFO 2025-11-02 14:52:49,872 basehttp 18386 6198079488 "GET /en/hr/schedules/ HTTP/1.1" 200 101408 +ERROR 2025-11-02 14:52:59,587 log 18386 6198079488 Internal Server Error: /en/hr/schedules/grid/ +Traceback (most recent call last): + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 90, in rendered_content + template = self.resolve_template(self.template_name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 72, in resolve_template + return select_template(template, using=self.using) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loader.py", line 42, in select_template + return engine.get_template(template_name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 79, in get_template + return Template(self.engine.get_template(template_name), self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/engine.py", line 177, in get_template + template, origin = self.find_template(template_name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/engine.py", line 159, in find_template + template = loader.get_template(name, skip=skip) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loaders/cached.py", line 57, in get_template + template = super().get_template(template_name, skip) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loaders/base.py", line 28, in get_template + return Template( + ^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 154, in __init__ + self.nodelist = self.compile_nodelist() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 196, in compile_nodelist + nodelist = parser.parse() + ^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 299, in do_extends + nodelist = parser.parse() + ^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 234, in do_block + nodelist = parser.parse(("endblock",)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 962, in do_if + nodelist = parser.parse(("elif", "else", "endif")) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 862, in do_for + nodelist_loop = parser.parse( + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 862, in do_for + nodelist_loop = parser.parse( + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 962, in do_if + nodelist = parser.parse(("elif", "else", "endif")) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 1531, in do_with + extra_context = token_kwargs(remaining_bits, parser, support_legacy=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 1127, in token_kwargs + kwargs[key] = parser.compile_filter(value) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 609, in compile_filter + return FilterExpression(token, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 705, in __init__ + filter_func = parser.find_filter(filter_name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 615, in find_filter + raise TemplateSyntaxError("Invalid filter: '%s'" % filter_name) +django.template.exceptions.TemplateSyntaxError: Invalid filter: 'get_item' +ERROR 2025-11-02 14:52:59,689 basehttp 18386 6198079488 "GET /en/hr/schedules/grid/ HTTP/1.1" 500 333280 +ERROR 2025-11-02 14:56:54,423 tasks 16180 8648941888 Appointment 84999784-a5ac-4385-82c0-6beee6a870fe not found +ERROR 2025-11-02 14:56:54,423 tasks 16172 8648941888 Appointment 1ba52899-1a8e-4bce-93bd-d1d643bb7b69 not found +ERROR 2025-11-02 14:57:39,019 log 18386 6198079488 Internal Server Error: /en/hr/schedules/grid/ +Traceback (most recent call last): + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner + response = get_response(request) + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 220, in _get_response + response = response.render() + ^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 114, in render + self.content = self.rendered_content + ^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 90, in rendered_content + template = self.resolve_template(self.template_name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/response.py", line 72, in resolve_template + return select_template(template, using=self.using) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loader.py", line 42, in select_template + return engine.get_template(template_name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/backends/django.py", line 79, in get_template + return Template(self.engine.get_template(template_name), self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/engine.py", line 177, in get_template + template, origin = self.find_template(template_name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/engine.py", line 159, in find_template + template = loader.get_template(name, skip=skip) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loaders/cached.py", line 57, in get_template + template = super().get_template(template_name, skip) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loaders/base.py", line 28, in get_template + return Template( + ^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 154, in __init__ + self.nodelist = self.compile_nodelist() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 196, in compile_nodelist + nodelist = parser.parse() + ^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 299, in do_extends + nodelist = parser.parse() + ^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 234, in do_block + nodelist = parser.parse(("endblock",)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 962, in do_if + nodelist = parser.parse(("elif", "else", "endif")) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 862, in do_for + nodelist_loop = parser.parse( + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 862, in do_for + nodelist_loop = parser.parse( + ^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 962, in do_if + nodelist = parser.parse(("elif", "else", "endif")) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 518, in parse + raise self.error(token, e) + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 516, in parse + compiled_result = compile_func(self, token) + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 1531, in do_with + extra_context = token_kwargs(remaining_bits, parser, support_legacy=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 1127, in token_kwargs + kwargs[key] = parser.compile_filter(value) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 609, in compile_filter + return FilterExpression(token, self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 705, in __init__ + filter_func = parser.find_filter(filter_name) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/marwanalwali/AgdarCentre/.venv/lib/python3.12/site-packages/django/template/base.py", line 615, in find_filter + raise TemplateSyntaxError("Invalid filter: '%s'" % filter_name) +django.template.exceptions.TemplateSyntaxError: Invalid filter: 'get_item' +ERROR 2025-11-02 14:57:39,104 basehttp 18386 6198079488 "GET /en/hr/schedules/grid/ HTTP/1.1" 500 333401 +INFO 2025-11-02 14:57:44,128 autoreload 58250 8648941888 Watching for file changes with StatReloader +INFO 2025-11-02 14:57:45,995 basehttp 58250 6137393152 "GET /en/hr/schedules/grid/ HTTP/1.1" 200 161820 +INFO 2025-11-02 14:57:55,893 basehttp 58250 6137393152 "GET /en/hr/schedules/cf7163b9-672c-44f1-b48f-b39d8a24b6dc/ HTTP/1.1" 200 34704 +INFO 2025-11-02 14:58:01,898 basehttp 58250 6137393152 "GET /en/hr/schedules/cf7163b9-672c-44f1-b48f-b39d8a24b6dc/update/ HTTP/1.1" 200 36723 +INFO 2025-11-02 14:58:12,857 basehttp 58250 6137393152 "GET /en/hr/schedules/grid/ HTTP/1.1" 200 161818 +INFO 2025-11-02 14:58:14,328 basehttp 58250 6137393152 "GET /en/hr/schedules/create/ HTTP/1.1" 200 36648 +INFO 2025-11-02 14:58:30,834 basehttp 58250 6137393152 "GET / HTTP/1.1" 302 0 +INFO 2025-11-02 14:58:30,916 basehttp 58250 6154219520 "GET /en/ HTTP/1.1" 200 56415 +INFO 2025-11-02 14:58:42,299 basehttp 58250 6154219520 "GET /en/finance/packages/ HTTP/1.1" 200 40594 +INFO 2025-11-02 14:58:45,783 basehttp 58250 6154219520 "GET /en/finance/packages/fb821bd4-d545-4c4c-9fbf-8f3597489cf4/update/ HTTP/1.1" 200 44132 +ERROR 2025-11-02 14:58:54,055 tasks 16181 8648941888 Appointment 310d15a7-8bf3-4742-9d66-ea672cb4ff53 not found +ERROR 2025-11-02 14:58:54,055 tasks 16180 8648941888 Appointment 35bc0ce1-174a-41ad-bc93-fb7d92e34947 not found +ERROR 2025-11-02 14:58:54,055 tasks 16172 8648941888 Appointment bf8645b9-dc70-43b2-a756-a1cbc04a2bae not found +WARNING 2025-11-02 14:58:56,664 basehttp 58250 6137393152 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 14:58:56,689 basehttp 58250 6137393152 "GET /static/css/default/app.min.css.map HTTP/1.1" 200 2154602 +WARNING 2025-11-02 14:58:56,711 log 58250 6154219520 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 14:58:56,711 basehttp 58250 6154219520 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 14:59:18,356 log 58250 6154219520 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 14:59:18,356 basehttp 58250 6154219520 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 14:59:18,417 log 58250 6154219520 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 14:59:18,417 basehttp 58250 6154219520 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +INFO 2025-11-02 14:59:20,557 basehttp 58250 6154219520 "GET /en/finance/packages/create/ HTTP/1.1" 200 43961 +WARNING 2025-11-02 14:59:20,629 log 58250 6154219520 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 14:59:20,629 basehttp 58250 6154219520 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 14:59:20,650 basehttp 58250 6154219520 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:00:00,002 tasks 16180 8648941888 Radiology results sync started +INFO 2025-11-02 15:00:00,003 tasks 16180 8648941888 Radiology results sync completed: {'status': 'success', 'new_studies': 0, 'new_reports': 0, 'errors': 0, 'timestamp': '2025-11-02 12:00:00.003104+00:00'} +INFO 2025-11-02 15:00:00,007 tasks 16172 8648941888 Lab results sync started +INFO 2025-11-02 15:00:00,007 tasks 16172 8648941888 Lab results sync completed: {'status': 'success', 'new_results': 0, 'updated_results': 0, 'errors': 0, 'timestamp': '2025-11-02 12:00:00.007361+00:00'} +ERROR 2025-11-02 15:00:00,009 tasks 16180 8648941888 Appointment 7d8e8281-f28e-47b2-bae6-04647dd5204d not found +ERROR 2025-11-02 15:01:03,106 tasks 16172 8648941888 Appointment f3cf1889-ed7b-4416-8f02-ea8113a8b650 not found +ERROR 2025-11-02 15:01:03,106 tasks 16180 8648941888 Appointment 6f4fe326-9e43-4b30-bae0-619526511ee5 not found +INFO 2025-11-02 15:01:49,025 autoreload 58250 8648941888 /Users/marwanalwali/AgdarCentre/finance/forms.py changed, reloading. +INFO 2025-11-02 15:01:49,407 autoreload 60273 8648941888 Watching for file changes with StatReloader +INFO 2025-11-02 15:02:00,876 basehttp 60273 6161133568 "GET /en/finance/packages/create/ HTTP/1.1" 200 41737 +WARNING 2025-11-02 15:02:00,958 log 60273 6161133568 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:02:00,958 basehttp 60273 6161133568 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:02:00,987 basehttp 60273 6161133568 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +ERROR 2025-11-02 15:02:03,838 tasks 16180 8648941888 Appointment e494458f-a5fd-481b-97a3-c14466b6f1a1 not found +ERROR 2025-11-02 15:02:04,122 tasks 16180 8648941888 Appointment e494458f-a5fd-481b-97a3-c14466b6f1a1 not found +ERROR 2025-11-02 15:03:35,012 tasks 16181 8648941888 Appointment 0ff795b3-68a3-44e3-ad35-9b50b6e098a8 not found +ERROR 2025-11-02 15:03:35,012 tasks 16172 8648941888 Appointment 642dc474-cd97-4dc0-8924-b2b832eeaea1 not found +ERROR 2025-11-02 15:03:35,012 tasks 16180 8648941888 Appointment 251d4c8d-ad19-44b7-a10b-3b3ff3951257 not found +ERROR 2025-11-02 15:04:52,071 tasks 16172 8648941888 Appointment 6f4fe326-9e43-4b30-bae0-619526511ee5 not found +ERROR 2025-11-02 15:04:52,071 tasks 16180 8648941888 Appointment f3cf1889-ed7b-4416-8f02-ea8113a8b650 not found +ERROR 2025-11-02 15:06:13,808 tasks 16180 8648941888 Appointment d3a1ced0-c9ad-46e7-8c9c-28d5a9e39178 not found +ERROR 2025-11-02 15:06:13,812 tasks 16172 8648941888 Appointment d3a1ced0-c9ad-46e7-8c9c-28d5a9e39178 not found +ERROR 2025-11-02 15:06:13,818 tasks 16180 8648941888 Appointment d3a1ced0-c9ad-46e7-8c9c-28d5a9e39178 not found +ERROR 2025-11-02 15:06:13,927 tasks 16180 8648941888 Appointment d3a1ced0-c9ad-46e7-8c9c-28d5a9e39178 not found +ERROR 2025-11-02 15:06:13,935 tasks 16180 8648941888 Appointment d3a1ced0-c9ad-46e7-8c9c-28d5a9e39178 not found +ERROR 2025-11-02 15:07:00,671 tasks 16180 8648941888 Appointment d3a1ced0-c9ad-46e7-8c9c-28d5a9e39178 not found +INFO 2025-11-02 15:07:10,323 autoreload 60273 8648941888 /Users/marwanalwali/AgdarCentre/finance/models.py changed, reloading. +INFO 2025-11-02 15:07:10,686 autoreload 63004 8648941888 Watching for file changes with StatReloader +INFO 2025-11-02 15:07:49,337 autoreload 63004 8648941888 /Users/marwanalwali/AgdarCentre/finance/admin.py changed, reloading. +INFO 2025-11-02 15:07:49,687 autoreload 63420 8648941888 Watching for file changes with StatReloader +ERROR 2025-11-02 15:08:01,336 tasks 16180 8648941888 Appointment d3a1ced0-c9ad-46e7-8c9c-28d5a9e39178 not found +ERROR 2025-11-02 15:08:58,551 tasks 16172 8648941888 Appointment 1ba52899-1a8e-4bce-93bd-d1d643bb7b69 not found +ERROR 2025-11-02 15:08:58,551 tasks 16180 8648941888 Appointment 84999784-a5ac-4385-82c0-6beee6a870fe not found +INFO 2025-11-02 15:09:25,294 autoreload 63420 8648941888 /Users/marwanalwali/AgdarCentre/finance/forms.py changed, reloading. +INFO 2025-11-02 15:09:25,624 autoreload 64288 8648941888 Watching for file changes with StatReloader +INFO 2025-11-02 15:09:41,782 autoreload 64288 8648941888 /Users/marwanalwali/AgdarCentre/finance/forms.py changed, reloading. +INFO 2025-11-02 15:09:42,069 autoreload 64395 8648941888 Watching for file changes with StatReloader +INFO 2025-11-02 15:10:12,304 autoreload 64395 8648941888 /Users/marwanalwali/AgdarCentre/finance/views.py changed, reloading. +INFO 2025-11-02 15:10:12,618 autoreload 64676 8648941888 Watching for file changes with StatReloader +INFO 2025-11-02 15:11:58,836 autoreload 65634 8648941888 Watching for file changes with StatReloader +INFO 2025-11-02 15:12:01,831 basehttp 65634 6189592576 "GET /en/finance/packages/create/ HTTP/1.1" 200 57459 +WARNING 2025-11-02 15:12:01,933 log 65634 6189592576 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:12:01,933 basehttp 65634 6189592576 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:12:01,934 basehttp 65634 6206418944 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:13:10,989 basehttp 65634 13170143232 "GET /en/finance/packages/create/ HTTP/1.1" 200 57538 +WARNING 2025-11-02 15:13:11,064 log 65634 13170143232 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:13:11,064 basehttp 65634 13170143232 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:13:11,090 basehttp 65634 13170143232 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:13:59,288 autoreload 65634 8648941888 /Users/marwanalwali/AgdarCentre/finance/forms.py changed, reloading. +INFO 2025-11-02 15:13:59,607 autoreload 66715 8648941888 Watching for file changes with StatReloader +INFO 2025-11-02 15:14:03,144 basehttp 66715 6163656704 "GET /en/finance/packages/create/ HTTP/1.1" 200 57540 +WARNING 2025-11-02 15:14:03,247 basehttp 66715 13304360960 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +WARNING 2025-11-02 15:14:03,303 log 66715 6163656704 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:14:03,303 basehttp 66715 6163656704 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16670 +INFO 2025-11-02 15:14:04,873 basehttp 66715 6163656704 "GET /en/finance/packages/create/ HTTP/1.1" 200 57538 +WARNING 2025-11-02 15:14:04,948 log 66715 6163656704 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:14:04,948 basehttp 66715 6163656704 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:14:04,961 basehttp 66715 6163656704 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:14:13,430 autoreload 66860 8648941888 Watching for file changes with StatReloader +INFO 2025-11-02 15:14:15,779 basehttp 66860 6197473280 "GET /en/finance/packages/create/ HTTP/1.1" 200 57540 +WARNING 2025-11-02 15:14:15,892 basehttp 66860 6214299648 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +WARNING 2025-11-02 15:14:15,898 log 66860 6197473280 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:14:15,898 basehttp 66860 6197473280 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16670 +ERROR 2025-11-02 15:17:58,789 tasks 16180 8648941888 Appointment b00eedde-1f8d-4556-bef4-07369f144d4e not found +ERROR 2025-11-02 15:17:58,789 tasks 16181 8648941888 Appointment a0aed854-c98c-4d7a-b0d3-981bd7efb97f not found +ERROR 2025-11-02 15:17:58,790 tasks 16173 8648941888 Appointment 7221c9b8-2318-4410-8548-141cae6b9132 not found +ERROR 2025-11-02 15:17:58,791 tasks 16172 8648941888 Appointment d51ff4c0-8550-419f-bc72-c743e6c7098d not found +ERROR 2025-11-02 15:17:58,792 tasks 16182 8648941888 Appointment d1318b1d-29af-448b-a49d-4747e962b336 not found +ERROR 2025-11-02 15:18:44,536 tasks 16180 8648941888 Appointment d3a1ced0-c9ad-46e7-8c9c-28d5a9e39178 not found +ERROR 2025-11-02 15:21:11,927 tasks 16180 8648941888 Appointment d3a1ced0-c9ad-46e7-8c9c-28d5a9e39178 not found +ERROR 2025-11-02 15:21:12,182 tasks 16180 8648941888 Appointment d3a1ced0-c9ad-46e7-8c9c-28d5a9e39178 not found +ERROR 2025-11-02 15:21:40,631 tasks 16180 8648941888 Appointment 4b81a2bd-b651-4c74-96ca-f624d7506c25 not found +ERROR 2025-11-02 15:22:08,369 tasks 16173 8648941888 Appointment 70b4da76-44f5-42a8-92c2-a8915a849a3a not found +ERROR 2025-11-02 15:22:08,369 tasks 16172 8648941888 Appointment 800db3b9-d5ac-452d-8bb4-c046e1b066d7 not found +ERROR 2025-11-02 15:22:08,369 tasks 16181 8648941888 Appointment 0a8e9bd3-9c80-4e96-a583-3159f209047d not found +ERROR 2025-11-02 15:22:08,369 tasks 16182 8648941888 Appointment ec4c2b50-b176-4fb2-b6cb-77b1271cae77 not found +ERROR 2025-11-02 15:22:08,369 tasks 16180 8648941888 Appointment 8b124918-494c-44bb-967a-7a96e1cc2642 not found +ERROR 2025-11-02 15:24:51,817 tasks 16180 8648941888 Appointment 7d8e8281-f28e-47b2-bae6-04647dd5204d not found +ERROR 2025-11-02 15:28:53,975 tasks 16172 8648941888 Appointment b0c1c980-442f-4adc-ac76-2cd181929efd not found +ERROR 2025-11-02 15:28:53,975 tasks 16180 8648941888 Appointment 07419aca-aaed-4f2f-9af3-680578504323 not found +ERROR 2025-11-02 15:29:59,924 tasks 16172 8648941888 Appointment 01e64bc4-bb55-4589-ade8-2d684af8679f not found +ERROR 2025-11-02 15:29:59,924 tasks 16180 8648941888 Appointment 7046f839-aede-4d5e-86f6-716893505439 not found +INFO 2025-11-02 15:30:00,010 tasks 16180 8648941888 Radiology results sync started +INFO 2025-11-02 15:30:00,010 tasks 16180 8648941888 Radiology results sync completed: {'status': 'success', 'new_studies': 0, 'new_reports': 0, 'errors': 0, 'timestamp': '2025-11-02 12:30:00.010630+00:00'} +INFO 2025-11-02 15:30:00,017 tasks 16180 8648941888 Lab results sync started +INFO 2025-11-02 15:30:00,017 tasks 16180 8648941888 Lab results sync completed: {'status': 'success', 'new_results': 0, 'updated_results': 0, 'errors': 0, 'timestamp': '2025-11-02 12:30:00.017207+00:00'} +ERROR 2025-11-02 15:31:03,023 tasks 16181 8648941888 Appointment 642dc474-cd97-4dc0-8924-b2b832eeaea1 not found +ERROR 2025-11-02 15:31:03,024 tasks 16180 8648941888 Appointment 0ff795b3-68a3-44e3-ad35-9b50b6e098a8 not found +ERROR 2025-11-02 15:31:03,023 tasks 16172 8648941888 Appointment 251d4c8d-ad19-44b7-a10b-3b3ff3951257 not found +ERROR 2025-11-02 15:32:03,753 tasks 16180 8648941888 Appointment 8f028c27-4142-489c-91a8-417fa19038bf not found +ERROR 2025-11-02 15:32:04,031 tasks 16180 8648941888 Appointment 8f028c27-4142-489c-91a8-417fa19038bf not found +ERROR 2025-11-02 15:34:51,981 tasks 16180 8648941888 Appointment 251d4c8d-ad19-44b7-a10b-3b3ff3951257 not found +ERROR 2025-11-02 15:34:51,981 tasks 16172 8648941888 Appointment 0ff795b3-68a3-44e3-ad35-9b50b6e098a8 not found +ERROR 2025-11-02 15:34:51,981 tasks 16181 8648941888 Appointment 642dc474-cd97-4dc0-8924-b2b832eeaea1 not found +INFO 2025-11-02 15:36:10,655 basehttp 66860 6197473280 "GET /en/finance/packages/create/ HTTP/1.1" 200 57540 +WARNING 2025-11-02 15:36:10,740 basehttp 66860 6214299648 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +WARNING 2025-11-02 15:36:10,741 log 66860 6197473280 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:36:10,741 basehttp 66860 6197473280 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +INFO 2025-11-02 15:36:15,168 basehttp 66860 6197473280 "GET /en/finance/packages/create/ HTTP/1.1" 200 57538 +WARNING 2025-11-02 15:36:15,247 log 66860 6197473280 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:36:15,248 basehttp 66860 6197473280 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:36:15,267 basehttp 66860 6197473280 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:36:42,110 basehttp 66860 6214299648 "GET /en/finance/packages/create/ HTTP/1.1" 200 57982 +WARNING 2025-11-02 15:36:42,182 log 66860 6214299648 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:36:42,183 basehttp 66860 6214299648 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:36:42,220 basehttp 66860 6214299648 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:37:25,764 autoreload 66860 8648941888 /Users/marwanalwali/AgdarCentre/finance/forms.py changed, reloading. +INFO 2025-11-02 15:37:26,230 autoreload 77901 8648941888 Watching for file changes with StatReloader +WARNING 2025-11-02 15:37:26,923 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +WARNING 2025-11-02 15:37:27,014 log 77901 12901707776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:37:27,014 basehttp 77901 12901707776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:37:27,074 log 77901 12901707776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:37:27,075 basehttp 77901 12901707776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +INFO 2025-11-02 15:37:28,916 basehttp 77901 12901707776 "GET /en/finance/packages/create/ HTTP/1.1" 200 52910 +WARNING 2025-11-02 15:37:28,986 log 77901 12901707776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:37:28,986 basehttp 77901 12901707776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:37:29,020 basehttp 77901 12901707776 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +ERROR 2025-11-02 15:40:24,595 tasks 16180 8648941888 Appointment f3cf1889-ed7b-4416-8f02-ea8113a8b650 not found +ERROR 2025-11-02 15:40:24,594 tasks 16172 8648941888 Appointment 6f4fe326-9e43-4b30-bae0-619526511ee5 not found +INFO 2025-11-02 15:40:34,026 basehttp 77901 6157529088 "GET /en/finance/packages/create/ HTTP/1.1" 200 52555 +WARNING 2025-11-02 15:40:34,116 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:40:34,116 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:40:34,124 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:42:11,603 basehttp 77901 6157529088 "GET /en/finance/packages/create/ HTTP/1.1" 200 52557 +WARNING 2025-11-02 15:42:11,706 basehttp 77901 12901707776 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +WARNING 2025-11-02 15:42:11,711 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:42:11,712 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16669 +INFO 2025-11-02 15:43:59,095 basehttp 77901 6157529088 "GET /en/finance/packages/create/ HTTP/1.1" 200 52429 +WARNING 2025-11-02 15:43:59,171 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:43:59,171 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:43:59,187 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:44:19,576 basehttp 77901 12901707776 "GET /en/finance/packages/create/ HTTP/1.1" 200 52434 +WARNING 2025-11-02 15:44:19,649 log 77901 12901707776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:44:19,649 basehttp 77901 12901707776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:44:19,692 basehttp 77901 12901707776 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:44:20,778 basehttp 77901 6157529088 "GET /en/finance/packages/create/ HTTP/1.1" 200 52434 +WARNING 2025-11-02 15:44:20,850 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:44:20,850 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:44:20,876 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:44:33,112 basehttp 77901 12901707776 "GET /en/finance/packages/create/ HTTP/1.1" 200 52437 +WARNING 2025-11-02 15:44:33,189 log 77901 12901707776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:44:33,190 basehttp 77901 12901707776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:44:33,227 basehttp 77901 12901707776 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:44:43,111 basehttp 77901 6157529088 "GET /en/finance/packages/create/ HTTP/1.1" 200 52437 +WARNING 2025-11-02 15:44:43,188 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:44:43,188 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:44:43,209 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:47:37,234 basehttp 77901 6157529088 "POST /en/finance/packages/create/ HTTP/1.1" 302 0 +INFO 2025-11-02 15:47:37,304 basehttp 77901 6157529088 "GET /en/finance/packages/ HTTP/1.1" 200 42734 +WARNING 2025-11-02 15:47:37,388 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:47:37,388 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:47:37,400 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:47:47,853 basehttp 77901 12901707776 "GET /en/finance/packages/7b83fae1-71b3-4360-b10f-54955d640db1/update/ HTTP/1.1" 200 62819 +WARNING 2025-11-02 15:47:47,926 log 77901 12901707776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:47:47,926 basehttp 77901 12901707776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:47:47,955 basehttp 77901 12901707776 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:47:52,703 basehttp 77901 6157529088 "GET /en/finance/packages/ HTTP/1.1" 200 42414 +WARNING 2025-11-02 15:47:52,780 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:47:52,781 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:47:52,791 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:47:55,809 basehttp 77901 12901707776 "GET /en/ HTTP/1.1" 200 56418 +WARNING 2025-11-02 15:47:55,882 log 77901 12901707776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:47:55,882 basehttp 77901 12901707776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:47:55,909 basehttp 77901 12901707776 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +ERROR 2025-11-02 15:47:58,764 tasks 16180 8648941888 Appointment 77bb0820-19c1-473f-a574-3cb8845eb3f9 not found +INFO 2025-11-02 15:48:21,205 basehttp 77901 6157529088 "GET /en/finance/reports/ HTTP/1.1" 200 45947 +WARNING 2025-11-02 15:48:21,286 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:48:21,287 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:48:21,330 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +WARNING 2025-11-02 15:49:26,985 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +WARNING 2025-11-02 15:49:27,092 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:49:27,092 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16669 +WARNING 2025-11-02 15:49:27,194 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:49:27,194 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16669 +INFO 2025-11-02 15:51:26,953 basehttp 77901 6157529088 "GET /en/ HTTP/1.1" 200 57783 +WARNING 2025-11-02 15:51:27,027 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:51:27,027 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:51:27,073 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +ERROR 2025-11-02 15:51:40,611 tasks 16180 8648941888 Appointment a754db19-dbcb-40e9-a03e-742e2c13ea83 not found +ERROR 2025-11-02 15:51:40,611 tasks 16181 8648941888 Appointment 80157786-4d02-4e2a-960f-8ff0acdb443b not found +ERROR 2025-11-02 15:51:40,612 tasks 16172 8648941888 Appointment 4e16bbd2-83d1-46e7-a439-b2f3d06fc35a not found +ERROR 2025-11-02 15:51:40,612 tasks 16173 8648941888 Appointment 7d208dcb-490f-4f66-97e0-807f7a4cc9d4 not found +ERROR 2025-11-02 15:52:08,345 tasks 16180 8648941888 Appointment 35bc0ce1-174a-41ad-bc93-fb7d92e34947 not found +ERROR 2025-11-02 15:52:08,345 tasks 16172 8648941888 Appointment bf8645b9-dc70-43b2-a756-a1cbc04a2bae not found +ERROR 2025-11-02 15:52:08,345 tasks 16181 8648941888 Appointment 310d15a7-8bf3-4742-9d66-ea672cb4ff53 not found +INFO 2025-11-02 15:52:48,840 basehttp 77901 6157529088 "GET /en/ HTTP/1.1" 200 56671 +WARNING 2025-11-02 15:52:48,912 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:52:48,912 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:52:48,963 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:53:51,042 basehttp 77901 6157529088 "GET /en/ HTTP/1.1" 200 56804 +WARNING 2025-11-02 15:53:51,120 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:53:51,121 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:53:51,161 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:54:13,667 basehttp 77901 12901707776 "GET /en/ HTTP/1.1" 200 56793 +WARNING 2025-11-02 15:54:13,741 log 77901 12901707776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:54:13,741 basehttp 77901 12901707776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:54:13,790 basehttp 77901 12901707776 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +ERROR 2025-11-02 15:54:51,782 tasks 16180 8648941888 Appointment 01e64bc4-bb55-4589-ade8-2d684af8679f not found +ERROR 2025-11-02 15:54:51,782 tasks 16172 8648941888 Appointment 7046f839-aede-4d5e-86f6-716893505439 not found +INFO 2025-11-02 15:55:58,320 basehttp 77901 6157529088 "GET /en/ HTTP/1.1" 200 57146 +WARNING 2025-11-02 15:55:58,395 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:55:58,395 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:55:58,443 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:56:23,634 basehttp 77901 12901707776 "GET /en/ HTTP/1.1" 200 57137 +WARNING 2025-11-02 15:56:23,709 log 77901 12901707776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:56:23,709 basehttp 77901 12901707776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:56:23,750 basehttp 77901 12901707776 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 15:58:01,008 basehttp 77901 6157529088 "GET /en/ HTTP/1.1" 200 56508 +WARNING 2025-11-02 15:58:01,081 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 15:58:01,082 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 15:58:01,133 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +ERROR 2025-11-02 15:58:53,924 tasks 16180 8648941888 Appointment e494458f-a5fd-481b-97a3-c14466b6f1a1 not found +INFO 2025-11-02 16:00:00,006 tasks 16180 8648941888 Radiology results sync started +INFO 2025-11-02 16:00:00,007 tasks 16180 8648941888 Radiology results sync completed: {'status': 'success', 'new_studies': 0, 'new_reports': 0, 'errors': 0, 'timestamp': '2025-11-02 13:00:00.007287+00:00'} +INFO 2025-11-02 16:00:00,013 tasks 16180 8648941888 Lab results sync started +INFO 2025-11-02 16:00:00,013 tasks 16180 8648941888 Lab results sync completed: {'status': 'success', 'new_results': 0, 'updated_results': 0, 'errors': 0, 'timestamp': '2025-11-02 13:00:00.013790+00:00'} +INFO 2025-11-02 16:00:00,201 basehttp 77901 6157529088 "GET /en/ HTTP/1.1" 200 51718 +WARNING 2025-11-02 16:00:00,272 log 77901 6157529088 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 16:00:00,272 basehttp 77901 6157529088 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 16:00:00,327 basehttp 77901 6157529088 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +INFO 2025-11-02 16:00:35,311 basehttp 77901 12901707776 "GET /en/ HTTP/1.1" 200 47869 +WARNING 2025-11-02 16:00:35,384 log 77901 12901707776 Not Found: /.well-known/appspecific/com.chrome.devtools.json +WARNING 2025-11-02 16:00:35,385 basehttp 77901 12901707776 "GET /.well-known/appspecific/com.chrome.devtools.json HTTP/1.1" 404 16668 +WARNING 2025-11-02 16:00:35,429 basehttp 77901 12901707776 "GET /static/plugins/toastr/toastr.js.map HTTP/1.1" 404 2011 +ERROR 2025-11-02 16:02:03,710 tasks 16172 8648941888 Appointment 1ba52899-1a8e-4bce-93bd-d1d643bb7b69 not found +ERROR 2025-11-02 16:02:03,710 tasks 16180 8648941888 Appointment 84999784-a5ac-4385-82c0-6beee6a870fe not found +ERROR 2025-11-02 16:02:03,983 tasks 16180 8648941888 Appointment 84999784-a5ac-4385-82c0-6beee6a870fe not found +ERROR 2025-11-02 16:02:03,983 tasks 16172 8648941888 Appointment 1ba52899-1a8e-4bce-93bd-d1d643bb7b69 not found +INFO 2025-11-02 16:02:12,288 basehttp 77901 6157529088 "GET /en/ HTTP/1.1" 200 47781 +INFO 2025-11-02 16:02:22,838 basehttp 77901 6157529088 "GET /en/switch_language/?language=ar HTTP/1.1" 302 0 +INFO 2025-11-02 16:02:22,917 basehttp 77901 6157529088 "GET / HTTP/1.1" 302 0 +INFO 2025-11-02 16:02:22,996 basehttp 77901 12901707776 "GET /ar/ HTTP/1.1" 200 49014 +INFO 2025-11-02 16:02:23,008 basehttp 77901 6157529088 "GET /static/css/rtl-fixes.css HTTP/1.1" 200 1420 +INFO 2025-11-02 16:02:23,010 basehttp 77901 12901707776 "GET /static/css/default/app-rtl.min.css HTTP/1.1" 200 1020811 +INFO 2025-11-02 16:02:33,341 basehttp 77901 12901707776 "GET /ar/switch_language/?language=en HTTP/1.1" 302 0 +INFO 2025-11-02 16:02:33,401 basehttp 77901 12901707776 "GET / HTTP/1.1" 302 0 +INFO 2025-11-02 16:02:33,495 basehttp 77901 6157529088 "GET /en/ HTTP/1.1" 200 47778 diff --git a/templates/partial/header.html b/templates/partial/header.html index f4a26f27..b86d2122 100644 --- a/templates/partial/header.html +++ b/templates/partial/header.html @@ -37,6 +37,7 @@ + {% if request.user.is_authenticated %} -
- - -
-
Header Fixed
-
-
- - -
-
-
-
-
Header Inverse
-
-
- - -
-
-
-
-
Sidebar Fixed
-
-
- - -
-
-
-
-
Sidebar Grid
-
-
- - -
-
-
-
-
Gradient Enabled
-
-
- - -
-
-
- - -
- -
Admin Design (6)
- -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - -
- -
Language Version (9)
- -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - -
- -
Frontend Design (5)
- -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - -
- - Documentation - Reset Local Storage +{#
#} +{# #} +{# #} +{#
#} +{#
Header Fixed
#} +{#
#} +{#
#} +{# #} +{# #} +{#
#} +{#
#} +{#
#} +{#
#} +{#
Header Inverse
#} +{#
#} +{#
#} +{# #} +{# #} +{#
#} +{#
#} +{#
#} +{#
#} +{#
Sidebar Fixed
#} +{#
#} +{#
#} +{# #} +{# #} +{#
#} +{#
#} +{#
#} +{#
#} +{#
Sidebar Grid
#} +{#
#} +{#
#} +{# #} +{# #} +{#
#} +{#
#} +{#
#} +{#
#} +{#
Gradient Enabled
#} +{#
#} +{#
#} +{# #} +{# #} +{#
#} +{#
#} +{#
#} +{# #} +{# #} +{#
#} +{# #} +{#
Admin Design (6)
#} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{#
#} +{##} +{#
Language Version (9)
#} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{##} +{#
#} +{##} +{#
Frontend Design (5)
#} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{# #} +{##} +{#
#} +{##} +{# Documentation#} +{# Reset Local Storage#} \ No newline at end of file