Private
Public Access
1
0

improved manual entry form

This commit is contained in:
Sander Roosendaal
2018-11-09 12:10:56 +01:00
parent a562fc3f64
commit a376c079c7
5 changed files with 71 additions and 22 deletions

View File

@@ -738,7 +738,10 @@ def fetchcp(rower,theworkouts,table='cpdata'):
# create a new workout from manually entered data # create a new workout from manually entered data
def create_row_df(r,distance,duration,startdatetime,workouttype='rower'): def create_row_df(r,distance,duration,startdatetime,workouttype='rower',
avghr=None,avgpwr=None,avgspm=None,
rankingpiece = False,
title='Manual entry',notes='',weightcategory='hwt'):
@@ -751,10 +754,13 @@ def create_row_df(r,distance,duration,startdatetime,workouttype='rower'):
totalseconds += duration.second totalseconds += duration.second
totalseconds += duration.microsecond/1.e6 totalseconds += duration.microsecond/1.e6
if not avgspm:
try: try:
spm = 60.*nr_strokes/totalseconds spm = 60.*nr_strokes/totalseconds
except ZeroDivisionError: except ZeroDivisionError:
spm = 20. spm = 20.
else:
spm = avgspm
step = totalseconds/float(nr_strokes) step = totalseconds/float(nr_strokes)
@@ -774,9 +780,15 @@ def create_row_df(r,distance,duration,startdatetime,workouttype='rower'):
except ZeroDivisionError: except ZeroDivisionError:
velo = 2.4 velo = 2.4
power = 2.8*velo**3 power = 2.8*velo**3
elif avgpwr is not None:
power = avgpwr
else: else:
power = 0 power = 0
if avghr is not None:
hr = avghr
else:
hr = 0
df = pd.DataFrame({ df = pd.DataFrame({
'TimeStamp (sec)': unixtime, 'TimeStamp (sec)': unixtime,
@@ -785,6 +797,7 @@ def create_row_df(r,distance,duration,startdatetime,workouttype='rower'):
' Stroke500mPace (sec/500m)':pace, ' Stroke500mPace (sec/500m)':pace,
' ElapsedTime (sec)':elapsed, ' ElapsedTime (sec)':elapsed,
' Power (watts)':power, ' Power (watts)':power,
' HRCur (bpm)':hr,
}) })
timestr = strftime("%Y%m%d-%H%M%S") timestr = strftime("%Y%m%d-%H%M%S")
@@ -797,10 +810,11 @@ def create_row_df(r,distance,duration,startdatetime,workouttype='rower'):
row.write_csv(csvfilename, gzip = True) row.write_csv(csvfilename, gzip = True)
id, message = save_workout_database(csvfilename, r, id, message = save_workout_database(csvfilename, r,
# title=title, title=title,
# notes=notes, notes=notes,
rankingpiece=rankingpiece,
dosmooth=False, dosmooth=False,
# workouttype=workouttype, workouttype=workouttype,
consistencychecks=False, consistencychecks=False,
totaltime=totalseconds) totaltime=totalseconds)
@@ -814,6 +828,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
dosummary=True, title='Workout', dosummary=True, title='Workout',
workoutsource='unknown', workoutsource='unknown',
notes='', totaldist=0, totaltime=0, notes='', totaldist=0, totaltime=0,
rankingpiece=False,
summary='', summary='',
makeprivate=False, makeprivate=False,
oarlength=2.89, inboard=0.88, oarlength=2.89, inboard=0.88,
@@ -1000,6 +1015,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
weightcategory=r.weightcategory, weightcategory=r.weightcategory,
starttime=workoutstarttime, starttime=workoutstarttime,
workoutsource=workoutsource, workoutsource=workoutsource,
rankingpiece=rankingpiece,
forceunit=forceunit, forceunit=forceunit,
csvfilename=f2, notes=notes, summary=summary, csvfilename=f2, notes=notes, summary=summary,
maxhr=maxhr, averagehr=averagehr, maxhr=maxhr, averagehr=averagehr,
@@ -1014,10 +1030,6 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
w.startdatetime = timezone.now() w.startdatetime = timezone.now()
w.save() w.save()
if is_ranking_piece(w):
w.rankingpiece = True
w.save()
if privacy == 'visible': if privacy == 'visible':
ts = Team.objects.filter(rower=r) ts = Team.objects.filter(rower=r)
for t in ts: for t in ts:

View File

@@ -31,6 +31,10 @@ class EmailForm(forms.Form):
message = forms.CharField() message = forms.CharField()
class MetricsForm(forms.Form):
avghr = forms.IntegerField(required=False,label='Average Heart Rate')
avgpwr = forms.IntegerField(required=False,label='Average Power')
avgspm = forms.FloatField(required=False,label='Average SPM')
# Upload the CrewNerd Summary CSV # Upload the CrewNerd Summary CSV
class CNsummaryForm(forms.Form): class CNsummaryForm(forms.Form):

View File

@@ -2067,7 +2067,7 @@ class Workout(models.Model):
user = models.ForeignKey(Rower) user = models.ForeignKey(Rower)
team = models.ManyToManyField(Team,blank=True) team = models.ManyToManyField(Team,blank=True)
plannedsession = models.ForeignKey(PlannedSession, blank=True,null=True) plannedsession = models.ForeignKey(PlannedSession, blank=True,null=True)
name = models.CharField(max_length=150) name = models.CharField(max_length=150,blank=True,null=True)
date = models.DateField() date = models.DateField()
workouttype = models.CharField(choices=workouttypes,max_length=50, workouttype = models.CharField(choices=workouttypes,max_length=50,
verbose_name='Exercise/Boat Class') verbose_name='Exercise/Boat Class')

