diff --git a/rowers/forms.py b/rowers/forms.py index 3a086e4c..834494fb 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -288,6 +288,20 @@ class WorkoutSplitForm(forms.Form): # 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'), @@ -318,13 +332,33 @@ class PredictedPieceForm(forms.Form): 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, initial='t',label='Unit') 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 = ( diff --git a/rowers/templates/oterankings.html b/rowers/templates/oterankings.html index 2a0bc4fb..68f3e313 100644 --- a/rowers/templates/oterankings.html +++ b/rowers/templates/oterankings.html @@ -53,6 +53,10 @@ {{ form.as_table }}
+

Workout Type

+ + {{ workouttypeform.as_p }} +
{% csrf_token %} @@ -109,10 +113,6 @@
  • Pace predictions for Ranking Pieces

    -

    Add non-ranking piece using the form. The piece will be added in the prediction tables below.

    - - - diff --git a/rowers/templates/otwrankings.html b/rowers/templates/otwrankings.html index dd56f3c4..5ca5321e 100644 --- a/rowers/templates/otwrankings.html +++ b/rowers/templates/otwrankings.html @@ -50,6 +50,10 @@
    {{ dateform.as_table }}
    +

    Pieces used for predictions

    + + {{ form.as_table }} +
    {% csrf_token %} @@ -138,17 +142,6 @@
  • -
  • -
    - {{ form.value }} {{ form.pieceunit }} - - {% csrf_token %} - minutes - -
    -
  • diff --git a/rowers/views.py b/rowers/views.py index 0762b6cf..00fd1659 100644 --- a/rowers/views.py +++ b/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, @@ -4594,36 +4567,45 @@ def oterankings_view(request,theuser=0, s = enddate enddate = startdate startdate = s + workouttypeform = OteWorkoutTypeForm(request.POST) + if workouttypeform.is_valid(): + workouttypes = workouttypeform.cleaned_data['workouttypes'] form = PredictedPieceForm(request.POST) - clean = form.is_valid() - value = form.cleaned_data['value'] + 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 ] - 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': - trankingdistances.append(value) - else: - trankingdurations.append(datetime.time( - minute=minutevalue, - hour=hourvalue, - second=tvalue - )) + 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: + trankingdurations.append(datetime.time( + minute=minutevalue, + hour=hourvalue, + second=tvalue + )) else: form = PredictedPieceForm() dateform = DateRangeForm(initial={ 'startdate': startdate, 'enddate': enddate, }) + workouttypeform = OteWorkoutTypeForm() + workouttypes = ['rower','slides','dynamic'] trankingdistances = rankingdistances trankingdurations = rankingdurations @@ -4654,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") @@ -4863,6 +4841,7 @@ def oterankings_view(request,theuser=0, 'avgpower':avgpower, 'form':form, 'dateform':dateform, + 'workouttypeform':workouttypeform, 'id': theuser, 'theuser':uu, 'startdate':startdate,