From e148cf1df1b768bb6b6b1c66767b5cccf9bdcad9 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 23 Jan 2026 08:41:34 +0000 Subject: [PATCH] jobs by status breakdown --- core/__pycache__/views.cpython-311.pyc | Bin 43469 -> 43959 bytes core/templates/core/dashboard.html | 7 ++++--- core/views.py | 13 +++++++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 16832d8b3f13d09e44d7c1c25ad79393b8787128..a3c02c17b170fbf10a3e9cba632a6fab6fc2c0a9 100644 GIT binary patch delta 3214 zcmaJ@3s6+o8NTN(yTUGS*j-p2ySP`v2Ib*{tRVqKRH6wAqBSMDF6;s;u)x_R8n}SY zAZZ(`gg-VANrH`yW1>myt)opJiJiQrjSe6gwmY`YbTZSjp6#-?e~{{LMx#&Nnc z`^`E3`QMLo?&YiEg;_EFR9u{1z~8`%fbX4wbMapp4KcXY;QzB1qG8yvLuoT5YIMVl zXUTDp)4W9aN&2IV#er?J8T!l#AentE3Fa&|o1ElH8rQzc1mSi3M}AC@V=IMWwyUBq z8P?{e831Y@(%XOg2UgEAXbo;&)S{ScIU+Jt!m_`qJsrr>k?uLhPB%}OQHQpsEW zQ__YRX~V3vWm?+u$&UKTC-zM3aL?>;PfA;+q=p%(VODCLmRcvQG@#$Wex#OTcYh!WVO?LTX0HWD8mH zLV1DgM0k8g>+j`sPnnf;C4Nbiopn=3PO zRDt6pHIC4uU+?h+ZJRn89<=cnNh}f8I3-A2m7PC9OsY>b!VX0h;9%((3gA4B55V{9HT2H^D+aDXJI6iH_lxGIdW)tSmB!0TLWyqAFqG+@)d zflAgXmz zc&kQ6Rqct}fMx$C8w&xrD(){kOa8_Y>?F_<+#OVS5p|8r=eawu3-Dn@uKt%O(?@|l z4RhuB%HnmdD1$l!1Eg#M4sU!nGA(7aABFE!RcQZ!%kL{MRlOX;-iEST^Uhx*AuRBB zh~-^^O9a0`aIkQ!-`(zYxqROJ?#7@aivO0*en)VHz)f75NYhQ=IvnlsHo3dof&mNpHQc3p+;ZBp`kXsTP5`5`fAc*j0IK}7N|taW=lyqI5sH|tDT$Pen)Xm29@v|`x4 zOvetu>iPoR0pjk5_Ie8vzE^M6eu0D=%9;9hksSle?#;TFkl=`eDUT5j?B1jQ3b$WV zu0MjKJx*n@Yp+;-yMazKej3kv64t3Nj4d)C*!}dH@h|DfppIYUoc{+Yjs(>0fJ3`e zA-chYSC6%!STCT3L=mlAK`RajdQHk$!#rb0;2BQ`I}2ZWEXZl{=Ice|%puMZ;#7j( z%OXZn(Xz$ZPd3#&9-x&D8S&bAwPhh_9fVu%*GD6@n8g3QFcZm2iO;Sv93v4I!FBMo zRq9kvlNYj}g^$|uuu$`D)rMG9u$dHy42F9iP!6^iY3{fN{!1!0-BPvzwSC-aNzG3WH62&)H|-q*T}@Os!42r|%1DmfTRe$m$!vyd z7Or-glz%-rDeBbxyaiXDx}Z%#o+0H2Jr9cL(EIYCNO^SX>{o-U$C|XD%!rJmq-g5&qLmi12G=k%>>g}Fe1GsP#uYfUi+u`HhaQ&ViN$(5Ff~{sZ5PqO zL0bJCmJc zq*_h)KfwxCeKze0!b%lv)3S6JAAKUQZ%&WV|71=2~;DiSAe@CDgO>wMTeo`t#fjc2kV7#c5NHaL%X6h0lV)Rv%( zO}(FMV2%sGuJr$LIeHT5m0o{aQ?S_cZ0Q}~>GJ1uai kJ(C`E#FMa6`m0b?H&S9Y-=uy}T1nROAI zA!u8O(O)!*LP{Eql|;>LlT1t+)3KR2lT@qIfo|$d)0w_xT5+l|!7=UspG8e~I@uY% zIp_S3^Zn<4T;7_LKDj1EpEMYB0{+fV?`Xc#b1wS65q`2%E4IL@C#}%1uwVIg;yaSW zt|@)V9#N%#DHg;-p$ramDG!fE^q{X`)UWf$r{?}>x*$C8b46Y>8m?}-n@ zgTs&rSDuWH?MVnEIQ84rWXdk0;Dw|eG4r+wJ;p#JI%(?B2I3D?Cc*n@Eh-~k`$5D! zD4$=*Dd2ihAg(20?p`5~5SSM*{y##4ccC(UT|%Na_kpe;1O#VdAQ8sX?}}8Hi91#bQ1K!mW=K2myE620^E9%5a8L&Tq#}+ z=Splan3JSj%6wK-%?L(Vko8HaPS6@BBU7(NrcR~iPo>zVOv|ToYi6|aeBF$Ia7&Q2 z`r8D!MTiy>Qf7o?IR*jRvJ1s4FqZvZks*09%5*i#G-b*@wsR^ye`>*ssr(J-CL@B=!Ms;R$~|O_ag*VYgX5?8rtrJY3ouAe}NxE zc8*QAA5X90pXWZDEy-5~b9Sr5A&9oMX!vXNz%E+>9-Oh6#6xh|maQK{<$saE3K3r* zPg$IAQE3M8fDOauqD82+yJ&50$e2#&6VwqLC-^CW4;| z9U;}D2!7paXS3H_<=$FiW+U*sWos;>B;$8exmq=$QVAymWyRV0S5d)2mq~P4weoIp zmXyllew>^fMwr!_oi3#5a@yE_xVIt;AH!T?6G!3cl1yW`SF##~ffBPkfy*-GbV-#I zNe-c(SE}vaBx+r?oIUFNWO2vXZBo0u1J?GbF_Jglsmtn z5|jJrHRd8&XU{1+O~efZn+ars@aTdOR2vP=&hQ9-i4j`lchII=`J;WGTF+~I7x@^4 zu5}mmyt2z^e+X7pRmh*>vR~O-HKy%-8<&2yt7%YG`P7bvqipRyF&GWS0m&CUB6JDl}H8mV%K^SCgZ&)$3uyB&TuVS8sIt z%>RHBwMF6%_(N@$xF5c%Z4edsLEU56?!G#c*ae5{HkiYjhWaI_UESU2>fn{X3nDjF zXebOe2{oJYmi&ekRLt#TbT{V~lpRhdE9C5gdXLxP?esKI44f)H%Gpij@*ULvnQ~`S zo<`qGhBOteI=HYWtBUV?=#V#rI(&AL+(RNW{#YR{g8IhRW>>qnp|#oLWq0x91{Fs? z%#7QVOZ6q#E}-7BUOWahTm14plz*vQ-f~hZd03B_jgxrnkNGxtWbW*6I(QG!XMlZ4 zB0cZiketoJ*~ZN{leEr4`74y_l_#8!Q{#6wxzobR>+4Yr9oUvD3rH?aDcE*T5_@5B z%hN_4EPr_(yBg&?#5dqWUt0=S|0{7w zBj6)hiw5j8Jk^~N%X^m(6bFg_3BK-3IR@oz%4qjIm4=7=I=sE}EjbQPcPrii=5`Ry z?0W7SA029XbL9lI0Hv?jr-?PbxVbkaHj!)z#weq972FzM z4SgdKit9%^w0bj1=cs*lpkMqGG{HrrmU}SYl8G|we5N6foYf;Pd30tAUDbDRVajn@ zQe&}w1RDuT2qgI6;PP003%LtTxPOCo*rZFNJ;CplqTy#`F$o5aem^&zPI%>80-X)@^(u^P1Y59D=^HsBX?Svzz%*(swW8Rs-RQ>g+~j6vf7FB0Gke`; z_6B_(^Nz{b+-ZQJa_!V~9iW+flo2DLPA~yFTabUNtr;i3N~3 zZZi-Izg*{WF*Ex))Q{UTcpS@#eId#iZ&dmOSm)vxf{F2Du@F8SH_OGSkq^`3H>0nj zMo`n?Xm>h1?27XDm#al&Q2fe3Fa77j#t2>{pzkxAAfS&Qdy{}Z6pTIr><$49Cq@&9 z(b!-#3K(@ZqjqJ~Jd6sSQGGKiSzaYPBaGr<6fPrfr?8@ykPn)Gvyr83Zf9q!tBkEz hHk{ZkC2tkQZ_NmVw^V`@+n+uo@uRiM^s66B{{
Jobs by Status
    - {% for status in jobs_by_status %} + {% for status in client_stat.client_jobs_by_status %}
  • - + {{ status.status__name }} + {{ status.count }}
  • {% empty %} -
  • No jobs found.
  • +
  • No jobs found for this client.
  • {% endfor %}
diff --git a/core/views.py b/core/views.py index de75828..86b22f1 100644 --- a/core/views.py +++ b/core/views.py @@ -162,11 +162,14 @@ def dashboard(request): 'missing_count': missing_count, 'folder_id': folder.id }) + # Calculate status breakdown for jobs with no client + no_client_jobs_by_status = jobs_no_client.values('status__name').annotate(count=Count('id')).order_by('status__name') client_stats.append({ 'client_name': "No Client Assigned", 'total_jobs': no_client_total_jobs, 'incomplete_jobs': no_client_incomplete_jobs, - 'incomplete_folder_breakdown': no_client_incomplete_folder_breakdown + 'incomplete_folder_breakdown': no_client_incomplete_folder_breakdown, + 'client_jobs_by_status': no_client_jobs_by_status }) for client in clients: @@ -188,12 +191,14 @@ def dashboard(request): 'missing_count': missing_count, 'folder_id': folder.id }) - + # Calculate status breakdown for the current client's jobs + client_jobs_by_status = client_jobs.values('status__name').annotate(count=Count('id')).order_by('status__name') client_stats.append({ 'client_name': client.name, 'total_jobs': total_client_jobs, 'incomplete_jobs': client_incomplete_jobs, - 'incomplete_folder_breakdown': client_incomplete_folder_breakdown + 'incomplete_folder_breakdown': client_incomplete_folder_breakdown, + 'client_jobs_by_status': client_jobs_by_status }) @@ -831,4 +836,4 @@ def user_delete(request, pk): user_to_delete.delete() messages.success(request, f"User {username} deleted.") - return redirect('user_list') + return redirect('user_list') \ No newline at end of file