Merge branch 'feature/flexcharts' into develop
This commit is contained in:
@@ -2203,7 +2203,6 @@ def getsmallrowdata_db(columns, ids=[], doclean=True,workstrokesonly=True,comput
|
|||||||
if compute and len(df):
|
if compute and len(df):
|
||||||
data = df.copy()
|
data = df.copy()
|
||||||
if doclean:
|
if doclean:
|
||||||
print('aap')
|
|
||||||
data = clean_df_stats(data, ignorehr=True,
|
data = clean_df_stats(data, ignorehr=True,
|
||||||
workstrokesonly=workstrokesonly)
|
workstrokesonly=workstrokesonly)
|
||||||
data.dropna(axis=1,how='all',inplace=True)
|
data.dropna(axis=1,how='all',inplace=True)
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ import rowers.dataprep as dataprep
|
|||||||
import rowers.metrics as metrics
|
import rowers.metrics as metrics
|
||||||
import rowers.c2stuff as c2stuff
|
import rowers.c2stuff as c2stuff
|
||||||
|
|
||||||
from rowers.metrics import axes,axlabels,yaxminima,yaxmaxima
|
from rowers.metrics import axes,axlabels,yaxminima,yaxmaxima,get_yaxminima,get_yaxmaxima
|
||||||
|
|
||||||
from rowers.utils import lbstoN
|
from rowers.utils import lbstoN
|
||||||
from rowers.datautils import p0
|
from rowers.datautils import p0
|
||||||
@@ -4413,12 +4413,13 @@ def interactive_cum_flex_chart2(theworkouts,promember=0,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def interactive_flex_chart2(id=0,promember=0,
|
def interactive_flex_chart2(id,r,promember=0,
|
||||||
xparam='time',
|
xparam='time',
|
||||||
yparam1='pace',
|
yparam1='pace',
|
||||||
yparam2='hr',
|
yparam2='hr',
|
||||||
plottype='line',
|
plottype='line',
|
||||||
workstrokesonly=False):
|
workstrokesonly=False,
|
||||||
|
mode='rower'):
|
||||||
|
|
||||||
watermarkurl = "/static/img/logo7.png"
|
watermarkurl = "/static/img/logo7.png"
|
||||||
watermarksource = ColumnDataSource(dict(
|
watermarksource = ColumnDataSource(dict(
|
||||||
@@ -4535,8 +4536,8 @@ def interactive_flex_chart2(id=0,promember=0,
|
|||||||
xaxmin = rowdata['x1'].min()
|
xaxmin = rowdata['x1'].min()
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
xaxmax = yaxmaxima[xparam]
|
xaxmax = get_yaxmaxima(r,xparam,mode)
|
||||||
xaxmin = yaxminima[xparam]
|
xaxmin = get_yaxminima(r,xparam,mode)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
xaxmax = rowdata['x1'].max()
|
xaxmax = rowdata['x1'].max()
|
||||||
xaxmin = rowdata['x1'].min()
|
xaxmin = rowdata['x1'].min()
|
||||||
@@ -4733,8 +4734,8 @@ def interactive_flex_chart2(id=0,promember=0,
|
|||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
yrange1 = Range1d(start=yaxminima[yparam1],
|
yrange1 = Range1d(start=get_yaxminima(r,yparam1,mode),
|
||||||
end=yaxmaxima[yparam1])
|
end=get_yaxmaxima(r,yparam1,mode))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
yrange1 = Range1d(start=rowdata[yparam1].min(),
|
yrange1 = Range1d(start=rowdata[yparam1].min(),
|
||||||
end=rowdata[yparam1].max())
|
end=rowdata[yparam1].max())
|
||||||
@@ -4743,8 +4744,8 @@ def interactive_flex_chart2(id=0,promember=0,
|
|||||||
|
|
||||||
if (xparam != 'time') and (xparam != 'distance') and (xparam != 'cumdist'):
|
if (xparam != 'time') and (xparam != 'distance') and (xparam != 'cumdist'):
|
||||||
try:
|
try:
|
||||||
xrange1 = Range1d(start=yaxminima[xparam],
|
xrange1 = Range1d(start=get_yaxminima(r,xparam,mode),
|
||||||
end=yaxmaxima[xparam])
|
end=get_yaxmaxima(r,xparam,mode))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
xrange1 = Range1d(start=rowdata[xparam].min(),
|
xrange1 = Range1d(start=rowdata[xparam].min(),
|
||||||
end=rowdata[xparam].max())
|
end=rowdata[xparam].max())
|
||||||
@@ -4773,8 +4774,8 @@ def interactive_flex_chart2(id=0,promember=0,
|
|||||||
|
|
||||||
if yparam2 != 'None':
|
if yparam2 != 'None':
|
||||||
try:
|
try:
|
||||||
yrange2 = Range1d(start=yaxminima[yparam2],
|
yrange2 = Range1d(start=get_yaxminima(r,yparam2,mode),
|
||||||
end=yaxmaxima[yparam2])
|
end=get_yaxmaxima(r,yparam2,mode))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
yrange2 = Range1d(start=rowdata[yparam2].min(),
|
yrange2 = Range1d(start=rowdata[yparam2].min(),
|
||||||
end=rowdata[yparam2].max())
|
end=rowdata[yparam2].max())
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ from scipy import optimize
|
|||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
from math import log10
|
from math import log10
|
||||||
|
from rowers.mytypes import otwtypes,otetypes
|
||||||
|
|
||||||
nometrics = [
|
nometrics = [
|
||||||
'originalvelo',
|
'originalvelo',
|
||||||
@@ -361,6 +362,26 @@ yaxminima = {ax[0]:ax[2] for ax in axes}
|
|||||||
|
|
||||||
yaxmaxima = {ax[0]:ax[3] for ax in axes}
|
yaxmaxima = {ax[0]:ax[3] for ax in axes}
|
||||||
|
|
||||||
|
def get_yaxminima(r,metric,mode):
|
||||||
|
if metric == 'pace':
|
||||||
|
if mode in otetypes:
|
||||||
|
return r.slowpaceerg
|
||||||
|
else:
|
||||||
|
return r.slowpaceotw
|
||||||
|
|
||||||
|
return yaxminima[metric]
|
||||||
|
|
||||||
|
def get_yaxmaxima(r,metric,mode):
|
||||||
|
if metric == 'pace':
|
||||||
|
if mode in otetypes:
|
||||||
|
return r.fastpaceerg
|
||||||
|
else:
|
||||||
|
return r.fastpaceotw
|
||||||
|
|
||||||
|
return yaxmaxima[metric]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
defaultfavoritecharts = (
|
defaultfavoritecharts = (
|
||||||
{
|
{
|
||||||
'yparam1':'pace',
|
'yparam1':'pace',
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ class InteractiveChartTest(TestCase):
|
|||||||
gdproptindate=timezone.now()
|
gdproptindate=timezone.now()
|
||||||
)
|
)
|
||||||
self.nu = datetime.datetime.now()
|
self.nu = datetime.datetime.now()
|
||||||
|
self.r = r
|
||||||
|
|
||||||
self.filename = 'rowers/tests/testdata/testdata.csv'
|
self.filename = 'rowers/tests/testdata/testdata.csv'
|
||||||
self.wotw = Workout.objects.create(name='testworkout',
|
self.wotw = Workout.objects.create(name='testworkout',
|
||||||
@@ -75,14 +76,14 @@ class InteractiveChartTest(TestCase):
|
|||||||
@patch('rowers.dataprep.create_engine')
|
@patch('rowers.dataprep.create_engine')
|
||||||
@patch('rowers.dataprep.read_df_sql')
|
@patch('rowers.dataprep.read_df_sql')
|
||||||
def test_interactive_chart5(self, mocked_sqlalchemy,mocked_read_df_sql):
|
def test_interactive_chart5(self, mocked_sqlalchemy,mocked_read_df_sql):
|
||||||
res = iplots.interactive_flex_chart2(self.wote.id,promember=0,
|
res = iplots.interactive_flex_chart2(self.wote.id,self.r,promember=0,
|
||||||
xparam='time',
|
xparam='time',
|
||||||
yparam1='pace',yparam2='hr')
|
yparam1='pace',yparam2='hr')
|
||||||
|
|
||||||
@patch('rowers.dataprep.create_engine')
|
@patch('rowers.dataprep.create_engine')
|
||||||
@patch('rowers.dataprep.read_df_sql')
|
@patch('rowers.dataprep.read_df_sql')
|
||||||
def test_interactive_chart6(self, mocked_sqlalchemy,mocked_read_df_sql):
|
def test_interactive_chart6(self, mocked_sqlalchemy,mocked_read_df_sql):
|
||||||
res = iplots.interactive_flex_chart2(self.wote.id,
|
res = iplots.interactive_flex_chart2(self.wote.id,self.r,
|
||||||
promember=0,xparam='distance',
|
promember=0,xparam='distance',
|
||||||
yparam1='pace',yparam2='hr')
|
yparam1='pace',yparam2='hr')
|
||||||
|
|
||||||
@@ -91,49 +92,50 @@ class InteractiveChartTest(TestCase):
|
|||||||
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
||||||
def test_interactive_chart7(self, mocked_sqlalchemy,mocked_read_df_sql,
|
def test_interactive_chart7(self, mocked_sqlalchemy,mocked_read_df_sql,
|
||||||
mocked_getsmallrowdata_db):
|
mocked_getsmallrowdata_db):
|
||||||
res = iplots.interactive_flex_chart2(self.wote.id,promember=0,
|
res = iplots.interactive_flex_chart2(self.wote.id,self.r,promember=0,
|
||||||
xparam='time',
|
xparam='time',
|
||||||
yparam1='pace',yparam2='spm')
|
yparam1='pace',yparam2='spm',mode='water')
|
||||||
|
|
||||||
@patch('rowers.dataprep.create_engine')
|
@patch('rowers.dataprep.create_engine')
|
||||||
@patch('rowers.dataprep.read_df_sql')
|
@patch('rowers.dataprep.read_df_sql')
|
||||||
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
||||||
def test_interactive_chart8(self, mocked_sqlalchemy,mocked_read_df_sql,
|
def test_interactive_chart8(self, mocked_sqlalchemy,mocked_read_df_sql,
|
||||||
mocked_getsmallrowdata_db):
|
mocked_getsmallrowdata_db):
|
||||||
res = iplots.interactive_flex_chart2(self.wote.id,
|
res = iplots.interactive_flex_chart2(self.wote.id,self.r,
|
||||||
promember=0,xparam='distance',
|
promember=0,xparam='distance',
|
||||||
yparam1='pace',yparam2='spm')
|
yparam1='pace',yparam2='spm',mode='water')
|
||||||
|
|
||||||
@patch('rowers.dataprep.create_engine')
|
@patch('rowers.dataprep.create_engine')
|
||||||
@patch('rowers.dataprep.read_df_sql')
|
@patch('rowers.dataprep.read_df_sql')
|
||||||
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
||||||
def test_interactive_chart9(self, mocked_sqlalchemy,mocked_read_df_sql,
|
def test_interactive_chart9(self, mocked_sqlalchemy,mocked_read_df_sql,
|
||||||
mocked_getsmallrowdata_db):
|
mocked_getsmallrowdata_db):
|
||||||
res = iplots.interactive_flex_chart2(self.wote.id,
|
res = iplots.interactive_flex_chart2(self.wote.id,self.r,
|
||||||
promember=1,xparam='time',
|
promember=1,xparam='time',
|
||||||
yparam1='pace',yparam2='hr')
|
yparam1='pace',yparam2='hr',mode='water')
|
||||||
@patch('rowers.dataprep.create_engine')
|
@patch('rowers.dataprep.create_engine')
|
||||||
@patch('rowers.dataprep.read_df_sql')
|
@patch('rowers.dataprep.read_df_sql')
|
||||||
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
||||||
def test_interactive_chart10(self, mocked_sqlalchemy,mocked_read_df_sql,
|
def test_interactive_chart10(self, mocked_sqlalchemy,mocked_read_df_sql,
|
||||||
mocked_getsmallrowdata_db):
|
mocked_getsmallrowdata_db):
|
||||||
res = iplots.interactive_flex_chart2(self.wote.id,
|
res = iplots.interactive_flex_chart2(self.wote.id,self.r,
|
||||||
promember=1,xparam='distance',
|
promember=1,xparam='distance',
|
||||||
yparam1='pace',yparam2='hr')
|
yparam1='pace',yparam2='hr',mode='water')
|
||||||
@patch('rowers.dataprep.create_engine')
|
@patch('rowers.dataprep.create_engine')
|
||||||
@patch('rowers.dataprep.read_df_sql')
|
@patch('rowers.dataprep.read_df_sql')
|
||||||
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
||||||
def test_interactive_chart11(self, mocked_sqlalchemy,mocked_read_df_sql,
|
def test_interactive_chart11(self, mocked_sqlalchemy,mocked_read_df_sql,
|
||||||
mocked_getsmallrowdata_db):
|
mocked_getsmallrowdata_db):
|
||||||
res = iplots.interactive_flex_chart2(self.wote.id,
|
res = iplots.interactive_flex_chart2(self.wote.id,self.r,
|
||||||
promember=1,xparam='time',
|
promember=1,xparam='time',
|
||||||
yparam1='pace',yparam2='spm')
|
yparam1='pace',yparam2='spm',mode='water')
|
||||||
|
|
||||||
@patch('rowers.dataprep.create_engine')
|
@patch('rowers.dataprep.create_engine')
|
||||||
@patch('rowers.dataprep.read_df_sql')
|
@patch('rowers.dataprep.read_df_sql')
|
||||||
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_db)
|
||||||
def test_interactive_chart12(self, mocked_sqlalchemy,mocked_read_df_sql,
|
def test_interactive_chart12(self, mocked_sqlalchemy,mocked_read_df_sql,
|
||||||
mocked_getsmallrowdata_db):
|
mocked_getsmallrowdata_db):
|
||||||
res = iplots.interactive_flex_chart2(self.wote.id,promember=1,
|
res = iplots.interactive_flex_chart2(self.wote.id,self.r,
|
||||||
|
promember=1,
|
||||||
xparam='distance',
|
xparam='distance',
|
||||||
yparam1='pace',yparam2='spm')
|
yparam1='pace',yparam2='spm',mode='water')
|
||||||
|
|||||||
@@ -3832,35 +3832,15 @@ def workout_flexchart3_view(request,*args,**kwargs):
|
|||||||
# xparam = xparam.replace('_slsh_','/')
|
# xparam = xparam.replace('_slsh_','/')
|
||||||
|
|
||||||
# create interactive plot
|
# create interactive plot
|
||||||
try:
|
(
|
||||||
(
|
script, div, js_resources, css_resources, workstrokesonly
|
||||||
script,
|
) = interactive_flex_chart2(
|
||||||
div,
|
encoder.decode_hex(id),request.user.rower,
|
||||||
js_resources,
|
xparam=xparam,yparam1=yparam1,
|
||||||
css_resources,
|
|
||||||
workstrokesonly
|
|
||||||
) = interactive_flex_chart2(
|
|
||||||
encoder.decode_hex(id),xparam=xparam,yparam1=yparam1,
|
|
||||||
yparam2=yparam2,
|
yparam2=yparam2,
|
||||||
promember=promember,plottype=plottype,
|
promember=promember,plottype=plottype,
|
||||||
workstrokesonly=workstrokesonly
|
workstrokesonly=workstrokesonly,mode=row.workouttype
|
||||||
)
|
)
|
||||||
except ValueError:
|
|
||||||
(
|
|
||||||
script,
|
|
||||||
div,
|
|
||||||
js_resources,
|
|
||||||
css_resources,
|
|
||||||
workstrokesonly
|
|
||||||
) = interactive_flex_chart2(
|
|
||||||
encoder.decode_hex(id),xparam=xparam,yparam1=yparam1,
|
|
||||||
yparam2=yparam2,
|
|
||||||
promember=promember,plottype=plottype,
|
|
||||||
workstrokesonly=workstrokesonly
|
|
||||||
)
|
|
||||||
js_resources = ""
|
|
||||||
css_resources = ""
|
|
||||||
|
|
||||||
|
|
||||||
axchoicesbasic = {ax[0]:ax[1] for ax in axes if ax[4]=='basic'}
|
axchoicesbasic = {ax[0]:ax[1] for ax in axes if ax[4]=='basic'}
|
||||||
axchoicespro = {ax[0]:ax[1] for ax in axes if ax[4]=='pro'}
|
axchoicespro = {ax[0]:ax[1] for ax in axes if ax[4]=='pro'}
|
||||||
|
|||||||
Reference in New Issue
Block a user