Private
Public Access
1
0

Merge branch 'feature/automagicspm' into develop

This commit is contained in:
Sander Roosendaal
2020-02-23 10:38:59 +01:00
4 changed files with 139 additions and 25 deletions
+4
View File
@@ -731,15 +731,19 @@ class PowerIntervalUpdateForm(forms.Form):
('power','Power'),
('pace','Pace'),
('work','Work per Stroke'),
('spm','Stroke Rate')
)
pace = forms.DurationField(required=False,label='Pace (/500m)')
power = forms.IntegerField(required=False,label='Power (W)')
work = forms.IntegerField(required=False,label='Work per Stroke (J)')
spm = forms.IntegerField(required=False,label='Stroke Rate')
selector = forms.ChoiceField(choices=selectorchoices,
required=True,
initial='power',
label='Use')
activeminutesmin = forms.IntegerField(required=False,initial=0,widget=forms.HiddenInput())
activeminutesmax = forms.IntegerField(required=False,initial=0,widget=forms.HiddenInput())
# Form used to update interval stats
class IntervalUpdateForm(forms.Form):
+31 -4
View File
@@ -7,6 +7,27 @@
{% block scripts %}
{% include "monitorjobs.html" %}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script>
$( function() {
console.log({{ activeminutesmin }}, {{ activeminutesmax}}, 'active range');
$( "#slider-range" ).slider({
range: true,
min: 0,
max: {{ maxminutes }},
values: [ {{ activeminutesmin }}, {{ activeminutesmax }} ],
slide: function( event, ui ) {
$( "#amount" ).val(ui.values[ 0 ] + " min - " + ui.values[ 1 ] + " min " );
$("#id_activeminutesmin").val(ui.values[0]);
$("#id_activeminutesmax").val(ui.values[1]);
}
});
$( "#amount" ).val($( "#slider-range" ).slider( "values", 0 ) +
" min - " + $( "#slider-range" ).slider( "values", 1 ) + " min ");
} );
</script>
{% endblock %}
{% block main %}
@@ -47,22 +68,28 @@
{{ form.as_table }}
</table>
{% csrf_token %}
<input class="button green" type="submit" value="Update">
<input class="button" type="submit" value="Update">
</form>
<h1>Intervals by Power/Pace</h1>
<p>With this form, you can specify a power or pace level. Everything faster/harder than the
specified pace/power will become a work interval. Everything slower will become a rest
interval.
interval. Use the slider to limit the active range. Everything outside the active range will
become rest (warming up and cooling down).
</p>
<form ecntype="multipart/form-data" method="post">
<div id="slider-range"></div>
<p>
<label for="amount">Active Range:</label>
<input type="text" id="amount" readonly style="border:0; color:#1c75bc; font-weight:bold;">
</p>
<table>
{{ powerupdateform.as_table }}
</table>
{% csrf_token %}
<input class="button green" type="submit" value="Submit">
<input class="button" type="submit" value="Submit">
</form>
</li>
<li class="grid_2">
@@ -131,7 +158,7 @@
</table>
{% csrf_token %}
<input type="hidden" name="nrintervals" value={{ nrintervals }}>
<input class="button green" type="submit" value="Update">
<input class="button" type="submit" value="Update">
</form>
</li>
<li class="grid_4">
+5
View File
@@ -564,6 +564,9 @@ class WorkoutViewTest(TestCase):
'value_pace':'2:23',
'value_power':'200',
'value_work':'400',
'value_spm':'20',
'activeminutesmin':'0',
'activeminutesmax':'60',
'savepowerpaceform':True,
}
@@ -582,6 +585,8 @@ class WorkoutViewTest(TestCase):
'power': 200,
'pace': '2:30',
'work': 400,
'activeminutesmin':'0',
'activeminutesmax': '60',
}
form = PowerIntervalUpdateForm(form_data)
+92 -14
View File
@@ -5601,6 +5601,9 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
return HttpResponse("Error: CSV Data File Not Found")
nrintervals = len(idist)
activeminutesmax = int(rowdata.duration/60.)
activeminutesmin = 0
maxminutes = activeminutesmax
savebutton = 'nosavebutton'
formvalues = {}
@@ -5610,6 +5613,10 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
normp = row.normp
normv = row.normv
normw = row.normw
try:
normspm = rowdata.df[' Cadence (stokes/min)'].mean()
except KeyError:
normspm = 0
if tss == -1:
tss,normp = dataprep.workout_rscore(row)
@@ -5631,7 +5638,10 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
'power': int(normp),
'pace': avpace,
'selector': 'power',
'work': int(normw)
'work': int(normw),
'spm': int(normspm),
'activeminutesmin': 0,
'activeminutesmax': activeminutesmax,
}
powerorpace = 'power'
@@ -5666,6 +5676,20 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
value_pace = request.POST['value_pace']
value_power = request.POST['value_power']
value_work = request.POST['value_work']
value_spm = request.POST['value_spm']
activeminutesmin = request.POST['activeminutesmin']
activeminutesmax = request.POST['activeminutesmax']
try:
activesecondsmin = 60.*float(activeminutesmin)
activesecondsmax = 60.*float(activeminutesmax)
except ValueError:
activesecondsmin = 0
activeminutesmin = 0
activeminutesmax = maxminutes
activesecondsmax = rowdata.duration
if abs(rowdata.duration-activesecondsmax) < 60.:
activesecondsmax = rowdata.duration
if powerorpace == 'power':
try:
power = int(value_power)
@@ -5684,12 +5708,19 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
work = int(value_work)
except ValueError:
work = int(normw)
elif powerorpace == 'spm':
try:
spm = int(value_spm)
except ValueError:
spm = int(normspm)
if powerorpace == 'power' and power is not None:
try:
rowdata.updateinterval_metric(
' Power (watts)',power,mode='larger',
debug=False,smoothwindow=15.)
debug=False,smoothwindow=15.,
activewindow=[activesecondsmin,activesecondsmax],
)
except:
messages.error(request,'Error updating power')
elif powerorpace == 'pace':
@@ -5697,16 +5728,29 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
velo = 500./pace_secs
rowdata.updateinterval_metric(
' AverageBoatSpeed (m/s)',velo,mode='larger',
debug=False,smoothwindow=15.)
debug=False,smoothwindow=15.,
activewindow=[activesecondsmin,activesecondsmax],
)
except:
messages.error(request,'Error updating pace')
elif powerorpace == 'work':
try:
rowdata.updateinterval_metric(
'driveenergy',work,mode='larger',
debug=False,smoothwindow=15.)
debug=False,smoothwindow=15.,
activewindow=[activesecondsmin,activesecondsmax],
)
except:
messages.error(request,'Error updating Work per Stroke')
elif powerorpace == 'spm':
try:
print('aap')
rowdata.updateinterval_metric(
' Cadence (stokes/min)',spm,mode='larger',
debug=False,smoothwindow=2.,
activewindow=[activesecondsmin,activesecondsmax],)
except:
messages.error(request,'Error updating SPM')
intervalstats = rowdata.allstats()
itime,idist,itype = rowdata.intervalstats_values()
@@ -5724,7 +5768,10 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
'power': power,
'pace': datetime.timedelta(seconds=int(pace_secs)),
'work': work,
'selector': powerorpace
'selector': powerorpace,
'spm': int(normspm),
'activeminutesmin': activeminutesmin,
'activeminutesmax': activeminutesmax,
}
form = SummaryStringForm()
powerupdateform = PowerIntervalUpdateForm(initial=data)
@@ -5769,7 +5816,10 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
'power': int(normp),
'pace': avpace,
'selector': 'power',
'work': int(normw)
'work': int(normw),
'spm': int(normspm),
'activeminutesmin': 0,
'activeminutesmax': activeminutesmax,
})
savebutton = 'savestringform'
@@ -5782,31 +5832,50 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
power = cd['power']
pace = cd['pace']
work = cd['work']
spm = cd['spm']
activeminutesmin = cd['activeminutesmin']
activeminutesmax = cd['activeminutesmax']
activesecondsmin = 60.*activeminutesmin
activesecondsmax = 60.*activeminutesmax
if abs(rowdata.duration-activesecondsmax) < 60.:
activesecondsmax = rowdata.duration
try:
pace_secs = pace.seconds+pace.microseconds/1.0e6
except AttributeError:
pace_secs = 120.
if powerorpace == 'power' and power is not None:
try:
rowdata.updateinterval_metric(' Power (watts)',power,mode='larger',
debug=False,smoothwindow=15)
except:
messages.error(request,'Error updating power')
rowdata.updateinterval_metric(' Power (watts)',power,mode='larger',
debug=False,smoothwindow=15,
activewindow=[activesecondsmin,activesecondsmax],
)
elif powerorpace == 'pace':
try:
velo = 500./pace_secs
rowdata.updateinterval_metric(' AverageBoatSpeed (m/s)',velo,mode='larger',
debug=False,smoothwindow=15)
debug=False,smoothwindow=15,
activewindow=[activesecondsmin,activesecondsmax],
)
except:
messages.error(request,'Error updating pace')
elif powerorpace == 'work':
try:
rowdata.updateinterval_metric(
'driveenergy',work,mode='larger',
debug=False,smoothwindow=15.)
debug=False,smoothwindow=15.,
activewindow=[activesecondsmin,activesecondsmax],)
except:
messages.error(request,'Error updating Work per Stroke')
elif powerorpace == 'spm':
try:
rowdata.updateinterval_metric(' Cadence (stokes/min)',spm,mode='larger',
debug=False,smoothwindow=2.,
activewindow=[activesecondsmin,activesecondsmax],
)
except:
print('mies')
messages.error(request,'Error updating SPM')
intervalstats = rowdata.allstats()
@@ -5818,6 +5887,9 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
'value_power': power,
'value_pace': pace_secs,
'value_work': work,
'value_spm': spm,
'activeminutesmin': activeminutesmin,
'activeminutesmax': activeminutesmax,
}
powerupdateform = PowerIntervalUpdateForm(initial=cd)
form = SummaryStringForm()
@@ -5884,7 +5956,10 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
'power': int(normp),
'pace': avpace,
'selector': 'power',
'work': int(normw)
'work': int(normw),
'spm': int(normspm),
'activeminutesmin': 0,
'activeminutesmax': activeminutesmax,
})
@@ -5968,6 +6043,9 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
return render(request, 'summary_edit.html',
{'form':form,
'activeminutesmax':activeminutesmax,
'activeminutesmin':activeminutesmin,
'maxminutes': maxminutes,
'detailform':detailform,
'powerupdateform':powerupdateform,
'workout':row,