improved manual entry form
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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',
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user