From 3cec874a84c1e6d1b0f0ba1a22eb7a49e10cc992 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 25 Jan 2017 21:24:36 +0100 Subject: [PATCH 1/2] add FTP and power to makeplot --- rowers/tasks.py | 8 +++-- rowers/views.py | 86 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/rowers/tasks.py b/rowers/tasks.py index 3fc8685a..1f5db407 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -177,11 +177,15 @@ def handle_makeplot(f1,f2,t,hrdata,plotnr,imagename): hrat = hrdata['hrat'] hrtr = hrdata['hrtr'] hran = hrdata['hran'] - + ftp = hrdata['ftp'] + powerzones = hrdata['powerzones'] + powerperc = hrdata['powerperc'] rr = rowingdata.rower(hrmax=hrmax,hrut2=hrut2, hrut1=hrut1,hrat=hrat, - hrtr=hrtr,hran=hran) + hrtr=hrtr,hran=hran, + ftp=ftp,powerperc=powerperc, + powerzones=powerzones) try: row = rdata(f2,rower=rr) except IOError: diff --git a/rowers/views.py b/rowers/views.py index e80ddfb1..22b86856 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -3135,6 +3135,12 @@ def workout_add_otw_powerplot_view(request,id): fullpathimagename = 'static/plots/'+imagename u = request.user r = Rower.objects.get(user=u) + powerperc = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + + hrpwrdata = { 'hrmax':r.max, 'hrut2':r.ut2, @@ -3143,6 +3149,8 @@ def workout_add_otw_powerplot_view(request,id): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, + 'powerperc':powerperc, + 'powerzones':r.powerzones, } # make plot - asynchronous task @@ -3180,6 +3188,13 @@ def workout_add_piechart_view(request,id): fullpathimagename = 'static/plots/'+imagename u = request.user r = Rower.objects.get(user=u) + + powerperc = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + + hrpwrdata = { 'hrmax':r.max, 'hrut2':r.ut2, @@ -3188,6 +3203,8 @@ def workout_add_piechart_view(request,id): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, + 'powerperc':powerperc, + 'powerzones':r.powerzones, } # make plot - asynchronous task @@ -3225,6 +3242,13 @@ def workout_add_power_piechart_view(request,id): fullpathimagename = 'static/plots/'+imagename u = request.user r = Rower.objects.get(user=u) + + powerperc = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + + hrpwrdata = { 'hrmax':r.max, 'hrut2':r.ut2, @@ -3233,6 +3257,8 @@ def workout_add_power_piechart_view(request,id): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, + 'powerperc':powerperc, + 'powerzones':r.powerzones, } # make plot - asynchronous task @@ -3268,6 +3294,12 @@ def workout_add_timeplot_view(request,id): fullpathimagename = 'static/plots/'+imagename u = request.user r = Rower.objects.get(user=u) + powerperc = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + + hrpwrdata = { 'hrmax':r.max, 'hrut2':r.ut2, @@ -3276,6 +3308,8 @@ def workout_add_timeplot_view(request,id): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, + 'powerperc':powerperc, + 'powerzones':r.powerzones, } # make plot - asynchronous task @@ -3313,6 +3347,12 @@ def workout_add_distanceplot_view(request,id): fullpathimagename = 'static/plots/'+imagename u = request.user r = Rower.objects.get(user=u) + powerperc = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + + hrpwrdata = { 'hrmax':r.max, 'hrut2':r.ut2, @@ -3321,6 +3361,8 @@ def workout_add_distanceplot_view(request,id): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, + 'powerperc':powerperc, + 'powerzones':r.powerzones, } # make plot - asynchronous task @@ -3356,6 +3398,12 @@ def workout_add_distanceplot2_view(request,id): fullpathimagename = 'static/plots/'+imagename u = request.user r = Rower.objects.get(user=u) + powerperc = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + + hrpwrdata = { 'hrmax':r.max, 'hrut2':r.ut2, @@ -3363,6 +3411,9 @@ def workout_add_distanceplot2_view(request,id): 'hrat':r.at, 'hrtr':r.tr, 'hran':r.an, + 'ftp':r.ftp, + 'powerperc':powerperc, + 'powerzones':r.powerzones, } # make plot - asynchronous task @@ -3400,6 +3451,12 @@ def workout_add_timeplot2_view(request,id): fullpathimagename = 'static/plots/'+imagename u = request.user r = Rower.objects.get(user=u) + powerperc = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + + hrpwrdata = { 'hrmax':r.max, 'hrut2':r.ut2, @@ -3407,6 +3464,9 @@ def workout_add_timeplot2_view(request,id): 'hrat':r.at, 'hrtr':r.tr, 'hran':r.an, + 'ftp':r.ftp, + 'powerperc':powerperc, + 'powerzones':r.powerzones, } # make plot - asynchronous task @@ -3956,14 +4016,24 @@ def workout_upload_view(request,message=""): imagename = f1[:-4]+'.png' fullpathimagename = 'static/plots/'+imagename u = request.user - hrpwrdata = { - 'hrmax':r.max, - 'hrut2':r.ut2, - 'hrut1':r.ut1, - 'hrat':r.at, - 'hrtr':r.tr, - 'hran':r.an, - } + r = Rower.objects.get(user=request.user) + powerperc = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + + + hrpwrdata = { + 'hrmax':r.max, + 'hrut2':r.ut2, + 'hrut1':r.ut1, + 'hrat':r.at, + 'hrtr':r.tr, + 'hran':r.an, + 'ftp':r.ftp, + 'powerperc':powerperc, + 'powerzones':r.powerzones, + } # make plot - asynchronous task plotnrs = { From 9072d50f5a99be8c2d999b35d0ba17a82ae1ab14 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 25 Jan 2017 21:59:35 +0100 Subject: [PATCH 2/2] bug fix flex power zones --- rowers/tasks.py | 8 ++++++-- rowers/tests.py | 17 +++++++++++++---- rowers/utils.py | 10 ++++++++++ rowers/views.py | 27 +++++++++++++-------------- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/rowers/tasks.py b/rowers/tasks.py index 1f5db407..dea6dd32 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -4,6 +4,7 @@ import time import gc import gzip import shutil +import numpy as np import rowingdata from rowingdata import main as rmain @@ -17,6 +18,8 @@ from matplotlib import figure import stravalib +from utils import serialize_list,deserialize_list + from rowers.dataprepnodjango import update_strokedata from django.core.mail import send_mail, BadHeaderError,EmailMessage @@ -171,6 +174,7 @@ def handle_otwsetpower(f1,boattype,weightvalue, # This function generates all the static (PNG image) plots @app.task def handle_makeplot(f1,f2,t,hrdata,plotnr,imagename): + hrmax = hrdata['hrmax'] hrut2 = hrdata['hrut2'] hrut1 = hrdata['hrut1'] @@ -178,8 +182,8 @@ def handle_makeplot(f1,f2,t,hrdata,plotnr,imagename): hrtr = hrdata['hrtr'] hran = hrdata['hran'] ftp = hrdata['ftp'] - powerzones = hrdata['powerzones'] - powerperc = hrdata['powerperc'] + powerzones = deserialize_list(hrdata['powerzones']) + powerperc = np.array(deserialize_list(hrdata['powerperc'])).astype(int) rr = rowingdata.rower(hrmax=hrmax,hrut2=hrut2, hrut1=hrut1,hrat=hrat, diff --git a/rowers/tests.py b/rowers/tests.py index 9b2310f4..8fee138d 100644 --- a/rowers/tests.py +++ b/rowers/tests.py @@ -13,6 +13,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile from time import strftime,strptime,mktime,time,daylight import os from rowers.tasks import handle_makeplot +from rowers.utils import serialize_list,deserialize_list from rowers.c2stuff import C2NoTokenError from minimocktest import MockTestCase @@ -1062,9 +1063,15 @@ class PlotTests(TestCase): duration="0:55:00",distance=8000, csvfilename=filename) -# timestr = strftime("%Y%m%d-%H%M%S") -# imagename = f1+timestr+'.png' -# fullpathimagename = 'static/plots/'+imagename + # timestr = strftime("%Y%m%d-%H%M%S") + # imagename = f1+timestr+'.png' + # fullpathimagename = 'static/plots/'+imagename + powerperc = 100*np.array([r.pw_ut2, + r.pw_ut1, + r.pw_at, + r.pw_tr,r.pw_an])/r.ftp + + self.hrdata = { 'hrmax':r.max, 'hrut2':r.ut2, @@ -1073,7 +1080,9 @@ class PlotTests(TestCase): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, - } + 'powerperc':serialize_list(powerperc), + 'powerzones':serialize_list(r.powerzones), + } def test_ote_plots(self): diff --git a/rowers/utils.py b/rowers/utils.py index 1d40f487..11c54dbd 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -1,4 +1,14 @@ import math +import numpy as np + +def serialize_list(value,token=','): + assert(isinstance(value, list) or isinstance(value, tuple) or isinstance(value,np.ndarray)) + return token.join([unicode(s) for s in value]) + +def deserialize_list(value,token=','): + if isinstance(value, list): + return value + return value.split(token) def geo_distance(lat1,lon1,lat2,lon2): """ Approximate distance and bearing between two points diff --git a/rowers/views.py b/rowers/views.py index 22b86856..733b3927 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -192,7 +192,7 @@ def splitstdata(lijst): return [np.array(t),np.array(latlong)] -from utils import geo_distance +from utils import geo_distance,serialize_list,deserialize_list # Check if a user is a Pro member def promember(user): @@ -3257,8 +3257,8 @@ def workout_add_power_piechart_view(request,id): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, - 'powerperc':powerperc, - 'powerzones':r.powerzones, + 'powerperc':serialize_list(powerperc), + 'powerzones':serialize_list(r.powerzones), } # make plot - asynchronous task @@ -3308,8 +3308,8 @@ def workout_add_timeplot_view(request,id): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, - 'powerperc':powerperc, - 'powerzones':r.powerzones, + 'powerperc':serialize_list(powerperc), + 'powerzones':serialize_list(r.powerzones), } # make plot - asynchronous task @@ -3361,8 +3361,8 @@ def workout_add_distanceplot_view(request,id): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, - 'powerperc':powerperc, - 'powerzones':r.powerzones, + 'powerperc':serialize_list(powerperc), + 'powerzones':serialize_list(r.powerzones), } # make plot - asynchronous task @@ -3412,8 +3412,8 @@ def workout_add_distanceplot2_view(request,id): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, - 'powerperc':powerperc, - 'powerzones':r.powerzones, + 'powerperc':serialize_list(powerperc), + 'powerzones':serialize_list(r.powerzones), } # make plot - asynchronous task @@ -3465,8 +3465,8 @@ def workout_add_timeplot2_view(request,id): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, - 'powerperc':powerperc, - 'powerzones':r.powerzones, + 'powerperc':serialize_list(powerperc), + 'powerzones':serialize_list(r.powerzones), } # make plot - asynchronous task @@ -3916,7 +3916,6 @@ def workout_upload_view(request,message=""): r.pw_at, r.pw_tr,r.pw_an])/r.ftp - print powerperc rr = rrower(hrmax=r.max,hrut2=r.ut2, hrut1=r.ut1,hrat=r.at, hrtr=r.tr,hran=r.an,ftp=r.ftp, @@ -4031,8 +4030,8 @@ def workout_upload_view(request,message=""): 'hrtr':r.tr, 'hran':r.an, 'ftp':r.ftp, - 'powerperc':powerperc, - 'powerzones':r.powerzones, + 'powerperc':serialize_list(powerperc), + 'powerzones':serialize_list(r.powerzones), } # make plot - asynchronous task