Merge branch 'bugfix/dateselectors' into develop
This commit is contained in:
@@ -286,18 +286,79 @@ class WorkoutSplitForm(forms.Form):
|
||||
|
||||
# This form is used on the Analysis page to add a custom distance/time
|
||||
# trial and predict the pace
|
||||
from rowers.utils import rankingdistances,rankingdurations
|
||||
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):
|
||||
unitchoices = (
|
||||
('t','minutes'),
|
||||
('d','meters'),
|
||||
)
|
||||
|
||||
rankingdistancechoices = []
|
||||
rankingdurationchoices = []
|
||||
for d in rankingdistances:
|
||||
thetuple = (d,str(d)+' m')
|
||||
rankingdistancechoices.append(thetuple)
|
||||
|
||||
for d in rankingdurations:
|
||||
timestr = d.strftime("%H:%M:%S")
|
||||
thetuple = (timestr,timestr)
|
||||
rankingdurationchoices.append(thetuple)
|
||||
|
||||
trankingdistances = forms.MultipleChoiceField(
|
||||
required=True,
|
||||
choices=rankingdistancechoices,initial=rankingdistances,
|
||||
label='Ranking Distances'
|
||||
)
|
||||
|
||||
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 (minutes)')
|
||||
pieceunit = forms.ChoiceField(required=True,choices=unitchoices,
|
||||
initial='t',label='Unit')
|
||||
value = forms.FloatField(initial=10,label='Value')
|
||||
|
||||
class Meta:
|
||||
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
|
||||
class UpdateStreamForm(forms.Form):
|
||||
unitchoices = (
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
<p>At the bottom of the page, you will find predictions derived from the model.</p>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>Use this form to select a different date range:</p>
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
@@ -50,6 +49,14 @@
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
<h2>Pieces used for predictions</h2>
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
<h2>Workout Type</h2>
|
||||
<table>
|
||||
{{ workouttypeform.as_p }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input name='daterange' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
@@ -106,10 +113,6 @@
|
||||
<li class="grid_2">
|
||||
<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">
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -144,17 +147,6 @@
|
||||
|
||||
</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>
|
||||
|
||||
@@ -50,6 +50,10 @@
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
<h2>Pieces used for predictions</h2>
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input name='daterange' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
@@ -138,17 +142,6 @@
|
||||
|
||||
</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>
|
||||
|
||||
|
||||
|
||||
195
rowers/views.py
195
rowers/views.py
@@ -44,7 +44,7 @@ from rowers.forms import (
|
||||
PlannedSessionTeamForm,PlannedSessionTeamMemberForm,
|
||||
VirtualRaceSelectForm,WorkoutRaceSelectForm,CourseSelectForm,
|
||||
RaceResultFilterForm,PowerIntervalUpdateForm,FlexAxesForm,
|
||||
FlexOptionsForm,DataFrameColumnsForm,
|
||||
FlexOptionsForm,DataFrameColumnsForm,OteWorkoutTypeForm,
|
||||
)
|
||||
from django.core.urlresolvers import reverse, reverse_lazy
|
||||
|
||||
@@ -58,7 +58,7 @@ from django.core.mail import send_mail, BadHeaderError
|
||||
from rowers.forms import (
|
||||
SummaryStringForm,IntervalUpdateForm,StrokeDataForm,
|
||||
StatsOptionsForm,PredictedPieceForm,DateRangeForm,DeltaDaysForm,
|
||||
FitnessMetricForm,
|
||||
FitnessMetricForm,PredictedPieceFormNoDistance,
|
||||
EmailForm, RegistrationForm, RegistrationFormTermsOfService,
|
||||
RegistrationFormUniqueEmail,RegistrationFormSex,
|
||||
CNsummaryForm,UpdateWindForm,
|
||||
@@ -4114,13 +4114,9 @@ def workout_update_cp_view(request,id=0):
|
||||
def otwrankings_view(request,theuser=0,
|
||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||
enddate=timezone.now(),
|
||||
deltadays=-1,
|
||||
startdatestring="",
|
||||
enddatestring=""):
|
||||
|
||||
if deltadays>0:
|
||||
startdate = enddate-datetime.timedelta(days=int(deltadays))
|
||||
|
||||
if startdatestring != "":
|
||||
try:
|
||||
startdate = iso8601.parse_date(startdatestring)
|
||||
@@ -4133,13 +4129,6 @@ def otwrankings_view(request,theuser=0,
|
||||
except ParseError:
|
||||
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:
|
||||
s = enddate
|
||||
enddate = startdate
|
||||
@@ -4165,9 +4154,8 @@ def otwrankings_view(request,theuser=0,
|
||||
# get all OTW rows in date range
|
||||
|
||||
# process form
|
||||
if request.method == 'POST' and "daterange" in request.POST:
|
||||
if request.method == 'POST':
|
||||
dateform = DateRangeForm(request.POST)
|
||||
deltaform = DeltaDaysForm(request.POST)
|
||||
if dateform.is_valid():
|
||||
startdate = dateform.cleaned_data['startdate']
|
||||
enddate = dateform.cleaned_data['enddate']
|
||||
@@ -4175,34 +4163,36 @@ def otwrankings_view(request,theuser=0,
|
||||
s = enddate
|
||||
enddate = startdate
|
||||
startdate = s
|
||||
elif request.method == 'POST' and "datedelta" in request.POST:
|
||||
deltaform = DeltaDaysForm(request.POST)
|
||||
if deltaform.is_valid():
|
||||
deltadays = deltaform.cleaned_data['deltadays']
|
||||
if deltadays:
|
||||
enddate = timezone.now()
|
||||
startdate = enddate-datetime.timedelta(days=deltadays)
|
||||
if startdate > enddate:
|
||||
s = enddate
|
||||
enddate = startdate
|
||||
startdate = s
|
||||
dateform = DateRangeForm(initial={
|
||||
'startdate': startdate,
|
||||
'enddate': enddate,
|
||||
})
|
||||
else:
|
||||
dateform = DateRangeForm(initial={
|
||||
'startdate': startdate,
|
||||
'enddate': enddate,
|
||||
})
|
||||
deltaform = DeltaDaysForm()
|
||||
form = PredictedPieceFormNoDistance(request.POST)
|
||||
if form.is_valid():
|
||||
value = form.cleaned_data['value']
|
||||
else:
|
||||
value = None
|
||||
trankingdurations = form.cleaned_data['trankingdurations']
|
||||
trankingdurations = [
|
||||
datetime.datetime.strptime(d,"%H:%M:%S").time() for d in trankingdurations
|
||||
]
|
||||
if value:
|
||||
hourvalue,tvalue = divmod(value,60)
|
||||
hourvalue = int(hourvalue)
|
||||
minutevalue = int(tvalue)
|
||||
tvalue = int(60*(tvalue-minutevalue))
|
||||
if hourvalue >= 24:
|
||||
hourvalue = 23
|
||||
trankingdurations.append(datetime.time(
|
||||
minute=minutevalue,
|
||||
hour=hourvalue,
|
||||
second=tvalue
|
||||
))
|
||||
|
||||
else:
|
||||
form = PredictedPieceFormNoDistance()
|
||||
dateform = DateRangeForm(initial={
|
||||
'startdate': startdate,
|
||||
'enddate': enddate,
|
||||
})
|
||||
deltaform = DeltaDaysForm()
|
||||
workouttypes = ['rower','slides','dynamic']
|
||||
trankingdurations = rankingdurations
|
||||
|
||||
# get all 2k (if any) - this rower, in date range
|
||||
try:
|
||||
@@ -4320,26 +4310,11 @@ def otwrankings_view(request,theuser=0,
|
||||
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 = []
|
||||
|
||||
for rankingduration in rankingdurations:
|
||||
for rankingduration in trankingdurations:
|
||||
t = 3600.*rankingduration.hour
|
||||
t += 60.*rankingduration.minute
|
||||
t += rankingduration.second
|
||||
@@ -4368,7 +4343,6 @@ def otwrankings_view(request,theuser=0,
|
||||
cpredictions.append(a)
|
||||
|
||||
|
||||
del form.fields["pieceunit"]
|
||||
|
||||
startdatestring = startdate.strftime('%Y-%m-%d')
|
||||
enddatestring = enddate.strftime('%Y-%m-%d')
|
||||
@@ -4386,7 +4360,6 @@ def otwrankings_view(request,theuser=0,
|
||||
'avgpower':avgpower,
|
||||
'form':form,
|
||||
'dateform':dateform,
|
||||
'deltaform':deltaform,
|
||||
'id': theuser,
|
||||
'theuser':uu,
|
||||
'startdate':startdate,
|
||||
@@ -4544,13 +4517,9 @@ def otwcp_toadmin_view(request,theuser=0,
|
||||
def oterankings_view(request,theuser=0,
|
||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||
enddate=timezone.now(),
|
||||
deltadays=-1,
|
||||
startdatestring="",
|
||||
enddatestring=""):
|
||||
|
||||
if deltadays>0:
|
||||
startdate = enddate-datetime.timedelta(days=int(deltadays))
|
||||
|
||||
if startdatestring != "":
|
||||
try:
|
||||
startdate = iso8601.parse_date(startdatestring)
|
||||
@@ -4563,13 +4532,6 @@ def oterankings_view(request,theuser=0,
|
||||
except ParseError:
|
||||
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:
|
||||
s = enddate
|
||||
enddate = startdate
|
||||
@@ -4596,9 +4558,8 @@ def oterankings_view(request,theuser=0,
|
||||
# get all OTW rows in date range
|
||||
|
||||
# process form
|
||||
if request.method == 'POST' and "daterange" in request.POST:
|
||||
if request.method == 'POST':
|
||||
dateform = DateRangeForm(request.POST)
|
||||
deltaform = DeltaDaysForm(request.POST)
|
||||
if dateform.is_valid():
|
||||
startdate = dateform.cleaned_data['startdate']
|
||||
enddate = dateform.cleaned_data['enddate']
|
||||
@@ -4606,34 +4567,47 @@ def oterankings_view(request,theuser=0,
|
||||
s = enddate
|
||||
enddate = startdate
|
||||
startdate = s
|
||||
elif request.method == 'POST' and "datedelta" in request.POST:
|
||||
deltaform = DeltaDaysForm(request.POST)
|
||||
if deltaform.is_valid():
|
||||
deltadays = deltaform.cleaned_data['deltadays']
|
||||
if deltadays:
|
||||
enddate = timezone.now()
|
||||
startdate = enddate-datetime.timedelta(days=deltadays)
|
||||
if startdate > enddate:
|
||||
s = enddate
|
||||
enddate = startdate
|
||||
startdate = s
|
||||
dateform = DateRangeForm(initial={
|
||||
'startdate': startdate,
|
||||
'enddate': enddate,
|
||||
})
|
||||
workouttypeform = OteWorkoutTypeForm(request.POST)
|
||||
if workouttypeform.is_valid():
|
||||
workouttypes = workouttypeform.cleaned_data['workouttypes']
|
||||
form = PredictedPieceForm(request.POST)
|
||||
if form.is_valid():
|
||||
value = form.cleaned_data['value']
|
||||
pieceunit = form.cleaned_data['pieceunit']
|
||||
else:
|
||||
value = None
|
||||
|
||||
trankingdistances = form.cleaned_data['trankingdistances']
|
||||
trankingdistances = [int(d) for d in trankingdistances]
|
||||
trankingdurations = form.cleaned_data['trankingdurations']
|
||||
trankingdurations = [
|
||||
datetime.datetime.strptime(d,"%H:%M:%S").time() for d in trankingdurations
|
||||
]
|
||||
if value:
|
||||
hourvalue,tvalue = divmod(value,60)
|
||||
hourvalue = int(hourvalue)
|
||||
minutevalue = int(tvalue)
|
||||
tvalue = int(60*(tvalue-minutevalue))
|
||||
if hourvalue >= 24:
|
||||
hourvalue = 23
|
||||
if pieceunit == 'd':
|
||||
trankingdistances.append(value)
|
||||
else:
|
||||
dateform = DateRangeForm(initial={
|
||||
'startdate': startdate,
|
||||
'enddate': enddate,
|
||||
})
|
||||
deltaform = DeltaDaysForm()
|
||||
|
||||
trankingdurations.append(datetime.time(
|
||||
minute=minutevalue,
|
||||
hour=hourvalue,
|
||||
second=tvalue
|
||||
))
|
||||
else:
|
||||
form = PredictedPieceForm()
|
||||
dateform = DateRangeForm(initial={
|
||||
'startdate': startdate,
|
||||
'enddate': enddate,
|
||||
})
|
||||
deltaform = DeltaDaysForm()
|
||||
workouttypeform = OteWorkoutTypeForm()
|
||||
workouttypes = ['rower','slides','dynamic']
|
||||
trankingdistances = rankingdistances
|
||||
trankingdurations = rankingdurations
|
||||
|
||||
# get all 2k (if any) - this rower, in date range
|
||||
try:
|
||||
@@ -4653,7 +4627,6 @@ def oterankings_view(request,theuser=0,
|
||||
# test to fix bug
|
||||
startdate = datetime.datetime.combine(startdate,datetime.time())
|
||||
enddate = datetime.datetime.combine(enddate,datetime.time(23,59,59))
|
||||
#enddate = enddate+datetime.timedelta(days=1)
|
||||
|
||||
|
||||
|
||||
@@ -4663,11 +4636,7 @@ def oterankings_view(request,theuser=0,
|
||||
|
||||
theworkouts = Workout.objects.filter(
|
||||
user=r,rankingpiece=True,
|
||||
workouttype__in=[
|
||||
'rower',
|
||||
'dynamic',
|
||||
'slides'
|
||||
],
|
||||
workouttype__in=workouttypes,
|
||||
startdatetime__gte=startdate,
|
||||
startdatetime__lte=enddate
|
||||
).order_by("-startdatetime")
|
||||
@@ -4754,34 +4723,14 @@ def oterankings_view(request,theuser=0,
|
||||
message = ""
|
||||
|
||||
|
||||
if request.method == 'POST' and "piece" in request.POST:
|
||||
form = PredictedPieceForm(request.POST)
|
||||
clean = form.is_valid()
|
||||
value = form.cleaned_data['value']
|
||||
hourvalue,tvalue = divmod(value,60)
|
||||
hourvalue = int(hourvalue)
|
||||
minutevalue = int(tvalue)
|
||||
tvalue = int(60*(tvalue-minutevalue))
|
||||
if hourvalue >= 24:
|
||||
hourvalue = 23
|
||||
pieceunit = form.cleaned_data['pieceunit']
|
||||
if pieceunit == 'd':
|
||||
rankingdistances.append(value)
|
||||
else:
|
||||
rankingdurations.append(datetime.time(
|
||||
minute=minutevalue,
|
||||
hour=hourvalue,
|
||||
second=tvalue
|
||||
))
|
||||
else:
|
||||
form = PredictedPieceForm()
|
||||
|
||||
|
||||
|
||||
cpredictions = []
|
||||
|
||||
|
||||
|
||||
for rankingduration in rankingdurations:
|
||||
for rankingduration in trankingdurations:
|
||||
t = 3600.*rankingduration.hour
|
||||
t += 60.*rankingduration.minute
|
||||
t += rankingduration.second
|
||||
@@ -4828,7 +4777,7 @@ def oterankings_view(request,theuser=0,
|
||||
|
||||
paulslope = 5.
|
||||
|
||||
for rankingdistance in rankingdistances:
|
||||
for rankingdistance in trankingdistances:
|
||||
|
||||
delta = paulslope * np.log(rankingdistance/distance_10)/np.log(2)
|
||||
|
||||
@@ -4880,12 +4829,6 @@ def oterankings_view(request,theuser=0,
|
||||
|
||||
# del form.fields["pieceunit"]
|
||||
|
||||
startdatestring = startdate.strftime('%Y-%m-%d')
|
||||
enddatestring = enddate.strftime('%Y-%m-%d')
|
||||
request.session['startdate'] = startdatestring
|
||||
request.session['enddate'] = enddatestring
|
||||
|
||||
|
||||
|
||||
messages.error(request,message)
|
||||
return render(request, 'oterankings.html',
|
||||
@@ -4898,7 +4841,7 @@ def oterankings_view(request,theuser=0,
|
||||
'avgpower':avgpower,
|
||||
'form':form,
|
||||
'dateform':dateform,
|
||||
'deltaform':deltaform,
|
||||
'workouttypeform':workouttypeform,
|
||||
'id': theuser,
|
||||
'theuser':uu,
|
||||
'startdate':startdate,
|
||||
|
||||
@@ -992,7 +992,7 @@ a.wh:hover {
|
||||
|
||||
.pandastable tbody {
|
||||
display: block;
|
||||
height: 300px;
|
||||
height: 1200px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user