otwranking and oteranking improved forms
This commit is contained in:
@@ -288,6 +288,20 @@ class WorkoutSplitForm(forms.Form):
|
|||||||
# trial and predict the pace
|
# trial and predict the pace
|
||||||
from rowers.utils import rankingdistances,rankingdurations
|
from rowers.utils import rankingdistances,rankingdurations
|
||||||
from time import strftime
|
from time import strftime
|
||||||
|
class OteWorkoutTypeForm(forms.Form):
|
||||||
|
choices = (
|
||||||
|
('rower','Indoor Rower'),
|
||||||
|
('dynamic','Dynamic Indoor Rower'),
|
||||||
|
('slides','Indoor Rower on Slides'),
|
||||||
|
)
|
||||||
|
|
||||||
|
workouttypes = forms.MultipleChoiceField(
|
||||||
|
required=True,
|
||||||
|
choices=choices,
|
||||||
|
label='Workout Types',
|
||||||
|
initial = [a for a,b in choices],
|
||||||
|
)
|
||||||
|
|
||||||
class PredictedPieceForm(forms.Form):
|
class PredictedPieceForm(forms.Form):
|
||||||
unitchoices = (
|
unitchoices = (
|
||||||
('t','minutes'),
|
('t','minutes'),
|
||||||
@@ -318,13 +332,33 @@ class PredictedPieceForm(forms.Form):
|
|||||||
label='Ranking Durations'
|
label='Ranking Durations'
|
||||||
)
|
)
|
||||||
|
|
||||||
value = forms.FloatField(initial=10,label='Free ranking piece')
|
value = forms.FloatField(initial=10,label='Free ranking piece (minutes)')
|
||||||
pieceunit = forms.ChoiceField(required=True,choices=unitchoices,
|
pieceunit = forms.ChoiceField(required=True,choices=unitchoices,
|
||||||
initial='t',label='Unit')
|
initial='t',label='Unit')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
fields = ['value','pieceunit']
|
fields = ['value','pieceunit']
|
||||||
|
|
||||||
|
class PredictedPieceFormNoDistance(forms.Form):
|
||||||
|
|
||||||
|
rankingdurationchoices = []
|
||||||
|
|
||||||
|
for d in rankingdurations:
|
||||||
|
timestr = d.strftime("%H:%M:%S")
|
||||||
|
thetuple = (timestr,timestr)
|
||||||
|
rankingdurationchoices.append(thetuple)
|
||||||
|
|
||||||
|
|
||||||
|
trankingdurations = forms.MultipleChoiceField(
|
||||||
|
required=True,
|
||||||
|
choices=rankingdurationchoices,
|
||||||
|
initial=[a for a,b in rankingdurationchoices],
|
||||||
|
label='Ranking Durations'
|
||||||
|
)
|
||||||
|
|
||||||
|
value = forms.FloatField(initial=10,label='Free ranking piece')
|
||||||
|
|
||||||
|
|
||||||
# On the Geeky side, to update stream information for river dwellers
|
# On the Geeky side, to update stream information for river dwellers
|
||||||
class UpdateStreamForm(forms.Form):
|
class UpdateStreamForm(forms.Form):
|
||||||
unitchoices = (
|
unitchoices = (
|
||||||
|
|||||||
@@ -53,6 +53,10 @@
|
|||||||
<table>
|
<table>
|
||||||
{{ form.as_table }}
|
{{ form.as_table }}
|
||||||
</table>
|
</table>
|
||||||
|
<h2>Workout Type</h2>
|
||||||
|
<table>
|
||||||
|
{{ workouttypeform.as_p }}
|
||||||
|
</table>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input name='daterange' class="button green" type="submit" value="Submit">
|
<input name='daterange' class="button green" type="submit" value="Submit">
|
||||||
</form>
|
</form>
|
||||||
@@ -109,10 +113,6 @@
|
|||||||
<li class="grid_2">
|
<li class="grid_2">
|
||||||
<h2>Pace predictions for Ranking Pieces</h2>
|
<h2>Pace predictions for Ranking Pieces</h2>
|
||||||
|
|
||||||
<p>Add non-ranking piece using the form. The piece will be added in the prediction tables below. </p>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<table width="100%" class="listtable">
|
<table width="100%" class="listtable">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -50,6 +50,10 @@
|
|||||||
<table>
|
<table>
|
||||||
{{ dateform.as_table }}
|
{{ dateform.as_table }}
|
||||||
</table>
|
</table>
|
||||||
|
<h2>Pieces used for predictions</h2>
|
||||||
|
<table>
|
||||||
|
{{ form.as_table }}
|
||||||
|
</table>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input name='daterange' class="button green" type="submit" value="Submit">
|
<input name='daterange' class="button green" type="submit" value="Submit">
|
||||||
</form>
|
</form>
|
||||||
@@ -138,17 +142,6 @@
|
|||||||
|
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="grid_2">
|
|
||||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
|
||||||
{{ form.value }} {{ form.pieceunit }}
|
|
||||||
|
|
||||||
{% csrf_token %}
|
|
||||||
minutes
|
|
||||||
<input name="piece" class="button green"
|
|
||||||
action=""
|
|
||||||
type="submit" value="Add">
|
|
||||||
</form>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
133
rowers/views.py
133
rowers/views.py
@@ -44,7 +44,7 @@ from rowers.forms import (
|
|||||||
PlannedSessionTeamForm,PlannedSessionTeamMemberForm,
|
PlannedSessionTeamForm,PlannedSessionTeamMemberForm,
|
||||||
VirtualRaceSelectForm,WorkoutRaceSelectForm,CourseSelectForm,
|
VirtualRaceSelectForm,WorkoutRaceSelectForm,CourseSelectForm,
|
||||||
RaceResultFilterForm,PowerIntervalUpdateForm,FlexAxesForm,
|
RaceResultFilterForm,PowerIntervalUpdateForm,FlexAxesForm,
|
||||||
FlexOptionsForm,DataFrameColumnsForm,
|
FlexOptionsForm,DataFrameColumnsForm,OteWorkoutTypeForm,
|
||||||
)
|
)
|
||||||
from django.core.urlresolvers import reverse, reverse_lazy
|
from django.core.urlresolvers import reverse, reverse_lazy
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ from django.core.mail import send_mail, BadHeaderError
|
|||||||
from rowers.forms import (
|
from rowers.forms import (
|
||||||
SummaryStringForm,IntervalUpdateForm,StrokeDataForm,
|
SummaryStringForm,IntervalUpdateForm,StrokeDataForm,
|
||||||
StatsOptionsForm,PredictedPieceForm,DateRangeForm,DeltaDaysForm,
|
StatsOptionsForm,PredictedPieceForm,DateRangeForm,DeltaDaysForm,
|
||||||
FitnessMetricForm,
|
FitnessMetricForm,PredictedPieceFormNoDistance,
|
||||||
EmailForm, RegistrationForm, RegistrationFormTermsOfService,
|
EmailForm, RegistrationForm, RegistrationFormTermsOfService,
|
||||||
RegistrationFormUniqueEmail,RegistrationFormSex,
|
RegistrationFormUniqueEmail,RegistrationFormSex,
|
||||||
CNsummaryForm,UpdateWindForm,
|
CNsummaryForm,UpdateWindForm,
|
||||||
@@ -4114,13 +4114,9 @@ def workout_update_cp_view(request,id=0):
|
|||||||
def otwrankings_view(request,theuser=0,
|
def otwrankings_view(request,theuser=0,
|
||||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||||
enddate=timezone.now(),
|
enddate=timezone.now(),
|
||||||
deltadays=-1,
|
|
||||||
startdatestring="",
|
startdatestring="",
|
||||||
enddatestring=""):
|
enddatestring=""):
|
||||||
|
|
||||||
if deltadays>0:
|
|
||||||
startdate = enddate-datetime.timedelta(days=int(deltadays))
|
|
||||||
|
|
||||||
if startdatestring != "":
|
if startdatestring != "":
|
||||||
try:
|
try:
|
||||||
startdate = iso8601.parse_date(startdatestring)
|
startdate = iso8601.parse_date(startdatestring)
|
||||||
@@ -4133,13 +4129,6 @@ def otwrankings_view(request,theuser=0,
|
|||||||
except ParseError:
|
except ParseError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# if 'startdate' in request.session:
|
|
||||||
# startdate = iso8601.parse_date(request.session['startdate'])
|
|
||||||
|
|
||||||
|
|
||||||
# if 'enddate' in request.session:
|
|
||||||
# enddate = iso8601.parse_date(request.session['enddate'])
|
|
||||||
|
|
||||||
if enddate < startdate:
|
if enddate < startdate:
|
||||||
s = enddate
|
s = enddate
|
||||||
enddate = startdate
|
enddate = startdate
|
||||||
@@ -4165,9 +4154,8 @@ def otwrankings_view(request,theuser=0,
|
|||||||
# get all OTW rows in date range
|
# get all OTW rows in date range
|
||||||
|
|
||||||
# process form
|
# process form
|
||||||
if request.method == 'POST' and "daterange" in request.POST:
|
if request.method == 'POST':
|
||||||
dateform = DateRangeForm(request.POST)
|
dateform = DateRangeForm(request.POST)
|
||||||
deltaform = DeltaDaysForm(request.POST)
|
|
||||||
if dateform.is_valid():
|
if dateform.is_valid():
|
||||||
startdate = dateform.cleaned_data['startdate']
|
startdate = dateform.cleaned_data['startdate']
|
||||||
enddate = dateform.cleaned_data['enddate']
|
enddate = dateform.cleaned_data['enddate']
|
||||||
@@ -4175,34 +4163,36 @@ def otwrankings_view(request,theuser=0,
|
|||||||
s = enddate
|
s = enddate
|
||||||
enddate = startdate
|
enddate = startdate
|
||||||
startdate = s
|
startdate = s
|
||||||
elif request.method == 'POST' and "datedelta" in request.POST:
|
form = PredictedPieceFormNoDistance(request.POST)
|
||||||
deltaform = DeltaDaysForm(request.POST)
|
if form.is_valid():
|
||||||
if deltaform.is_valid():
|
value = form.cleaned_data['value']
|
||||||
deltadays = deltaform.cleaned_data['deltadays']
|
else:
|
||||||
if deltadays:
|
value = None
|
||||||
enddate = timezone.now()
|
trankingdurations = form.cleaned_data['trankingdurations']
|
||||||
startdate = enddate-datetime.timedelta(days=deltadays)
|
trankingdurations = [
|
||||||
if startdate > enddate:
|
datetime.datetime.strptime(d,"%H:%M:%S").time() for d in trankingdurations
|
||||||
s = enddate
|
]
|
||||||
enddate = startdate
|
if value:
|
||||||
startdate = s
|
hourvalue,tvalue = divmod(value,60)
|
||||||
dateform = DateRangeForm(initial={
|
hourvalue = int(hourvalue)
|
||||||
'startdate': startdate,
|
minutevalue = int(tvalue)
|
||||||
'enddate': enddate,
|
tvalue = int(60*(tvalue-minutevalue))
|
||||||
})
|
if hourvalue >= 24:
|
||||||
else:
|
hourvalue = 23
|
||||||
dateform = DateRangeForm(initial={
|
trankingdurations.append(datetime.time(
|
||||||
'startdate': startdate,
|
minute=minutevalue,
|
||||||
'enddate': enddate,
|
hour=hourvalue,
|
||||||
})
|
second=tvalue
|
||||||
deltaform = DeltaDaysForm()
|
))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
form = PredictedPieceFormNoDistance()
|
||||||
dateform = DateRangeForm(initial={
|
dateform = DateRangeForm(initial={
|
||||||
'startdate': startdate,
|
'startdate': startdate,
|
||||||
'enddate': enddate,
|
'enddate': enddate,
|
||||||
})
|
})
|
||||||
deltaform = DeltaDaysForm()
|
workouttypes = ['rower','slides','dynamic']
|
||||||
|
trankingdurations = rankingdurations
|
||||||
|
|
||||||
# get all 2k (if any) - this rower, in date range
|
# get all 2k (if any) - this rower, in date range
|
||||||
try:
|
try:
|
||||||
@@ -4320,26 +4310,11 @@ def otwrankings_view(request,theuser=0,
|
|||||||
message = ""
|
message = ""
|
||||||
|
|
||||||
|
|
||||||
if request.method == 'POST' and "piece" in request.POST:
|
|
||||||
form = PredictedPieceForm(request.POST)
|
|
||||||
clean = form.is_valid()
|
|
||||||
value = form.cleaned_data['value']
|
|
||||||
hourvalue,value = divmod(value,60)
|
|
||||||
hourvalue = int(hourvalue)
|
|
||||||
minutevalue = int(value)
|
|
||||||
value = int(60*(value-minutevalue))
|
|
||||||
if hourvalue >= 24:
|
|
||||||
hourvalue = 23
|
|
||||||
rankingdurations.append(datetime.time(minute=minutevalue,
|
|
||||||
hour=hourvalue,
|
|
||||||
second=value))
|
|
||||||
else:
|
|
||||||
form = PredictedPieceForm()
|
|
||||||
|
|
||||||
|
|
||||||
cpredictions = []
|
cpredictions = []
|
||||||
|
|
||||||
for rankingduration in rankingdurations:
|
for rankingduration in trankingdurations:
|
||||||
t = 3600.*rankingduration.hour
|
t = 3600.*rankingduration.hour
|
||||||
t += 60.*rankingduration.minute
|
t += 60.*rankingduration.minute
|
||||||
t += rankingduration.second
|
t += rankingduration.second
|
||||||
@@ -4368,7 +4343,6 @@ def otwrankings_view(request,theuser=0,
|
|||||||
cpredictions.append(a)
|
cpredictions.append(a)
|
||||||
|
|
||||||
|
|
||||||
del form.fields["pieceunit"]
|
|
||||||
|
|
||||||
startdatestring = startdate.strftime('%Y-%m-%d')
|
startdatestring = startdate.strftime('%Y-%m-%d')
|
||||||
enddatestring = enddate.strftime('%Y-%m-%d')
|
enddatestring = enddate.strftime('%Y-%m-%d')
|
||||||
@@ -4386,7 +4360,6 @@ def otwrankings_view(request,theuser=0,
|
|||||||
'avgpower':avgpower,
|
'avgpower':avgpower,
|
||||||
'form':form,
|
'form':form,
|
||||||
'dateform':dateform,
|
'dateform':dateform,
|
||||||
'deltaform':deltaform,
|
|
||||||
'id': theuser,
|
'id': theuser,
|
||||||
'theuser':uu,
|
'theuser':uu,
|
||||||
'startdate':startdate,
|
'startdate':startdate,
|
||||||
@@ -4594,36 +4567,45 @@ def oterankings_view(request,theuser=0,
|
|||||||
s = enddate
|
s = enddate
|
||||||
enddate = startdate
|
enddate = startdate
|
||||||
startdate = s
|
startdate = s
|
||||||
|
workouttypeform = OteWorkoutTypeForm(request.POST)
|
||||||
|
if workouttypeform.is_valid():
|
||||||
|
workouttypes = workouttypeform.cleaned_data['workouttypes']
|
||||||
form = PredictedPieceForm(request.POST)
|
form = PredictedPieceForm(request.POST)
|
||||||
clean = form.is_valid()
|
if form.is_valid():
|
||||||
value = form.cleaned_data['value']
|
value = form.cleaned_data['value']
|
||||||
|
pieceunit = form.cleaned_data['pieceunit']
|
||||||
|
else:
|
||||||
|
value = None
|
||||||
|
|
||||||
trankingdistances = form.cleaned_data['trankingdistances']
|
trankingdistances = form.cleaned_data['trankingdistances']
|
||||||
trankingdistances = [int(d) for d in trankingdistances]
|
trankingdistances = [int(d) for d in trankingdistances]
|
||||||
trankingdurations = form.cleaned_data['trankingdurations']
|
trankingdurations = form.cleaned_data['trankingdurations']
|
||||||
trankingdurations = [
|
trankingdurations = [
|
||||||
datetime.datetime.strptime(d,"%H:%M:%S").time() for d in trankingdurations
|
datetime.datetime.strptime(d,"%H:%M:%S").time() for d in trankingdurations
|
||||||
]
|
]
|
||||||
hourvalue,tvalue = divmod(value,60)
|
if value:
|
||||||
hourvalue = int(hourvalue)
|
hourvalue,tvalue = divmod(value,60)
|
||||||
minutevalue = int(tvalue)
|
hourvalue = int(hourvalue)
|
||||||
tvalue = int(60*(tvalue-minutevalue))
|
minutevalue = int(tvalue)
|
||||||
if hourvalue >= 24:
|
tvalue = int(60*(tvalue-minutevalue))
|
||||||
hourvalue = 23
|
if hourvalue >= 24:
|
||||||
pieceunit = form.cleaned_data['pieceunit']
|
hourvalue = 23
|
||||||
if pieceunit == 'd':
|
if pieceunit == 'd':
|
||||||
trankingdistances.append(value)
|
trankingdistances.append(value)
|
||||||
else:
|
else:
|
||||||
trankingdurations.append(datetime.time(
|
trankingdurations.append(datetime.time(
|
||||||
minute=minutevalue,
|
minute=minutevalue,
|
||||||
hour=hourvalue,
|
hour=hourvalue,
|
||||||
second=tvalue
|
second=tvalue
|
||||||
))
|
))
|
||||||
else:
|
else:
|
||||||
form = PredictedPieceForm()
|
form = PredictedPieceForm()
|
||||||
dateform = DateRangeForm(initial={
|
dateform = DateRangeForm(initial={
|
||||||
'startdate': startdate,
|
'startdate': startdate,
|
||||||
'enddate': enddate,
|
'enddate': enddate,
|
||||||
})
|
})
|
||||||
|
workouttypeform = OteWorkoutTypeForm()
|
||||||
|
workouttypes = ['rower','slides','dynamic']
|
||||||
trankingdistances = rankingdistances
|
trankingdistances = rankingdistances
|
||||||
trankingdurations = rankingdurations
|
trankingdurations = rankingdurations
|
||||||
|
|
||||||
@@ -4654,11 +4636,7 @@ def oterankings_view(request,theuser=0,
|
|||||||
|
|
||||||
theworkouts = Workout.objects.filter(
|
theworkouts = Workout.objects.filter(
|
||||||
user=r,rankingpiece=True,
|
user=r,rankingpiece=True,
|
||||||
workouttype__in=[
|
workouttype__in=workouttypes,
|
||||||
'rower',
|
|
||||||
'dynamic',
|
|
||||||
'slides'
|
|
||||||
],
|
|
||||||
startdatetime__gte=startdate,
|
startdatetime__gte=startdate,
|
||||||
startdatetime__lte=enddate
|
startdatetime__lte=enddate
|
||||||
).order_by("-startdatetime")
|
).order_by("-startdatetime")
|
||||||
@@ -4863,6 +4841,7 @@ def oterankings_view(request,theuser=0,
|
|||||||
'avgpower':avgpower,
|
'avgpower':avgpower,
|
||||||
'form':form,
|
'form':form,
|
||||||
'dateform':dateform,
|
'dateform':dateform,
|
||||||
|
'workouttypeform':workouttypeform,
|
||||||
'id': theuser,
|
'id': theuser,
|
||||||
'theuser':uu,
|
'theuser':uu,
|
||||||
'startdate':startdate,
|
'startdate':startdate,
|
||||||
|
|||||||
Reference in New Issue
Block a user