From c27bed6692672703186c4aae4d7b6edcba08cdcf Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 26 Jul 2024 13:50:45 +0200 Subject: [PATCH 1/2] add sessions stats --- rowers/urls.py | 1 + rowers/views/otherviews.py | 42 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/rowers/urls.py b/rowers/urls.py index 6f07085a..8473f83a 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -275,6 +275,7 @@ urlpatterns = [ views.instroke_data, name='instroke_data'), re_path(r'^exportallworkouts/?/$', views.workouts_summaries_email_view, name='workouts_summaries_email_view'), + path('sessionstats/', views.sessions_stats, name='sessions_stats'), path('failedjobs/', views.failed_queue_view, name='failed_queue_view'), path('sleep/', views.sleep_view, name='sleep_view'), path('filmdeaths/', views.filmdeaths_view, name='filmdeaths_view'), diff --git a/rowers/views/otherviews.py b/rowers/views/otherviews.py index 0e9e286e..79442881 100644 --- a/rowers/views/otherviews.py +++ b/rowers/views/otherviews.py @@ -1,6 +1,7 @@ from rowers.views.statements import * from rowers.interactiveplots import sleep +from rowers.plannedsessions import is_session_complete from rq import Queue from redis import Redis @@ -55,6 +56,47 @@ def download_fit(request, filename=''): return response # pragma: no cover +@login_required() +def sessions_stats(request): + if not request.user.is_staff: # pragma: no cover + raise PermissionDenied("Not Allowed") + + ws = Workout.objects.filter(plannedsession__isnull=False) + + results = [] + + for w in ws: + ps = w.plannedsession + r = w.user + ratio, status, cdate = is_session_complete(r, ps) + d = { + 'date':w.date, + 'session_id':ps.id, + 'session_name':ps.name, + 'complete': ratio, + 'status': status, + 'rscore': w.rscore, + 'duration': w.duration, + } + results.append(d) + + df = pd.DataFrame(results) + + code = str(uuid4()) + filename = code+'.csv' + + df.to_csv(filename) + + with open(filename,'r') as f: + response = HttpResponse(f) + response['Content-Disposition'] = 'attachment; filename="%s"' % filename + response['Content-Type'] = 'application/octet-stream' + + os.remove(filename) + return response + + + @login_required() def failed_queue_view(request): From a22ef8937c3c5aaf4415369f29e636ab22d6db0d Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 26 Jul 2024 14:52:19 +0200 Subject: [PATCH 2/2] tested --- rowers/tests/testdata/testdata.tcx.gz | Bin 3999 -> 4002 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 3df567bb544e0d84db8ba5ba4a19de5e92daebe3..8690018423549240cefe5684373ba19ba736dd7f 100644 GIT binary patch delta 1354 zcmV-Q1-1I0AEF$+%@F1A3@E!v>lx5dO(9qrn(Ax$p*_e)Bt<0Kxm$KD}01Lh&HMsw4AbI5b& z@z-xJFAiQWH`~?K`l~}UaCq?b$)n@vn{KsUtON)#W06xjlWkyzI7%yANNyro;Uyj=Hyh;Vj>r_N&*c{`c?R z_RDp?!CNPIyIp;7hBs`kHs=chz{Ri6p8mW$#TTpfw(r)b%XHLsb+kY4)2q|2-~HNq z-N1qVsMlnF-fqwS{J_6={p0T9YO`8y7q9Wp_y4WyPxt#TZ!U#@?NWn)?tAF|Hy)lm zIyg9f_W;t*$RFQt`2FDL>#I%w)!{$;m&?uJ{>$|B_h%;r=)M5?g5Wvwk;Nl&COYB> ze*-uII9{Zk{@DL%cYW}4-);KmtIOqAhkthL&4to`q0g`S?jj%d^YZj+eYQOj_Q#7) zw!S~$$!h-wJzJ(9yG{3*@8zS7@Av)#-w9$kUfg_ozr#04)VlNKKbGn4f9m?>x7U}u zSF`{9I{lKH&EK!TU3UHU$K~ePYW=ET{=2{RBhqPp=`LO^Ptc}|?Eid!g~c70xb^k3 z?(OP-^3~=4=?28zaRYZ;;?~#SuXnF%|NF`Atym_qH(PE$$g^d7z$b+HG4B7qMRBt_ zKTo%|>|b7;ojmK-ueysw@q?|m_wG*r`@!Aswp?GW*8T0x`HS=p{DpUMx7&wDe)LL+ zvBR&)?tljpxJ`llClvN1?ndyz1BN@E?{0@Ko6&3g$z`Aa`0HPu3GN)jKR#nR=fAqX zPht~~7yG|HzUCrb^y8m*_buiZ;VzS?0wV!Glgt7t4DH5wr{Hdbp@Q7;0h0m)WeXob zp6Vh`)lBhp1e0n!922lB;imDkC?< zqLsD}8t_{$oniDLuW74`+(jt5*x9T!{93Yf1a>P~1A3JsH=<0&r30;R-XQwjlMW6q z0`C@+KMpH@?^d!_M($$7)){*S=&eaJy=nmz0%$#Q?~C4#h5p^vKQ*ZslgyG@@Tbo~Lm^}oG1`z^qWrDOQ)y#Mleu|MF^{!D-T#{Bu_ z(`x_y@#9V6c(r-A?+;yidp1{Zw%z)yySUgrt@Lq!wLU-V`YxTf+rM3j%KPJvzj@Wa zyxQD)O}@FlzF3`hefsG)FUHNeKRH?Y?%P+Zi?f@b`%8Ks)1kK>&buwoy8on0W@o|e z&!6tLTBprk-tV{DaPw$CI{)$Wbkiq4Eiabcc9}TjPwyVxt@}ED+O5yOe{%BO51GyG z&;9l}AJbd>!>h{|%XDV|UjXd?KVIDWV*liKkLl#m4)toCp2OpWa=Ceup2mxG>61tQ M16RSrD#U;R0Cbh`;Q#;t delta 1372 zcmV-i1*7_+ADR|1t7gC$a4Q^pyHwpO9+0P}Z_{6&s&lV{ zAK#sx?7dlDY*uIM`*+d6-Mt?V?;O0i=vM31`uO2;-7hbH9(8^9N4Ht-rJdKC`*&aU z{rUc4@%HUobKG5=uGZ%0>~xX7+#J1Ho_3qX^@lIs(B0iB_PclAaFz#0{p!uCfB*Bl ze!0#!c;y7|HmlFh@RrTl#qojwaPj-oC(pO1xVKtw`fh!+Oh;{2`@8c#IXmk5?XSJj z4eaTUdPC-a-R9+AANcpKf7qRzU96Uy#T)$V{r~Lxquu_?%S++6U1|`}O%L7u#=D1i z_Vx}wJb?5w^2bjb-tRp>KfCDf-~DI*YI$*Y_htI}@ykO3boW5+5xhX&x42KvL`NLq zZvguM2aB}R$Nisl=X=ll?xKIOI$hqs`&Y+aUML-Z`r@qbPV!;Tmq%yomzzUjf3Wy! z>!$-At#)tF(`EXxn{=P~UcT7)Y44Bt4iUq_;_}m{9Udf6>yDTISf;!Gwdds{rTw%i)$`%(l?!4T!tu2Clipm9HPKx36md{&4$NEECzwEmt4p%Vm1NhlKet?*6_)@nUs+ zoNjH|zdCz)__SNU?oJZL&$eFOyF2>tXLrBda(=d2_g6RPFVZ{k4e#Q1x6hCK;*}6% zhhLNJ0k+&%DC|gFkKnTh4A(s0?GBeMqu1uE%f9&K_ivsFt{ua_JYzcNzq-Cp zViOM*yT87?<|1A6%b$1sE#?>DI+LjaBLO*+%>pV6ZO3`1;BJGVg52>IlLG@~3vWT5 z>LO3oO!2f2lXC-b0&Yc<Fs zIRUnle+9Aul#?-le-8x6vO_f)r|KpcfNH|H{K&K7EQUo4U-57 zKmkLONeO)uQ{yhwgFcPj;BtRF4SHX+5ALnA*$IjPI&GQgRcf9U+gv)+cjRtcCZgBP z^-d;}pw-ec2hfLY%S6yEd4twVGw!Bt*N5CP(TbqTk!wS%zPTxroeL%bwv)sQEdg7z z@(bPpKdsQWn!922lB;imDkC?v6alm3UFPnM_4b-(xhcGLHJUB3tK{GakChiD@s ze0SXcaIn}NaA$X>kH0a0zWlV>eSh%qB5^#s_^|J@F1 z{Icu2blz_Fb|osGjyrhpx_@|guU988FMsZD z>3vLxUU@hlwmj|rlP;N^1y?_Rz1wP?HhcNB-*&_0qy6Ii2QSi1AO5;LS$3Oc;*dXm zcyw3p>)=VZK7Rb@@aJcl&GygT_FvLBTm0