From fc40296a98713ec4da19ed17655e8ae408d6ce85 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 26 May 2021 13:10:46 +0200 Subject: [PATCH 01/12] ruptures 2 --- rowers/templates/summary_edit.html | 11 ++++++++ rowers/tests/testdata/testdata.tcx.gz | Bin 0 -> 4001 bytes rowers/views/workoutviews.py | 38 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 rowers/tests/testdata/testdata.tcx.gz diff --git a/rowers/templates/summary_edit.html b/rowers/templates/summary_edit.html index fb021a59..8b303bc4 100644 --- a/rowers/templates/summary_edit.html +++ b/rowers/templates/summary_edit.html @@ -59,6 +59,17 @@ +

Feeling lucky?

+

+

+ + + {{ ruptureform.as_table }} +
+ {% csrf_token %} + +
+

Interval Shorthand

See the how-to at the bottom of this page for details on how to use this form. diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz new file mode 100644 index 0000000000000000000000000000000000000000..887f897c7b8beb74ccd409c1e0b300093d3a5815 GIT binary patch literal 4001 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 Date: Wed, 26 May 2021 13:10:56 +0200 Subject: [PATCH 02/12] sd --- rowers/templates/summary_edit.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/templates/summary_edit.html b/rowers/templates/summary_edit.html index 8b303bc4..cc68a3df 100644 --- a/rowers/templates/summary_edit.html +++ b/rowers/templates/summary_edit.html @@ -69,7 +69,7 @@ {% csrf_token %} -

+

Interval Shorthand

See the how-to at the bottom of this page for details on how to use this form. From 6d821c20933e1d99a7e961a71254de6f1acdabf9 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 28 May 2021 08:55:17 +0200 Subject: [PATCH 03/12] fixie coverage --- rowers/tasks.py | 18 ++++++++++++------ rowers/tests/test_imports.py | 4 ++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/rowers/tasks.py b/rowers/tasks.py index 38df2741..c6dbc1d5 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -2806,7 +2806,7 @@ def handle_update_wps(rid,types,ids,mode,debug=False,**kwargs): return 0 try: wps_median = int(df.loc[mask,'driveenergy'].median()) - except ValueError: + except ValueError: # pragma: no cover return 0 if mode == 'water': @@ -3029,7 +3029,7 @@ def df_from_summary(data): weightclass = data['weight_class'] try: title = data['name'] - except KeyError: + except KeyError: # pragma: no cover title = "" try: t = data['comments'].split('\n', 1)[0] @@ -3049,7 +3049,10 @@ def df_from_summary(data): times = [0] distances = [0] spms = [splits[0]['stroke_rate']] - hrs = [splits[0]['heart_rate']['average']] + try: + hrs = [splits[0]['heart_rate']['average']] + except KeyError: # pragma: no cover + hrs = [0] for split in splits: time += split['time']/10. @@ -3057,7 +3060,10 @@ def df_from_summary(data): times.append(time) distances.append(elapsed_distance) spms.append(split['stroke_rate']) - hrs.append(split['heart_rate']['average']) + try: + hrs.append(split['heart_rate']['average']) + except KeyError: # pragma: no cover + hrs.append(0) df = pd.DataFrame({ 'TimeStamp (sec)': times, @@ -3090,7 +3096,7 @@ def handle_c2_async_workout(alldata,userid,c2token,c2id,delaysec,defaulttimezone try: has_strokedata = data['stroke_data'] - except KeyError: + except KeyError: # pragma: no cover has_strokedata = True @@ -3146,7 +3152,7 @@ def handle_c2_async_workout(alldata,userid,c2token,c2id,delaysec,defaulttimezone dologging('debuglog.log',s.text) has_strokedata = False - if not has_strokedata: + if not has_strokedata: # pragma: no cover df = df_from_summary(data) else: dologging('debuglog.log',json.dumps(s.json())) diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py index 6c5b7f90..d81d07e7 100644 --- a/rowers/tests/test_imports.py +++ b/rowers/tests/test_imports.py @@ -21,6 +21,7 @@ import json import rowers.utils as utils + from django.db import transaction import rowers.garmin_stuff as gs @@ -342,6 +343,9 @@ class C2Objects(DjangoTestCase): self.assertEqual(str(timezone),'America/Los_Angeles') + df = tasks.df_from_summary(data) + self.assertEqual(len(df),8) + got = arrow.get(startdatetime).isoformat() want = arrow.get('2021-05-23 09:11:37.100000-07:00').isoformat() From 6fa8030f4cdba237f2160dd44d4897a8ec77538d Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 28 May 2021 10:17:56 +0200 Subject: [PATCH 04/12] added explanation --- rowers/datautils.py | 1 - rowers/templates/summary_edit.html | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/rowers/datautils.py b/rowers/datautils.py index 8c7727c7..8489af1f 100644 --- a/rowers/datautils.py +++ b/rowers/datautils.py @@ -468,7 +468,6 @@ def getfastest(df,thevalue,mode='distance'): starttime = griddata(restime,starttimes,[thevalue*60*1000],method='linear',rescale=True) duration = griddata(restime,restime,[thevalue*60*1000],method='linear',rescale=True) endtime = starttime+duration - print(distance,starttime,endtime ) return distance[0],starttime[0]/1000.,endtime[0]/1000. return 0 # pragma: no cover diff --git a/rowers/templates/summary_edit.html b/rowers/templates/summary_edit.html index cc68a3df..21fb9bc5 100644 --- a/rowers/templates/summary_edit.html +++ b/rowers/templates/summary_edit.html @@ -60,7 +60,9 @@

Feeling lucky?

-

+

This new, experimental feature tries to find intervals by looking for patterns in the data. It does not + autodetect rest and work intervals yet. The resulting "interval string" is copied to the Interval Shorthand + section below, where you can edit it.

From e1e16f9d41bde7fc7624dd0733cd9ef00c02c3f6 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 28 May 2021 10:23:52 +0200 Subject: [PATCH 05/12] feeling lucky --- rowers/templates/summary_edit.html | 104 +++++++++++++++-------------- 1 file changed, 55 insertions(+), 49 deletions(-) diff --git a/rowers/templates/summary_edit.html b/rowers/templates/summary_edit.html index 21fb9bc5..13e6f8c7 100644 --- a/rowers/templates/summary_edit.html +++ b/rowers/templates/summary_edit.html @@ -41,24 +41,60 @@ title="Jump to following workout">Next {% endif %}

+

+

+ + + + + + + + + +
Name{{ workout.name }}
Distance:{{ workout.distance }}m
Duration:{{ workout.duration |durationprint:"%H:%M:%S.%f" }}
Public link to this workout + https://rowsandall.com/rowers/workout/{{ workout.id|encode }} + +
+

Edit Workout Interval Data