From c27bed6692672703186c4aae4d7b6edcba08cdcf Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 26 Jul 2024 13:50:45 +0200 Subject: [PATCH] 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):