Private
Public Access
1
0

Merge branch 'release/v6.98'

This commit is contained in:
Sander Roosendaal
2018-06-21 21:23:21 +02:00
5 changed files with 75 additions and 26 deletions
+12 -4
View File
@@ -2332,8 +2332,16 @@ def workout_normv(w,pp=4.0):
v4mean = wavg(df,'v4','deltat') v4mean = wavg(df,'v4','deltat')
normv = v4mean**(1./pp) normv = v4mean**(1./pp)
if np.isnan(normv): df['w4'] = df['driveenergy']**(pp)
return 500./120. w4mean = wavg(df,'w4','deltat')
normw = w4mean**(1./pp)
return normv
if np.isnan(normv):
normv = 500./120.
if np.isnan(normw):
normw = 0
return normv,normw
+3 -1
View File
@@ -485,11 +485,13 @@ class MyTimeField(forms.TimeField):
class PowerIntervalUpdateForm(forms.Form): class PowerIntervalUpdateForm(forms.Form):
selectorchoices = ( selectorchoices = (
('power','Power'), ('power','Power'),
('pace','Pace') ('pace','Pace'),
('work','Work per Stroke'),
) )
pace = forms.DurationField(required=False,label='Pace (/500m)') pace = forms.DurationField(required=False,label='Pace (/500m)')
power = forms.IntegerField(required=False,label='Power (W)') power = forms.IntegerField(required=False,label='Power (W)')
work = forms.IntegerField(required=False,label='Work per Stroke (J)')
selector = forms.ChoiceField(choices=selectorchoices, selector = forms.ChoiceField(choices=selectorchoices,
required=True, required=True,
initial='power', initial='power',
+16 -14
View File
@@ -2174,7 +2174,7 @@ def interactive_chart(id=0,promember=0,intervaldata = {}):
y_range_name = "watermark", y_range_name = "watermark",
) )
plot.line('time','pace',source=source,legend="Pace") plot.line('time','pace',source=source,legend="Pace",name="pace")
plot.title.text = row.name plot.title.text = row.name
plot.title.text_font_size=value("1.0em") plot.title.text_font_size=value("1.0em")
plot.xaxis.axis_label = "Time" plot.xaxis.axis_label = "Time"
@@ -2201,21 +2201,9 @@ def interactive_chart(id=0,promember=0,intervaldata = {}):
plot.y_range = Range1d(1.e3*ymin,1.e3*ymax) plot.y_range = Range1d(1.e3*ymin,1.e3*ymax)
hover = plot.select(dict(type=HoverTool))
hover.tooltips = OrderedDict([
('Time','@ftime'),
('Pace','@fpace'),
('HR','@hr{int}'),
('SPM','@spm{1.1}'),
])
hover.mode = 'mouse'
plot.extra_y_ranges["spmax"] = Range1d(start=10,end=45) plot.extra_y_ranges["spmax"] = Range1d(start=10,end=45)
plot.line('time','spm',source=source,color="red", plot.line('time','spm',source=source,color="red",
y_range_name="spmax", legend="Stroke Rate") y_range_name="spmax", legend="Stroke Rate",name="spm")
plot.add_layout(LinearAxis(y_range_name="spmax",axis_label="SPM"),'right') plot.add_layout(LinearAxis(y_range_name="spmax",axis_label="SPM"),'right')
plot.legend.location = "bottom_right" plot.legend.location = "bottom_right"
@@ -2240,6 +2228,20 @@ def interactive_chart(id=0,promember=0,intervaldata = {}):
right='time_r',source=intervalsource,color='mediumvioletred', right='time_r',source=intervalsource,color='mediumvioletred',
y_range_name='spmax',fill_alpha=0.2,line_alpha=0.2) y_range_name='spmax',fill_alpha=0.2,line_alpha=0.2)
hover = plot.select(dict(type=HoverTool))
hover.tooltips = OrderedDict([
('Time','@ftime'),
('Pace','@fpace'),
('HR','@hr{int}'),
('SPM','@spm{1.1}'),
])
hover.mode = 'mouse'
hover.names = ["spm","pace"]
script, div = components(plot) script, div = components(plot)
return [script,div] return [script,div]
+10 -1
View File
@@ -1840,7 +1840,16 @@ class AdvancedWorkoutForm(ModelForm):
class RowerExportForm(ModelForm): class RowerExportForm(ModelForm):
class Meta: class Meta:
model = Rower model = Rower
fields = ['stravaexportas'] fields = [
'stravaexportas',
'polar_auto_import',
'c2_auto_export',
'mapmyfitness_auto_export',
'runkeeper_auto_export',
'sporttracks_auto_export',
'strava_auto_export',
'trainingpeaks_auto_export',
]
# Simple form to set rower's Functional Threshold Power # Simple form to set rower's Functional Threshold Power
class RowerPowerForm(ModelForm): class RowerPowerForm(ModelForm):
+34 -6
View File
@@ -11293,7 +11293,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
tss,normp = dataprep.workout_rscore(row) tss,normp = dataprep.workout_rscore(row)
normv = dataprep.workout_normv(row,pp=8.0) normv,normw = dataprep.workout_normv(row,pp=8.0)
try: try:
avpace = datetime.timedelta(seconds=int(500./normv)) avpace = datetime.timedelta(seconds=int(500./normv))
@@ -11304,6 +11304,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
'power': int(normp), 'power': int(normp),
'pace': avpace, 'pace': avpace,
'selector': 'power', 'selector': 'power',
'work': int(normw)
} }
powerorpace = 'power' powerorpace = 'power'
@@ -11337,15 +11338,21 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
powerorpace = request.POST['powerorpace'] powerorpace = request.POST['powerorpace']
value_pace = request.POST['value_pace'] value_pace = request.POST['value_pace']
value_power = request.POST['value_power'] value_power = request.POST['value_power']
value_work = request.POST['value_work']
if powerorpace == 'power': if powerorpace == 'power':
power = int(value_power) power = int(value_power)
pace_secs = 120.0 pace_secs = 120.0
else: work = 400.
elif powerorpace == 'pace':
power = 0 power = 0
try: try:
pace_secs = float(value_pace) pace_secs = float(value_pace)
except ValueError: except ValueError:
pace_secs = float(value_pace.replace(',','.')) pace_secs = float(value_pace.replace(',','.'))
elif powerorpace == 'work':
power = 0
work = int(value_work)
pace_secs = 120.0
if powerorpace == 'power' and power is not None: if powerorpace == 'power' and power is not None:
try: try:
@@ -11362,6 +11369,13 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
debug=False,smoothwindow=15.) debug=False,smoothwindow=15.)
except: except:
messages.error(request,'Error updating pace') messages.error(request,'Error updating pace')
elif powerorpace == 'work':
try:
rowdata.updateinterval_metric(
' WorkPerStroke (joules)',work,mode='larger',
debug=False,smoothwindow=15.)
except:
messages.error(request,'Error updating Work per Stroke')
intervalstats = rowdata.allstats() intervalstats = rowdata.allstats()
itime,idist,itype = rowdata.intervalstats_values() itime,idist,itype = rowdata.intervalstats_values()
@@ -11386,7 +11400,8 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
formvalues = { formvalues = {
'powerorpace': powerorpace, 'powerorpace': powerorpace,
'value_power': power, 'value_power': power,
'value_pace': pace_secs 'value_pace': pace_secs,
'value_work':work,
} }
@@ -11429,6 +11444,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
powerorpace = cd['selector'] powerorpace = cd['selector']
power = cd['power'] power = cd['power']
pace = cd['pace'] pace = cd['pace']
work = cd['work']
try: try:
pace_secs = pace.seconds+pace.microseconds/1.0e6 pace_secs = pace.seconds+pace.microseconds/1.0e6
except AttributeError: except AttributeError:
@@ -11447,6 +11463,14 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
debug=False,smoothwindow=15) debug=False,smoothwindow=15)
except: except:
messages.error(request,'Error updating pace') messages.error(request,'Error updating pace')
elif powerorpace == 'work':
try:
rowdata.updateinterval_metric(
'driveenergy',work,mode='larger',
debug=False,smoothwindow=15.)
except:
messages.error(request,'Error updating Work per Stroke')
intervalstats = rowdata.allstats() intervalstats = rowdata.allstats()
itime,idist,itype = rowdata.intervalstats_values() itime,idist,itype = rowdata.intervalstats_values()
@@ -11455,7 +11479,8 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
formvalues = { formvalues = {
'powerorpace': powerorpace, 'powerorpace': powerorpace,
'value_power': power, 'value_power': power,
'value_pace': pace_secs 'value_pace': pace_secs,
'value_work': work,
} }
powerupdateform = PowerIntervalUpdateForm(initial=cd) powerupdateform = PowerIntervalUpdateForm(initial=cd)
form = SummaryStringForm() form = SummaryStringForm()
@@ -11678,8 +11703,11 @@ def rower_exportsettings_view(request):
if request.method == 'POST': if request.method == 'POST':
form = RowerExportForm(request.POST) form = RowerExportForm(request.POST)
if form.is_valid(): if form.is_valid():
stravaexportas = form.cleaned_data['stravaexportas'] cd = form.cleaned_data
r.stravaexportas = stravaexportas
for attr, value in cd.items():
setattr(r, attr, value)
r.save() r.save()
else: else:
form = RowerExportForm(instance=r) form = RowerExportForm(instance=r)