From 82ec4c9d7c1436bb6133a9331558cd28813c895b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 22 Mar 2024 13:12:54 +0100 Subject: [PATCH] v1 chart stack --- rowers/interactiveplots.py | 60 ++++++++++++++++++++------ rowers/templates/flexchartstacked.html | 12 ++---- rowers/views/workoutviews.py | 7 +-- 3 files changed, 52 insertions(+), 27 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 9566a724..02a417d9 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -18,7 +18,8 @@ import rowers.metrics as metrics import rowers.dataprep as dataprep from rowers.dataprep import rdata import rowers.utils as utils -from jsmin import jsmin + +from rowers.rower_rules import ispromember from scipy.interpolate import griddata from scipy.signal import savgol_filter @@ -3907,15 +3908,20 @@ def interactive_flexchart_stacked(id, r, xparam='time', yparam4='spm', mode='erg'): - columns = [xparam, yparam1, yparam2, yparam3, yparam4, - 'ftime', 'distance', 'fpace', - 'power', 'hr', 'spm', 'driveenergy', - 'time', 'pace', 'workoutstate'] + columns = [name for name, d in metrics.rowingmetrics] + columns_basic = [name for name, d in metrics.rowingmetrics if d['group'] == 'basic'] + columns = columns + ['spm', 'driveenergy', 'distance'] + columns_basic = columns_basic + ['spm', 'driveenergy', 'distance'] - comment = None - - rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], doclean=True, - workstrokesonly=False) + rowdata = pd.DataFrame() + row = Workout.objects.get(id=id) + + if ispromember(r.user): + rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], doclean=True, + workstrokesonly=False, for_chart=True) + else: + rowdata = dataprep.getsmallrowdata_db(columns_basic, ids=[id], doclean=True, + workstrokesonly=False, for_chart=True) if r.usersmooth > 1: # pragma: no cover for column in columns: @@ -3929,9 +3935,17 @@ def interactive_flexchart_stacked(id, r, xparam='time', pass if len(rowdata) < 2: - rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], - doclean=False, - workstrokesonly=False) + if ispromember(r.user): + rowdata = dataprep.getsmallrowdata_db(columns, ids=[id], + doclean=False, + workstrokesonly=False, + for_chart=True) + else: + rowdata = dataprep.getsmallrowdata_db(columns_basic, ids=[id], + doclean=False, + workstrokesonly=False, + for_chart=True) + if rowdata.empty: return "", "No valid data", '', '', comment @@ -3969,6 +3983,28 @@ def interactive_flexchart_stacked(id, r, xparam='time', except KeyError: # pragma: no cover rowdata['y4'] = 0*rowdata.loc[:, 'time'] rowdata[yparam4] = rowdata['y4'] + + # replace nans + rowdata.fillna(value=0, inplace=True) + + data_dict = rowdata.to_dict("records") + + metrics_list = [{'name': name, 'rowingmetrics':d } for name, d in metrics.rowingmetrics] + + chart_data = { + 'title': row.name, + 'x': xparam, + 'y1': yparam1, + 'y2': yparam2, + 'y3': yparam3, + 'y4': yparam4, + 'data': data_dict, + 'metrics': metrics_list, + } + + script, div = get_chart("/stacked", chart_data) + + return script, div if xparam == 'time': xaxmax = tseconds.max() diff --git a/rowers/templates/flexchartstacked.html b/rowers/templates/flexchartstacked.html index d5788f79..58aa7ffb 100644 --- a/rowers/templates/flexchartstacked.html +++ b/rowers/templates/flexchartstacked.html @@ -8,16 +8,8 @@ {% localtime on %} {% block main %} -{{ js_res | safe }} -{{ css_res| safe }} + - - - - -{{ the_script |safe }}

{% if workout|previousworkout:rower.user %} @@ -34,6 +26,7 @@

Chart Stack

    +
  • {{ the_div|safe }} @@ -57,6 +50,7 @@
+{{ the_script |safe }} {% endblock %} {% endlocaltime %} diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index a09bba7b..edf0b572 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -4500,7 +4500,7 @@ def workout_flexchart_stacked_view(request, *args, **kwargs): yparam4 = cd['yaxis4'] ( - script, div, js_resources, css_resources, comment + script, div ) = interactive_flexchart_stacked( encoder.decode_hex(id), r, xparam=xparam, yparam1=yparam1, @@ -4510,9 +4510,6 @@ def workout_flexchart_stacked_view(request, *args, **kwargs): mode=workout.workouttype, ) - if comment is not None: # pragma: no cover - messages.error(request, comment) - initial = { 'xaxis': xparam, 'yaxis1': yparam1, @@ -4549,8 +4546,6 @@ def workout_flexchart_stacked_view(request, *args, **kwargs): 'active': 'nav-workouts', 'workout': workout, 'chartform': flexaxesform, - 'js_res': js_resources, - 'css_res': css_resources, 'id': id, 'xparam': xparam, 'yparam1': yparam1,