fixing some tests
This commit is contained in:
@@ -1731,35 +1731,35 @@ def interactive_flexchart_stacked(id, r, xparam='time',
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
tseconds = rowdata['time']
|
tseconds = rowdata['time']
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
return '', 'No time data - cannot make flex plot'
|
return '', 'No time data - cannot make flex plot'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.with_columns(x1=pl.col(xparam))
|
rowdata = rowdata.with_columns(x1=pl.col(xparam))
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
rowdata = rowdata.with_columns(x1=pl.lit(0))
|
rowdata = rowdata.with_columns(x1=pl.lit(0))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.with_columns(y1=pl.col(yparam1))
|
rowdata = rowdata.with_columns(y1=pl.col(yparam1))
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
rowdata = rowdata.with_columns(y1=pl.col("time"))
|
rowdata = rowdata.with_columns(y1=pl.col("time"))
|
||||||
rowdata = rowdata.with_columns((pl.col("y1")).alias(yparam1))
|
rowdata = rowdata.with_columns((pl.col("y1")).alias(yparam1))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.with_columns(y2=pl.col(yparam2))
|
rowdata = rowdata.with_columns(y2=pl.col(yparam2))
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
rowdata = rowdata.with_columns(y2=pl.col("time"))
|
rowdata = rowdata.with_columns(y2=pl.col("time"))
|
||||||
rowdata = rowdata.with_columns((pl.col("y2")).alias(yparam2))
|
rowdata = rowdata.with_columns((pl.col("y2")).alias(yparam2))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.with_columns(y1=pl.col(yparam3))
|
rowdata = rowdata.with_columns(y1=pl.col(yparam3))
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
rowdata = rowdata.with_columns(y3=pl.col("time"))
|
rowdata = rowdata.with_columns(y3=pl.col("time"))
|
||||||
rowdata = rowdata.with_columns((pl.col("y3")).alias(yparam3))
|
rowdata = rowdata.with_columns((pl.col("y3")).alias(yparam3))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.with_columns(y4=pl.col(yparam1))
|
rowdata = rowdata.with_columns(y4=pl.col(yparam1))
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
rowdata = rowdata.with_columns(y4=pl.col("time"))
|
rowdata = rowdata.with_columns(y4=pl.col("time"))
|
||||||
rowdata = rowdata.with_columns((pl.col("y4")).alias(yparam4))
|
rowdata = rowdata.with_columns((pl.col("y4")).alias(yparam4))
|
||||||
|
|
||||||
@@ -1800,8 +1800,8 @@ def interactive_flex_chart2(id, r, promember=0,
|
|||||||
|
|
||||||
columns = [name for name, d in metrics.rowingmetrics]
|
columns = [name for name, d in metrics.rowingmetrics]
|
||||||
columns_basic = [name for name, d in metrics.rowingmetrics if d['group'] == 'basic']
|
columns_basic = [name for name, d in metrics.rowingmetrics if d['group'] == 'basic']
|
||||||
columns = columns + ['spm', 'driveenergy', 'distance']
|
columns = columns + ['spm', 'driveenergy', 'distance','workoutstate']
|
||||||
columns_basic = columns_basic + ['spm', 'driveenergy', 'distance']
|
columns_basic = columns_basic + ['spm', 'driveenergy', 'distance','workoutstate']
|
||||||
|
|
||||||
datadf = pd.DataFrame()
|
datadf = pd.DataFrame()
|
||||||
if promember:
|
if promember:
|
||||||
@@ -1838,24 +1838,24 @@ def interactive_flex_chart2(id, r, promember=0,
|
|||||||
workstrokesonly = False
|
workstrokesonly = False
|
||||||
try:
|
try:
|
||||||
_ = rowdata[yparam2]
|
_ = rowdata[yparam2]
|
||||||
except (KeyError, TypeError): # pragma: no cover
|
except (KeyError, TypeError, ColumnNotFoundError): # pragma: no cover
|
||||||
yparam2 = 'None'
|
yparam2 = 'None'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
_ = rowdata[yparam1]
|
_ = rowdata[yparam1]
|
||||||
except (TypeError, KeyError): # pragma: no cover
|
except (TypeError, KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
yparam1 = 'None'
|
yparam1 = 'None'
|
||||||
|
|
||||||
# test if we have drive energy
|
# test if we have drive energy
|
||||||
try:
|
try:
|
||||||
_ = rowdata['driveenergy'].mean()
|
_ = rowdata['driveenergy'].mean()
|
||||||
except (KeyError, TypeError):
|
except (KeyError, TypeError, ColumnNotFoundError):
|
||||||
rowdata = rowdata.with_columns(driveenergy=pl.lit(500))
|
rowdata = rowdata.with_columns(driveenergy=pl.lit(500))
|
||||||
|
|
||||||
# test if we have power
|
# test if we have power
|
||||||
try:
|
try:
|
||||||
_ = rowdata['power'].mean()
|
_ = rowdata['power'].mean()
|
||||||
except (KeyError, TypeError):
|
except (KeyError, TypeError, ColumnNotFoundError):
|
||||||
rowdata = rowdata.with_columns(power=pl.lit(50))
|
rowdata = rowdata.with_columns(power=pl.lit(50))
|
||||||
|
|
||||||
# replace nans
|
# replace nans
|
||||||
@@ -1870,22 +1870,22 @@ def interactive_flex_chart2(id, r, promember=0,
|
|||||||
if workstrokesonly: # pragma: no cover
|
if workstrokesonly: # pragma: no cover
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.filter(~pl.col("workoutstate").is_in(workoutstatesrest))
|
rowdata = rowdata.filter(~pl.col("workoutstate").is_in(workoutstatesrest))
|
||||||
except KeyError:
|
except (KeyError, ColumnNotFoundError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
tseconds = rowdata['time']
|
tseconds = rowdata['time']
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
return '', 'No time data - cannot make flex plot', workstrokesonly
|
return '', 'No time data - cannot make flex plot', workstrokesonly
|
||||||
|
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.with_columns(x1 = pl.col(xparam))
|
rowdata = rowdata.with_columns(x1 = pl.col(xparam))
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
rowdata = rowdata.with_columns(x1 = pl.col("time"))
|
rowdata = rowdata.with_columns(x1 = pl.col("time"))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.with_columns(y1 = pl.col(yparam1))
|
rowdata = rowdata.with_columns(y1 = pl.col(yparam1))
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
rowdata = rowdata.with_columns(y1 = pl.col("time"))
|
rowdata = rowdata.with_columns(y1 = pl.col("time"))
|
||||||
rowdata = rowdata.with_columns(yparam1 = pl.col("y1"))
|
rowdata = rowdata.with_columns(yparam1 = pl.col("y1"))
|
||||||
|
|
||||||
@@ -1893,7 +1893,7 @@ def interactive_flex_chart2(id, r, promember=0,
|
|||||||
if yparam2 != 'None':
|
if yparam2 != 'None':
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.with_columns(y2 = pl.col(yparam2))
|
rowdata = rowdata.with_columns(y2 = pl.col(yparam2))
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
rowdata = rowdata.with_columns(y2 = pl.col("time"))
|
rowdata = rowdata.with_columns(y2 = pl.col("time"))
|
||||||
rowdata = rowdata.with_columns(yparam2 = pl.col("y2"))
|
rowdata = rowdata.with_columns(yparam2 = pl.col("y2"))
|
||||||
|
|
||||||
@@ -1916,18 +1916,18 @@ def interactive_flex_chart2(id, r, promember=0,
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.with_columns((pl.lit(axlabels[xparam])).alias("xname"))
|
rowdata = rowdata.with_columns((pl.lit(axlabels[xparam])).alias("xname"))
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
rowdata = rowdata.with_columns((pl.lit(xparam)).alias("xname"))
|
rowdata = rowdata.with_columns((pl.lit(xparam)).alias("xname"))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.with_columns((pl.lit(axlabels[yparam1])).alias("yname1"))
|
rowdata = rowdata.with_columns((pl.lit(axlabels[yparam1])).alias("yname1"))
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
rowdata = rowdata.with_columns((pl.lit(yparam1)).alias("yname1"))
|
rowdata = rowdata.with_columns((pl.lit(yparam1)).alias("yname1"))
|
||||||
|
|
||||||
if yparam2 != 'None':
|
if yparam2 != 'None':
|
||||||
try:
|
try:
|
||||||
rowdata = rowdata.with_columns((pl.lit(axlabels[yparam2])).alias("yname2"))
|
rowdata = rowdata.with_columns((pl.lit(axlabels[yparam2])).alias("yname2"))
|
||||||
except KeyError: # pragma: no cover
|
except (KeyError, ColumnNotFoundError): # pragma: no cover
|
||||||
rowdata = rowdata.with_columns((pl.lit(yparam2)).alias("yname2"))
|
rowdata = rowdata.with_columns((pl.lit(yparam2)).alias("yname2"))
|
||||||
|
|
||||||
else: # pragma: no cover
|
else: # pragma: no cover
|
||||||
@@ -2185,210 +2185,6 @@ def interactive_multiple_compare_chart(ids, xparam, yparam, plottype='line',
|
|||||||
script, div = get_chart("/compare", chart_data)
|
script, div = get_chart("/compare", chart_data)
|
||||||
return script, div, message, errormessage
|
return script, div, message, errormessage
|
||||||
|
|
||||||
if xparam != 'distance' and xparam != 'time' and xparam != 'cumdist': # pragma: no cover
|
|
||||||
xaxmax = yaxmaxima[xparam]
|
|
||||||
xaxmin = yaxminima[xparam]
|
|
||||||
elif xparam == 'time' and not startenddict:
|
|
||||||
xaxmax = tseconds.max()
|
|
||||||
xaxmin = tseconds.min()
|
|
||||||
elif xparam == 'time' and startenddict: # pragma: no cover
|
|
||||||
deltas = [pair[1]-pair[0] for key, pair in startenddict.items()]
|
|
||||||
xaxmin = 0
|
|
||||||
xaxmax = pd.Series(deltas).max()*1000.
|
|
||||||
if xaxmax == 0:
|
|
||||||
xaxmax = tseconds.max()
|
|
||||||
else:
|
|
||||||
xaxmax = datadf['distance'].max()
|
|
||||||
xaxmin = datadf['distance'].min()
|
|
||||||
|
|
||||||
if yparam == 'distance': # pragma: no cover
|
|
||||||
yaxmin = datadf['distance'].min()
|
|
||||||
yaxmax = datadf['distance'].max()
|
|
||||||
elif yparam == 'cumdist': # pragma: no cover
|
|
||||||
yaxmin = datadf['cumdist'].min()
|
|
||||||
yaxmax = datadf['cumdist'].max()
|
|
||||||
else:
|
|
||||||
yaxmin = yaxminima[yparam]
|
|
||||||
yaxmax = yaxmaxima[yparam]
|
|
||||||
|
|
||||||
x_axis_type = 'linear'
|
|
||||||
y_axis_type = 'linear'
|
|
||||||
|
|
||||||
# Add hover to this comma-separated string and see what changes
|
|
||||||
if (promember == 1):
|
|
||||||
TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,crosshair'
|
|
||||||
else: # pragma: no cover
|
|
||||||
TOOLS = 'pan,box_zoom,wheel_zoom,reset,tap,crosshair'
|
|
||||||
|
|
||||||
if yparam == 'pace':
|
|
||||||
y_axis_type = 'datetime'
|
|
||||||
yaxmax = 90.*1e3
|
|
||||||
yaxmin = 150.*1e3
|
|
||||||
|
|
||||||
if xparam == 'time':
|
|
||||||
x_axis_type = 'datetime'
|
|
||||||
|
|
||||||
plot = figure(x_axis_type=x_axis_type, y_axis_type=y_axis_type,
|
|
||||||
tools=TOOLS,
|
|
||||||
toolbar_location="above",
|
|
||||||
width=920, height=500,
|
|
||||||
toolbar_sticky=False)
|
|
||||||
|
|
||||||
# add watermark
|
|
||||||
watermarkurl = "/static/img/logo7.png"
|
|
||||||
watermarkrange = Range1d(start=0, end=1)
|
|
||||||
watermarkalpha = 0.6
|
|
||||||
watermarkw = 184
|
|
||||||
watermarkh = 35
|
|
||||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
|
||||||
plot.extra_x_ranges = {"watermark": watermarkrange}
|
|
||||||
#plot.sizing_mode = 'stretch_both'
|
|
||||||
|
|
||||||
plot.image_url([watermarkurl], 0.05, 0.9,
|
|
||||||
watermarkw, watermarkh,
|
|
||||||
global_alpha=watermarkalpha,
|
|
||||||
w_units='screen',
|
|
||||||
h_units='screen',
|
|
||||||
anchor='top_left',
|
|
||||||
dilate=True,
|
|
||||||
x_range_name="watermark",
|
|
||||||
y_range_name="watermark",
|
|
||||||
)
|
|
||||||
|
|
||||||
colors = itertools.cycle(palette)
|
|
||||||
|
|
||||||
cntr = 0
|
|
||||||
l1 = []
|
|
||||||
|
|
||||||
try:
|
|
||||||
items = itertools.izip(ids, colors)
|
|
||||||
except AttributeError:
|
|
||||||
items = zip(ids, colors)
|
|
||||||
|
|
||||||
for id, color in items:
|
|
||||||
group = datadf[datadf['workoutid'] == int(id)].copy()
|
|
||||||
try:
|
|
||||||
startsecond, endsecond = startenddict[id]
|
|
||||||
except KeyError:
|
|
||||||
startsecond = 0
|
|
||||||
endsecond = 0
|
|
||||||
|
|
||||||
group.sort_values(by='time', ascending=True, inplace=True)
|
|
||||||
|
|
||||||
if endsecond > 0:
|
|
||||||
group['time'] = group['time'] - 1.e3*startsecond
|
|
||||||
mask = group['time'] < 0
|
|
||||||
group.mask(mask, inplace=True)
|
|
||||||
mask = group['time'] > 1.e3*(endsecond-startsecond)
|
|
||||||
group.mask(mask, inplace=True)
|
|
||||||
|
|
||||||
if xparam == 'cumdist':
|
|
||||||
group['cumdist'] = group['cumdist'] - group['cumdist'].min()
|
|
||||||
res = make_cumvalues(group[xparam])
|
|
||||||
group[xparam] = res[0]
|
|
||||||
elif xparam == 'distance':
|
|
||||||
group['distance'] = group['distance'] - group['distance'].min()
|
|
||||||
|
|
||||||
try:
|
|
||||||
group['x'] = group[xparam]
|
|
||||||
except KeyError: # pragma: no cover
|
|
||||||
group['x'] = group['time']
|
|
||||||
errormessage = xparam+' has no values. Plot invalid'
|
|
||||||
try:
|
|
||||||
group['y'] = group[yparam]
|
|
||||||
except KeyError:
|
|
||||||
group['y'] = 0.0*group['x']
|
|
||||||
|
|
||||||
ymean = group['y'].mean()
|
|
||||||
f = group['time'].diff().mean()
|
|
||||||
if f != 0 and not np.isnan(f):
|
|
||||||
windowsize = 2 * (int(20000./(f))) + 1
|
|
||||||
else:
|
|
||||||
windowsize = 1
|
|
||||||
|
|
||||||
if windowsize > 3 and windowsize < len(group['y']):
|
|
||||||
try:
|
|
||||||
group['y'] = savgol_filter(group['y'], windowsize, 3)
|
|
||||||
except ValueError: # pragma: no cover
|
|
||||||
pass
|
|
||||||
|
|
||||||
ylabel = Label(x=100, y=60+nrworkouts*20-20*cntr,
|
|
||||||
x_units='screen', y_units='screen',
|
|
||||||
text=axlabels[yparam] +
|
|
||||||
": {ymean:6.2f}".format(ymean=ymean),
|
|
||||||
background_fill_alpha=.7,
|
|
||||||
background_fill_color='white',
|
|
||||||
text_color=color,
|
|
||||||
)
|
|
||||||
if yparam != 'time' and yparam != 'pace':
|
|
||||||
plot.add_layout(ylabel)
|
|
||||||
|
|
||||||
source = ColumnDataSource(
|
|
||||||
group
|
|
||||||
)
|
|
||||||
|
|
||||||
TIPS = OrderedDict([
|
|
||||||
('time', '@ftime'),
|
|
||||||
('pace', '@fpace'),
|
|
||||||
('hr', '@hr'),
|
|
||||||
('spm', '@spm{1.1}'),
|
|
||||||
('distance', '@distance{5}'),
|
|
||||||
])
|
|
||||||
|
|
||||||
hover = plot.select(type=HoverTool)
|
|
||||||
hover.tooltips = TIPS
|
|
||||||
|
|
||||||
if labeldict:
|
|
||||||
try:
|
|
||||||
legend_label = labeldict[id]
|
|
||||||
except KeyError: # pragma: no cover
|
|
||||||
legend_label = str(id)
|
|
||||||
else: # pragma: no cover
|
|
||||||
legend_label = str(id)
|
|
||||||
|
|
||||||
if plottype == 'line':
|
|
||||||
l1.append(plot.line('x', 'y', source=source, color=color,
|
|
||||||
legend_label=legend_label, line_width=2))
|
|
||||||
else:
|
|
||||||
l1.append(plot.scatter('x', 'y', source=source, color=color, legend_label=legend_label,
|
|
||||||
fill_alpha=0.4, line_color=None))
|
|
||||||
|
|
||||||
plot.add_tools(HoverTool(renderers=[l1[cntr]], tooltips=TIPS))
|
|
||||||
cntr += 1
|
|
||||||
|
|
||||||
plot.legend.location = 'top_right'
|
|
||||||
plot.xaxis.axis_label = axlabels[xparam]
|
|
||||||
plot.yaxis.axis_label = axlabels[yparam]
|
|
||||||
|
|
||||||
if (xparam != 'time') and (xparam != 'distance') and (xparam != 'cumdist'): # pragma: no cover
|
|
||||||
xrange1 = Range1d(start=yaxminima[xparam], end=yaxmaxima[xparam])
|
|
||||||
plot.x_range = xrange1
|
|
||||||
|
|
||||||
yrange1 = Range1d(start=yaxmin, end=yaxmax)
|
|
||||||
plot.y_range = yrange1
|
|
||||||
|
|
||||||
if xparam == 'time':
|
|
||||||
xrange1 = Range1d(start=xaxmin, end=xaxmax)
|
|
||||||
plot.x_range = xrange1
|
|
||||||
plot.xaxis[0].formatter = DatetimeTickFormatter(
|
|
||||||
hours=["%H"],
|
|
||||||
minutes=["%M"],
|
|
||||||
seconds=["%S"],
|
|
||||||
days=["0"],
|
|
||||||
months=[""],
|
|
||||||
years=[""]
|
|
||||||
)
|
|
||||||
|
|
||||||
if yparam == 'pace':
|
|
||||||
plot.yaxis[0].formatter = DatetimeTickFormatter(
|
|
||||||
seconds=["%S"],
|
|
||||||
minutes=["%M"]
|
|
||||||
)
|
|
||||||
|
|
||||||
script, div = components(plot)
|
|
||||||
|
|
||||||
return [script, div, message, errormessage]
|
|
||||||
|
|
||||||
|
|
||||||
def get_zones_report(rower, startdate, enddate, trainingzones='hr', date_agg='week',
|
def get_zones_report(rower, startdate, enddate, trainingzones='hr', date_agg='week',
|
||||||
yaxis='time'):
|
yaxis='time'):
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ from nose.tools import assert_true
|
|||||||
from mock import Mock, patch
|
from mock import Mock, patch
|
||||||
#from minimocktest import MockTestCase
|
#from minimocktest import MockTestCase
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
import polars as pl
|
||||||
|
|
||||||
import arrow
|
import arrow
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
@@ -335,6 +336,11 @@ def mocked_getsmallrowdata_db(*args, **kwargs):
|
|||||||
|
|
||||||
return df
|
return df
|
||||||
|
|
||||||
|
def mocked_getsmallrowdata_pl(*args, **kwargs):
|
||||||
|
df = pl.read_csv('rowers/tests/testdata/colsfromdb.csv')
|
||||||
|
|
||||||
|
return df
|
||||||
|
|
||||||
def mocked_getsmallrowdata_db_updatecp(*args, **kwargs): # pragma: no cover
|
def mocked_getsmallrowdata_db_updatecp(*args, **kwargs): # pragma: no cover
|
||||||
df = pd.read_csv('rowers/tests/testdata/colsfromdb.csv')
|
df = pd.read_csv('rowers/tests/testdata/colsfromdb.csv')
|
||||||
|
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ from nose.tools import assert_true
|
|||||||
from mock import Mock, patch
|
from mock import Mock, patch
|
||||||
#from minimocktest import MockTestCase
|
#from minimocktest import MockTestCase
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
import polars as pl
|
||||||
import rowers.c2stuff as c2stuff
|
import rowers.c2stuff as c2stuff
|
||||||
|
|
||||||
import rowers.rojabo_stuff as rojabo_stuff
|
import rowers.rojabo_stuff as rojabo_stuff
|
||||||
|
|||||||
@@ -735,9 +735,9 @@ class InteractivePlotTests(TestCase):
|
|||||||
self.assertFalse(len(div)==0)
|
self.assertFalse(len(div)==0)
|
||||||
|
|
||||||
@patch('rowers.dataprep.create_engine')
|
@patch('rowers.dataprep.create_engine')
|
||||||
@patch('rowers.dataprep.getsmallrowdata_db', side_effect=mocked_getsmallrowdata_db)
|
@patch('rowers.dataprep.getsmallrowdata_pl', side_effect=mocked_getsmallrowdata_pl)
|
||||||
def test_interactive_flexchart_stacked(self, mocked_sqlalchemy,
|
def test_interactive_flexchart_stacked(self, mocked_sqlalchemy,
|
||||||
mocked_getsmallrowdata_db):
|
mocked_getsmallrowdata_pl):
|
||||||
workout = Workout.objects.filter(user=self.r,workouttype__in=mytypes.rowtypes)[0]
|
workout = Workout.objects.filter(user=self.r,workouttype__in=mytypes.rowtypes)[0]
|
||||||
id = workout.id
|
id = workout.id
|
||||||
|
|
||||||
|
|||||||
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
Binary file not shown.
Reference in New Issue
Block a user