Merge branch 'release/v6.98'
This commit is contained in:
+12
-4
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user