From cc93ec9ccb6452a048f0343e3130c524049badcb Mon Sep 17 00:00:00 2001 From: sanderroosendaal Date: Mon, 31 Oct 2016 21:16:08 +0100 Subject: [PATCH] Fixed bugs for pace rendering on charts and in text --- rowers/interactiveplots.py | 72 +++++++++++++++++------------ rowers/templates/rankings.html | 8 ++-- rowers/templatetags/rowerfilters.py | 19 ++++++++ 3 files changed, 66 insertions(+), 33 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 52eb272f..806c1125 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -96,7 +96,7 @@ def nicepaceformat(values): return out -def get_datetimes(seconds,tzinfo=0): +def get_datetimes(seconds,tzinfo=0,datevalues=0): out = [] for second in seconds: if (second<=0) or (second>1e9): @@ -122,6 +122,10 @@ def get_datetimes(seconds,tzinfo=0): seconds=sec,microseconds=microsecond) + if datevalues==1: + t = datetime.datetime(2016,5,1)+dt + dt = t + out.append(dt) @@ -246,7 +250,8 @@ def interactive_cpchart(thedistances,thesecs,theavpower, velo = thedistances/thesecs p = 500./velo - p2 = get_datetimes(p) + p2 = get_datetimes(p,datevalues=1) + p2a = get_datetimes(p) source = ColumnDataSource( data = dict( @@ -255,7 +260,7 @@ def interactive_cpchart(thedistances,thesecs,theavpower, spm = 0*theavpower, tim = niceformat(get_datetimes(thesecs,tzinfo=1)), power = theavpower, - pace = nicepaceformat(p2), + pace = nicepaceformat(p2a), ) ) @@ -273,7 +278,8 @@ def interactive_cpchart(thedistances,thesecs,theavpower, fitvelo = 500./fitp fitpower = 2.8*(fitvelo**3) fitt = 10**fitx/fitvelo - fitp2 = get_datetimes(fitp) + fitp2 = get_datetimes(fitp,datevalues=1) + fitp2a = get_datetimes(fitp,datevalues=0) sourcepaul = ColumnDataSource( @@ -283,7 +289,7 @@ def interactive_cpchart(thedistances,thesecs,theavpower, power = fitpower, spm = 0*fitpower, tim = niceformat(get_datetimes(fitt,tzinfo=1)), - pace = nicepaceformat(fitp2), + pace = nicepaceformat(fitp2a), ) ) @@ -333,7 +339,8 @@ def interactive_cpchart(thedistances,thesecs,theavpower, fitvelo = (fitpower/2.8)**(1./3.) fitdist = fitt*fitvelo fitp = 500./fitvelo - fitp2 = get_datetimes(fitp) + fitp2 = get_datetimes(fitp,datevalues=1) + fitp2a = get_datetimes(fitp,datevalues=0) sourcecomplex = ColumnDataSource( data = dict( @@ -342,7 +349,7 @@ def interactive_cpchart(thedistances,thesecs,theavpower, tim = niceformat(get_datetimes(fitt,tzinfo=1)), spm = 0*fitpower, power = fitpower, - pace = nicepaceformat(fitp2), + pace = nicepaceformat(fitp2a), ) ) @@ -371,7 +378,8 @@ def interactive_cpchart(thedistances,thesecs,theavpower, p = 500./velo - p2 = get_datetimes(p) + p2 = get_datetimes(p,datevalues=1) + p2a = get_datetimes(p,datevalues=0) source2 = ColumnDataSource( data = dict( @@ -379,7 +387,7 @@ def interactive_cpchart(thedistances,thesecs,theavpower, power = cpdata['CP'], tim = niceformat(get_datetimes(cpdata['Delta'],tzinfo=1)), dist = cpdata['Distance'], - pace = nicepaceformat(p2), + pace = nicepaceformat(p2a), ) ) @@ -643,7 +651,8 @@ def interactive_chart(id=0,promember=0): # p[p>3000] = 3000. - p2 = get_datetimes(p) + p2 = get_datetimes(p,datevalues=1) + p2a = get_datetimes(p,datevalues=0) source = ColumnDataSource( data = dict( @@ -651,7 +660,7 @@ def interactive_chart(id=0,promember=0): y=hr, y2=p2, tf = niceformat(t2), - pace = nicepaceformat(p2), + pace = nicepaceformat(p2a), heartrate = hr, spm=spm, spmc=np.rint(10*spm)/10., @@ -873,7 +882,7 @@ def interactive_cum_flex_chart(theworkouts,promember=0, if yparam1 == 'pace': y_axis_type = 'datetime' - y1 = get_datetimes(y1) + y1 = get_datetimes(y1,datevalues=1) ymax = datetime.datetime(2016,5,1,0,1,30) ymin = datetime.datetime(2016,5,1,0,2,30) @@ -1302,7 +1311,7 @@ def interactive_flex_chart(id=0,promember=0, if yparam1 == 'pace': y_axis_type = 'datetime' - y1 = get_datetimes(y1) + y1 = get_datetimes(y1,datevalues=1) ymax = datetime.datetime(2016,5,1,0,1,30) ymin = datetime.datetime(2016,5,1,0,2,30) @@ -1483,7 +1492,7 @@ def interactive_flex_chart2(id=0,promember=0, yaxminima = { 'hr':100, 'spm':15, - 'pace': datetime.datetime(2016,5,1,0,3,30), + 'pace': datetime.timedelta(minutes=1,seconds=40), 'power': 0, 'averageforce': 0, 'peakforce': 0, @@ -1495,7 +1504,7 @@ def interactive_flex_chart2(id=0,promember=0, yaxmaxima = { 'hr':200, 'spm':45, - 'pace':datetime.datetime(2016,5,1,0,1,30), + 'pace':datetime.timedelta(minutes=3,seconds=30), 'power': 600, 'averageforce':200, 'peakforce':400, @@ -1612,7 +1621,7 @@ def interactive_flex_chart2(id=0,promember=0, if yparam1 == 'pace': y_axis_type = 'datetime' - y1 = get_datetimes(y1) + y1 = get_datetimes(y1,datevalues=1) ymax = datetime.datetime(2016,5,1,0,1,30) ymin = datetime.datetime(2016,5,1,0,2,30) @@ -1720,8 +1729,9 @@ def interactive_flex_chart2(id=0,promember=0, - yrange1 = Range1d(start=yaxminima[yparam1],end=yaxmaxima[yparam1]) - plot.y_range = yrange1 + if (yparam1 != 'pace'): + yrange1 = Range1d(start=yaxminima[yparam1],end=yaxmaxima[yparam1]) + plot.y_range = yrange1 if (xparam != 'time') and (xparam != 'distance'): xrange1 = Range1d(start=yaxminima[xparam],end=yaxmaxima[xparam]) @@ -1747,7 +1757,7 @@ def interactive_flex_chart2(id=0,promember=0, minutes = ["%M"] ) - if yparam2 != 'None': + if yparam2 != 'None' and yparam2 != 'pace': yrange2 = Range1d(start=yaxminima[yparam2],end=yaxmaxima[yparam2]) plot.extra_y_ranges = {"yax2": yrange2} @@ -1965,7 +1975,8 @@ def interactive_bar_chart(id=0,promember=0): TOOLS = 'pan,box_zoom,wheel_zoom,reset,tap,hover,crosshair' t2 = get_datetimes(t,tzinfo=1) - p2 = get_datetimes(p) + p2 = get_datetimes(p,datevalues=1) + p2a = get_datetimes(p,datevalues=0) source = ColumnDataSource( data = dict( @@ -1981,7 +1992,7 @@ def interactive_bar_chart(id=0,promember=0): hr_bottom = 0.0*hr, y2=p2, tf = niceformat(t2), - pace = nicepaceformat(p2), + pace = nicepaceformat(p2a), heartrate = hr, spmc=np.rint(10*spm)/10., spm=spm, @@ -2173,8 +2184,8 @@ def interactive_comparison_chart(id1=0,id2=0,xparam='distance',yparam='spm', if yparam == 'pace': y_axis_type = 'datetime' - y1 = get_datetimes(y1) - y2 = get_datetimes(y2) + y1 = get_datetimes(y1,datevalues=1) + y2 = get_datetimes(y2,datevalues=1) ymax = datetime.datetime(2016,5,1,0,1,30) ymin = datetime.datetime(2016,5,1,0,2,30) @@ -2363,9 +2374,12 @@ def interactive_otw_advanced_pace_chart(id=0,promember=0): rowdata.df[' DriveLength (meters)'] = drivelength t2 = get_datetimes(t,tzinfo=1) - p2 = get_datetimes(p) - nowindp2 = get_datetimes(nowindpace) - ergpace2 = get_datetimes(ergpace) + p2 = get_datetimes(p,datevalues=1) + p2a = get_datetimes(p,datevalues=0) + nowindp2 = get_datetimes(nowindpace,datevalues=1) + nowindp2a = get_datetimes(nowindpace,datevalues=0) + ergpace2 = get_datetimes(ergpace,datevalues=1) + ergpace2a = get_datetimes(ergpace,datevalues=0) # Add hover to this comma-separated string and see what changes if (promember==1): @@ -2380,9 +2394,9 @@ def interactive_otw_advanced_pace_chart(id=0,promember=0): nowindp2 = nowindp2, ergpace2 = ergpace2, tf = niceformat(t2), - pace = nicepaceformat(p2), - ergpace = nicepaceformat(ergpace2), - nowindpace = nicepaceformat(nowindp2), + pace = nicepaceformat(p2a), + ergpace = nicepaceformat(ergpace2a), + nowindpace = nicepaceformat(nowindp2a), heartrate = hr, spm=spm, spmc=np.rint(10*spm)/10., diff --git a/rowers/templates/rankings.html b/rowers/templates/rankings.html index a9ddbfb1..c06c026f 100644 --- a/rowers/templates/rankings.html +++ b/rowers/templates/rankings.html @@ -164,13 +164,13 @@ {{ value }} m {% endif %} {% if key == "pace" %} - {{ value |durationprint:"%M:%S.%f" }} + {{ value |paceprint }} {% endif %} {% if key == "power" %} {{ value }} W {% endif %} {% if key == "duration" %} - {{ value |durationprint:"%H:%M:%S.%f" }} + {{ value |paceprint }} {% endif %} {% endfor %} @@ -203,13 +203,13 @@ {{ value }} m {% endif %} {% if key == "pace" %} - {{ value |durationprint:"%M:%S.%f" }} + {{ value |paceprint }} {% endif %} {% if key == "power" %} {{ value }} W {% endif %} {% if key == "duration" %} - {{ value |durationprint:"%H:%M:%S.%f" }} + {{ value |paceprint }} {% endif %} {% endfor %} diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py index 3afa4822..d4f18b6f 100644 --- a/rowers/templatetags/rowerfilters.py +++ b/rowers/templatetags/rowerfilters.py @@ -3,6 +3,17 @@ from time import strftime register = template.Library() +def strfdelta(tdelta): + minutes,seconds = divmod(tdelta.seconds,60) + tenths = int(tdelta.microseconds/1e5) + res = "{minutes:0>2}:{seconds:0>2}.{tenths:0>1}".format( + minutes=minutes, + seconds=seconds, + tenths=tenths, + ) + + return res + @register.filter def durationprint(d,dstring): if (d == None): @@ -10,6 +21,14 @@ def durationprint(d,dstring): else: return d.strftime(dstring)[:-5] +@register.filter +def paceprint(d): + if (d == None): + return d + else: + return strfdelta(d) + + @register.filter def lookup(dict, key): s = dict.get(key)