View File

@@ -36,7 +36,7 @@ $('#id_workouttype').change();
{% endblock %} {% endblock %}
{% block main %} {% block main %}
<h1>Add Workout Manually</h1> <h1>Add Manual Workout Entry</h1>
<ul class="main-content"> <ul class="main-content">
<li class="grid_2"> <li class="grid_2">
{% if form.errors %} {% if form.errors %}
@@ -49,6 +49,7 @@ $('#id_workouttype').change();
enctype="multipart/form-data" action="" method="post"> enctype="multipart/form-data" action="" method="post">
<table width=100%> <table width=100%>
{{ form.as_table }} {{ form.as_table }}
{{ metricsform.as_table }}
</table> </table>
{% csrf_token %} {% csrf_token %}
<p> <p>

View File

@@ -49,6 +49,7 @@ from rowers.forms import (
VirtualRaceSelectForm,WorkoutRaceSelectForm,CourseSelectForm, VirtualRaceSelectForm,WorkoutRaceSelectForm,CourseSelectForm,
RaceResultFilterForm,PowerIntervalUpdateForm,FlexAxesForm, RaceResultFilterForm,PowerIntervalUpdateForm,FlexAxesForm,
FlexOptionsForm,DataFrameColumnsForm,OteWorkoutTypeForm, FlexOptionsForm,DataFrameColumnsForm,OteWorkoutTypeForm,
MetricsForm,
) )
from django.core.urlresolvers import reverse, reverse_lazy from django.core.urlresolvers import reverse, reverse_lazy
@@ -3294,12 +3295,26 @@ def histo(request,theuser=0,
def addmanual_view(request): def addmanual_view(request):
r = Rower.objects.get(user=request.user) r = Rower.objects.get(user=request.user)
breadcrumbs = [
{
'url':'/rowers/list-workouts',
'name':'Workouts'
},
{
'url':reverse(addmanual_view),
'name': 'Add Manual Entry'
},
]
if request.method == 'POST': if request.method == 'POST':
# Form was submitted # Form was submitted
form = WorkoutForm(request.POST) form = WorkoutForm(request.POST)
if form.is_valid(): metricsform = MetricsForm(request.POST)
if form.is_valid() and metricsform.is_valid():
# Get values from form # Get values from form
name = form.cleaned_data['name'] name = form.cleaned_data['name']
if name == '':
name = 'Manual Entry'
date = form.cleaned_data['date'] date = form.cleaned_data['date']
starttime = form.cleaned_data['starttime'] starttime = form.cleaned_data['starttime']
workouttype = form.cleaned_data['workouttype'] workouttype = form.cleaned_data['workouttype']
@@ -3309,6 +3324,9 @@ def addmanual_view(request):
notes = form.cleaned_data['notes'] notes = form.cleaned_data['notes']
thetimezone = form.cleaned_data['timezone'] thetimezone = form.cleaned_data['timezone']
private = form.cleaned_data['private'] private = form.cleaned_data['private']
avghr = metricsform.cleaned_data['avghr']
avgpwr = metricsform.cleaned_data['avgpwr']
avgspm = metricsform.cleaned_data['avgspm']
try: try:
boattype = request.POST['boattype'] boattype = request.POST['boattype']
except KeyError: except KeyError:
@@ -3336,12 +3354,17 @@ def addmanual_view(request):
) )
id,message = dataprep.create_row_df(r, id,message = dataprep.create_row_df(r,
distance, distance,
# weightcategory,
duration,startdatetime, duration,startdatetime,
# title = name, weightcategory=weightcategory,
# notes=notes, avghr=avghr,
rankingpiece=rankingpiece,
avgpwr=avgpwr,
avgspm=avgspm,
title = name,
notes=notes,
workouttype=workouttype) workouttype=workouttype)
@@ -3351,7 +3374,7 @@ def addmanual_view(request):
if id: if id:
w = Workout.objects.get(id=id) w = Workout.objects.get(id=id)
w.rankingpiece = rankingpiece or is_ranking_piece(w) w.rankingpiece = rankingpiece
w.privacy = privacy w.privacy = privacy
w.weightcategory = weightcategory w.weightcategory = weightcategory
w.notes = notes w.notes = notes
@@ -3360,7 +3383,13 @@ def addmanual_view(request):
w.boattype = boattype w.boattype = boattype
w.save() w.save()
messages.info(request,'New workout created') messages.info(request,'New workout created')
else:
return render(request,'manualadd.html',
{'form':form,
'metricsform':metricsform,
'breadcrumbs':breadcrumbs,
'active':'nav-workouts',
})
initial = { initial = {
'workouttype':'rower', 'workouttype':'rower',
@@ -3372,9 +3401,12 @@ def addmanual_view(request):
} }
form = WorkoutForm(initial=initial) form = WorkoutForm(initial=initial)
metricsform = MetricsForm()
return render(request,'manualadd.html', return render(request,'manualadd.html',
{'form':form, {'form':form,
'metricsform':metricsform,
'breadcrumbs':breadcrumbs,
'active':'nav-workouts', 'active':'nav-workouts',
}) })