From a562fc3f640a7102d0b5641bd0a38cbd55e7820e Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 9 Nov 2018 09:09:32 +0100 Subject: [PATCH 1/4] addmanual added to menu --- rowers/plannedsessions.py | 14 ++++++-- rowers/templates/menu_workouts.html | 3 ++ rowers/templates/rankings.html | 2 +- rowers/urls.py | 2 +- rowers/views.py | 55 +++++++++++++++-------------- 5 files changed, 46 insertions(+), 30 deletions(-) diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 561904b5..ec66e7e2 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -400,12 +400,22 @@ def remove_rower_session(r,ps): return 1 -def get_dates_timeperiod(timeperiod,startdatestring='',enddatestring=''): +def get_dates_timeperiod(request,startdatestring='',enddatestring=''): # set start end date according timeperiod + timeperiod = request.GET.get('when') + if not timeperiod: timeperiod = 'thisweek' - + + startdatestring = request.GET.get('startdate') + enddatestring = request.GET.get('enddate') + + if startdate and enddate: + startdate = dt.datetime.strptime(startdatestring,'%Y-%m-%d').date() + enddate = dt.datetime.strptime(enddatestring,'%Y-%m-%d').date() + return startdate,enddate + daterangetester = re.compile('^(\d+-\d+-\d+)\/(\d+-\d+-\d+)') if timeperiod=='today': diff --git a/rowers/templates/menu_workouts.html b/rowers/templates/menu_workouts.html index 16f5345f..32b999a1 100644 --- a/rowers/templates/menu_workouts.html +++ b/rowers/templates/menu_workouts.html @@ -14,6 +14,9 @@
  •  Upload
  • +
  • +  Add manual entry +
  • {% if user|is_promember %} diff --git a/rowers/templates/rankings.html b/rowers/templates/rankings.html index 0a533016..bfffd7e4 100644 --- a/rowers/templates/rankings.html +++ b/rowers/templates/rankings.html @@ -96,7 +96,7 @@

    Want to add race results but you don't have stroke data? - Click here.

    + Click here.

    Scroll down for the chart and pace predictions for ranking pieces.

    diff --git a/rowers/urls.py b/rowers/urls.py index 0807ffef..b17568ad 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -154,7 +154,7 @@ urlpatterns = [ url(r'^list-workouts/$',views.workouts_view), url(r'^list-courses/$',views.courses_view), url(r'^courses/upload$',views.course_upload_view), - url(r'^addmanual/$',views.addmanual_view), + url(r'^workout/addmanual/$',views.addmanual_view), url(r'^team-compare-select/workout/(?P\d+)/team/(?P\d+)/user/(?P\d+)/$',views.team_comparison_select), url(r'^team-compare-select/team/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)/user/(?P\d+)/$',views.team_comparison_select), url(r'^team-compare-select/team/(?P\d+)/(?P\d+-\d+-\d+)/(?P\d+-\d+-\d+)$',views.team_comparison_select), diff --git a/rowers/views.py b/rowers/views.py index c4ec2766..7efff095 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -13961,8 +13961,8 @@ def plannedsession_multiclone_view( r = getrequestrower(request,userid=userid) - when = request.GET.get('when') - startdate,enddate = get_dates_timeperiod(when) + + startdate,enddate = get_dates_timeperiod(request) if request.method == 'POST' and 'daterange' in request.POST: @@ -14088,8 +14088,8 @@ def plannedsession_create_view(request, - when = request.GET.get('when') - startdate,enddate = get_dates_timeperiod(when,startdatestring=startdatestring, + + startdate,enddate = get_dates_timeperiod(request,startdatestring=startdatestring, enddatestring=enddatestring) @@ -14217,8 +14217,8 @@ def plannedsession_multicreate_view(request, r = getrequestrower(request,userid=userid) - when = request.GET.get('when') - startdate,enddate = get_dates_timeperiod(when) + + startdate,enddate = get_dates_timeperiod(request) try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, @@ -14319,7 +14319,7 @@ def plannedsession_teamcreate_view(request, therower = getrequestrower(request,userid=userid) - when = request.GET.get('when') + teams = Team.objects.filter(manager=request.user) if len(teams)>0: @@ -14330,7 +14330,7 @@ def plannedsession_teamcreate_view(request, url = reverse(rower_teams_view) return HttpResponseRedirect(url) - startdate,enddate = get_dates_timeperiod(when) + startdate,enddate = get_dates_timeperiod(request) trainingplan = None @@ -14466,7 +14466,7 @@ def plannedsession_teamedit_view(request, r = getrequestrower(request,userid=userid) - when = request.GET.get('when') + try: ps = PlannedSession.objects.get(id=sessionid) @@ -14480,7 +14480,7 @@ def plannedsession_teamedit_view(request, teaminitial = ps.team.all() - startdate,enddate = get_dates_timeperiod(when) + startdate,enddate = get_dates_timeperiod(request) try: trainingplan = TrainingPlan.objects.filter( @@ -14614,9 +14614,9 @@ def plannedsessions_coach_view(request, therower = getrower(request.user) - when = request.GET.get('when') + - startdate,enddate = get_dates_timeperiod(when) + startdate,enddate = get_dates_timeperiod(request) trainingplan = None @@ -14714,9 +14714,11 @@ def plannedsessions_view(request, pass - when = request.GET.get('when') - startdate,enddate = get_dates_timeperiod(when,startdatestring=startdatestring, - enddatestring=enddatestring) + + startdate,enddate = get_dates_timeperiod( + request, + startdatestring=startdatestring, + enddatestring=enddatestring) try: trainingplan = TrainingPlan.objects.filter( @@ -14777,9 +14779,9 @@ def plannedsessions_print_view(request,userid=0): r = getrequestrower(request,userid=userid) - when = request.GET.get('when') + - startdate,enddate = get_dates_timeperiod(when) + startdate,enddate = get_dates_timeperiod(request) try: trainingplan = TrainingPlan.objects.filter( @@ -14817,11 +14819,11 @@ def plannedsessions_manage_view(request,userid=0, if request.is_ajax(): is_ajax = True - when = request.GET.get('when') + r = getrequestrower(request,userid=userid) - startdate,enddate = get_dates_timeperiod(when) + startdate,enddate = get_dates_timeperiod(request) try: trainingplan = TrainingPlan.objects.filter( @@ -14969,13 +14971,13 @@ def plannedsession_clone_view(request,id=0,userid=0): r = getrequestrower(request,userid=userid) - when = request.GET.get('when') + if when: timeperiod = when else: timeperiod = 'thisweek' - startdate,enddate = get_dates_timeperiod(when) + startdate,enddate = get_dates_timeperiod(request) try: trainingplan = TrainingPlan.objects.filter( @@ -15033,13 +15035,13 @@ def plannedsession_edit_view(request,id=0,userid=0): r = getrequestrower(request,userid=userid) - when = request.GET.get('when') + if when: timeperiod = when else: timeperiod = 'thisweek' - startdate,enddate = get_dates_timeperiod(when) + startdate,enddate = get_dates_timeperiod(request) try: @@ -15150,7 +15152,7 @@ def plannedsession_view(request,id=0,userid=0): r = getrequestrower(request,userid=userid) - when = request.GET.get('when') + try: ps = PlannedSession.objects.get(id=id) @@ -15258,7 +15260,7 @@ def plannedsession_view(request,id=0,userid=0): # if coursetest, need to reorder the ranking - startdate,enddate = get_dates_timeperiod(when) + startdate,enddate = get_dates_timeperiod(request) try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, @@ -16593,9 +16595,10 @@ def rower_trainingplan_view(request, thismacroid=0, thismesoid=0): + when = request.GET.get('when') if when: - startdate,enddate = get_dates_timeperiod(when) + startdate,enddate = get_dates_timeperiod(request) else: startdate = datetime.date.today() From a376c079c7495d441779cc7078e7a6a85a162ca6 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 9 Nov 2018 12:10:56 +0100 Subject: [PATCH 2/4] improved manual entry form --- rowers/dataprep.py | 38 ++++++++++++++++++---------- rowers/forms.py | 6 ++++- rowers/models.py | 2 +- rowers/templates/manualadd.html | 3 ++- rowers/views.py | 44 ++++++++++++++++++++++++++++----- 5 files changed, 71 insertions(+), 22 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 2422a9b9..83cf6b15 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -738,7 +738,10 @@ def fetchcp(rower,theworkouts,table='cpdata'): # 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,11 +754,14 @@ def create_row_df(r,distance,duration,startdatetime,workouttype='rower'): totalseconds += duration.second totalseconds += duration.microsecond/1.e6 - try: - spm = 60.*nr_strokes/totalseconds - except ZeroDivisionError: - spm = 20. - + if not avgspm: + try: + spm = 60.*nr_strokes/totalseconds + except ZeroDivisionError: + spm = 20. + else: + spm = avgspm + step = totalseconds/float(nr_strokes) elapsed = np.arange(nr_strokes)*totalseconds/(float(nr_strokes-1)) @@ -774,9 +780,15 @@ def create_row_df(r,distance,duration,startdatetime,workouttype='rower'): except ZeroDivisionError: velo = 2.4 power = 2.8*velo**3 + elif avgpwr is not None: + power = avgpwr else: power = 0 + if avghr is not None: + hr = avghr + else: + hr = 0 df = pd.DataFrame({ 'TimeStamp (sec)': unixtime, @@ -785,6 +797,7 @@ def create_row_df(r,distance,duration,startdatetime,workouttype='rower'): ' Stroke500mPace (sec/500m)':pace, ' ElapsedTime (sec)':elapsed, ' Power (watts)':power, + ' HRCur (bpm)':hr, }) 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) id, message = save_workout_database(csvfilename, r, -# title=title, -# notes=notes, + title=title, + notes=notes, + rankingpiece=rankingpiece, dosmooth=False, -# workouttype=workouttype, + workouttype=workouttype, consistencychecks=False, totaltime=totalseconds) @@ -814,6 +828,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', dosummary=True, title='Workout', workoutsource='unknown', notes='', totaldist=0, totaltime=0, + rankingpiece=False, summary='', makeprivate=False, oarlength=2.89, inboard=0.88, @@ -1000,6 +1015,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', weightcategory=r.weightcategory, starttime=workoutstarttime, workoutsource=workoutsource, + rankingpiece=rankingpiece, forceunit=forceunit, csvfilename=f2, notes=notes, summary=summary, maxhr=maxhr, averagehr=averagehr, @@ -1014,10 +1030,6 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', w.startdatetime = timezone.now() w.save() - if is_ranking_piece(w): - w.rankingpiece = True - w.save() - if privacy == 'visible': ts = Team.objects.filter(rower=r) for t in ts: diff --git a/rowers/forms.py b/rowers/forms.py index 8a07fa23..d470ab2a 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -30,7 +30,11 @@ class EmailForm(forms.Form): botcheck = forms.CharField(max_length=5) 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 class CNsummaryForm(forms.Form): diff --git a/rowers/models.py b/rowers/models.py index 93a1e9cd..1db6d745 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2067,7 +2067,7 @@ class Workout(models.Model): user = models.ForeignKey(Rower) team = models.ManyToManyField(Team,blank=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() workouttype = models.CharField(choices=workouttypes,max_length=50, verbose_name='Exercise/Boat Class') diff --git a/rowers/templates/manualadd.html b/rowers/templates/manualadd.html index be698545..f1baf6f2 100644 --- a/rowers/templates/manualadd.html +++ b/rowers/templates/manualadd.html @@ -36,7 +36,7 @@ $('#id_workouttype').change(); {% endblock %} {% block main %} -

    Add Workout Manually

    +

    Add Manual Workout Entry

    • {% if form.errors %} @@ -49,6 +49,7 @@ $('#id_workouttype').change(); enctype="multipart/form-data" action="" method="post"> {{ form.as_table }} + {{ metricsform.as_table }}
      {% csrf_token %}

      diff --git a/rowers/views.py b/rowers/views.py index 7efff095..47b71963 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -49,6 +49,7 @@ from rowers.forms import ( VirtualRaceSelectForm,WorkoutRaceSelectForm,CourseSelectForm, RaceResultFilterForm,PowerIntervalUpdateForm,FlexAxesForm, FlexOptionsForm,DataFrameColumnsForm,OteWorkoutTypeForm, + MetricsForm, ) from django.core.urlresolvers import reverse, reverse_lazy @@ -3294,12 +3295,26 @@ def histo(request,theuser=0, def addmanual_view(request): 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': # Form was submitted form = WorkoutForm(request.POST) - if form.is_valid(): + metricsform = MetricsForm(request.POST) + if form.is_valid() and metricsform.is_valid(): # Get values from form name = form.cleaned_data['name'] + if name == '': + name = 'Manual Entry' date = form.cleaned_data['date'] starttime = form.cleaned_data['starttime'] workouttype = form.cleaned_data['workouttype'] @@ -3309,6 +3324,9 @@ def addmanual_view(request): notes = form.cleaned_data['notes'] thetimezone = form.cleaned_data['timezone'] private = form.cleaned_data['private'] + avghr = metricsform.cleaned_data['avghr'] + avgpwr = metricsform.cleaned_data['avgpwr'] + avgspm = metricsform.cleaned_data['avgspm'] try: boattype = request.POST['boattype'] except KeyError: @@ -3336,12 +3354,17 @@ def addmanual_view(request): ) + id,message = dataprep.create_row_df(r, distance, -# weightcategory, duration,startdatetime, -# title = name, -# notes=notes, + weightcategory=weightcategory, + avghr=avghr, + rankingpiece=rankingpiece, + avgpwr=avgpwr, + avgspm=avgspm, + title = name, + notes=notes, workouttype=workouttype) @@ -3351,7 +3374,7 @@ def addmanual_view(request): if id: w = Workout.objects.get(id=id) - w.rankingpiece = rankingpiece or is_ranking_piece(w) + w.rankingpiece = rankingpiece w.privacy = privacy w.weightcategory = weightcategory w.notes = notes @@ -3360,7 +3383,13 @@ def addmanual_view(request): w.boattype = boattype w.save() messages.info(request,'New workout created') - + else: + return render(request,'manualadd.html', + {'form':form, + 'metricsform':metricsform, + 'breadcrumbs':breadcrumbs, + 'active':'nav-workouts', + }) initial = { 'workouttype':'rower', @@ -3372,9 +3401,12 @@ def addmanual_view(request): } form = WorkoutForm(initial=initial) + metricsform = MetricsForm() return render(request,'manualadd.html', {'form':form, + 'metricsform':metricsform, + 'breadcrumbs':breadcrumbs, 'active':'nav-workouts', }) From 4955ee8692a3ac857cb295b7df18cca17bf03f30 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 9 Nov 2018 12:57:38 +0100 Subject: [PATCH 3/4] date selector works on plannedsessions --- rowers/dataprep.py | 1 + rowers/dataprepnodjango.py | 3 + rowers/middleware.py | 1 + rowers/plannedsessions.py | 3 +- rowers/templates/menu_plan.html | 56 ----- rowers/templates/plannedsessions.html | 341 ++++++++++++++------------ rowers/views.py | 9 + 7 files changed, 194 insertions(+), 220 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 83cf6b15..7d12f7f7 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1040,6 +1040,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', barchart=True, otwpower=True, empower=True, inboard=inboard) rscore,normp = workout_rscore(w) + trimp,hrtss = workout_trimp(w) isbreakthrough = False ishard = False diff --git a/rowers/dataprepnodjango.py b/rowers/dataprepnodjango.py index b164fbb1..da384fbd 100644 --- a/rowers/dataprepnodjango.py +++ b/rowers/dataprepnodjango.py @@ -853,6 +853,9 @@ def update_agegroup_db(age,sex,weightcategory,wcdurations,wcpower, delete_agegroup_db(age,sex,weightcategory,debug=debug) + wcdurations = [None if type(y) is float and np.isnan(y) else y for y in wcdurations] + wcpower = [None if type(y) is float and np.isnan(y) else y for y in wcpower] + df = pd.DataFrame( { 'duration':wcdurations, diff --git a/rowers/middleware.py b/rowers/middleware.py index 9a44b7fe..736af9c0 100644 --- a/rowers/middleware.py +++ b/rowers/middleware.py @@ -1,3 +1,4 @@ + from django.utils import timezone from rowers.models import Workout, PowerTimeFitnessMetric, Rower import datetime diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index ec66e7e2..9704b281 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -30,6 +30,7 @@ import numpy as np import dataprep import courses import iso8601 +from iso8601 import ParseError from rowers.tasks import handle_check_race_course def get_todays_micro(plan,thedate=date.today()): @@ -411,7 +412,7 @@ def get_dates_timeperiod(request,startdatestring='',enddatestring=''): startdatestring = request.GET.get('startdate') enddatestring = request.GET.get('enddate') - if startdate and enddate: + if startdatestring and enddatestring: startdate = dt.datetime.strptime(startdatestring,'%Y-%m-%d').date() enddate = dt.datetime.strptime(enddatestring,'%Y-%m-%d').date() return startdate,enddate diff --git a/rowers/templates/menu_plan.html b/rowers/templates/menu_plan.html index 8e8fbd43..83b6b01c 100644 --- a/rowers/templates/menu_plan.html +++ b/rowers/templates/menu_plan.html @@ -82,62 +82,6 @@

       

      - {% if user.is_authenticated and user|is_manager %} diff --git a/rowers/templates/plannedsessions.html b/rowers/templates/plannedsessions.html index 41c18019..2055d467 100644 --- a/rowers/templates/plannedsessions.html +++ b/rowers/templates/plannedsessions.html @@ -8,170 +8,185 @@

      Planned Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}

      -{% if plannedsessions %} -

      - Click on session name to view, edit to change the session and on the - traffic light symbol to add workouts to the session -

      - - - - - - - - - - - - - - - - - - {% for ps in plannedsessions %} - - - - - - - - - - - - {% if completeness|lookup:ps.id == 'partial' %} - - {% else %} - +
        +
      • +

        +
        +

      StatusOn or AfterOn or BeforeNameTypeModeEditPlannedActual Completion Date -
      - {% if completeness|lookup:ps.id == 'not done' %} - {% if ps.sessiontype != 'race' %} - -   - {% else %} -   - {% endif %} - {% elif completeness|lookup:ps.id == 'completed' %} - {% if ps.sessiontype != 'race' %} -   - {% else %} -   - {% endif %} - {% elif completeness|lookup:ps.id == 'partial' %} - {% if ps.sessiontype != 'race' %} -   - {% else %} -   - {% endif %} - {% else %} - {% if ps.sessiontype != 'race' %} -   - {% else %} -   - {% endif %} - {% endif %} - {{ ps.startdate|date:"Y-m-d" }} {{ ps.enddate|date:"Y-m-d" }} - {% if ps.sessiontype != 'race' %} - {% if ps.name != '' %} - {{ ps.name }} - {% else %} - Unnamed Session - {% endif %} - {% else %} - {% if ps.name != '' %} - {{ ps.name }} - {% else %} - Unnamed Race - {% endif %} - {% endif %} - {{ ps.get_sessiontype_display }} {{ ps.get_sessionmode_display }} - {% if ps.manager == request.user %} - Edit - {% else %} -   - {% endif %} - {{ ps.sessionvalue }} {{ actualvalue|lookup:ps.id }} {{ ps.sessionunit }} {{ completiondate|lookup:ps.id|date:"Y-m-d" }} {{ completiondate|lookup:ps.id|date:"Y-m-d" }}
      + {{ dateform.as_table }} +
      + + +

      +
    • +
    • + {% if plannedsessions %} +

      + Click on session name to view, edit to change the session and on the + traffic light symbol to add workouts to the session +

      + + + + + + + + + + + + + + + + + + {% for ps in plannedsessions %} + + + + + + + + + + + + {% if completeness|lookup:ps.id == 'partial' %} + + {% else %} + + {% endif %} + + {% endfor %} + +
      StatusOn or AfterOn or BeforeNameTypeModeEditPlannedActual Completion Date +
      + {% if completeness|lookup:ps.id == 'not done' %} + {% if ps.sessiontype != 'race' %} + +   + {% else %} +   + {% endif %} + {% elif completeness|lookup:ps.id == 'completed' %} + {% if ps.sessiontype != 'race' %} +   + {% else %} +   + {% endif %} + {% elif completeness|lookup:ps.id == 'partial' %} + {% if ps.sessiontype != 'race' %} +   + {% else %} +   + {% endif %} + {% else %} + {% if ps.sessiontype != 'race' %} +   + {% else %} +   + {% endif %} + {% endif %} + {{ ps.startdate|date:"Y-m-d" }} {{ ps.enddate|date:"Y-m-d" }} + {% if ps.sessiontype != 'race' %} + {% if ps.name != '' %} + {{ ps.name }} + {% else %} + Unnamed Session + {% endif %} + {% else %} + {% if ps.name != '' %} + {{ ps.name }} + {% else %} + Unnamed Race + {% endif %} + {% endif %} + {{ ps.get_sessiontype_display }} {{ ps.get_sessionmode_display }} + {% if ps.manager == request.user %} + Edit + {% else %} +   + {% endif %} + {{ ps.sessionvalue }} {{ actualvalue|lookup:ps.id }} {{ ps.sessionunit }} {{ completiondate|lookup:ps.id|date:"Y-m-d" }} {{ completiondate|lookup:ps.id|date:"Y-m-d" }}
      + {% else %} + You have no planned workouts for this period. Planned workouts are created + by your coach if you are part of a team. You can create your own + planned workouts by purchasing the "Coach" or "Self-Coach" plans. + {% endif %} +

      + + Print View +

      +
    • +
    • + {% if unmatchedworkouts %} +

      Workouts that are not linked to any session

      +

      + + + + + + + + + + + + + + + {% for workout in unmatchedworkouts %} + + + + {% if workout.user.user == user or user == team.manager %} + {% if workout.name != '' %} + + {% else %} + + {% endif %} + {% else %} + {% if workout.name != '' %} + + {% else %} + + {% endif %} + {% endif %} + + + + + + + {% endfor %} + +
      Date Time Name Type Distance Duration Avg HR Max HR
      {{ workout.date|date:"Y-m-d" }} {{ workout.starttime|date:"H:i" }} + + {{ workout.name }} + + + No Name + {{ workout.name }}No Name {{ workout.workouttype }} {{ workout.distance }}m {{ workout.duration |durationprint:"%H:%M:%S.%f" }} {{ workout.averagehr }} {{ workout.maxhr }}
      + + {% endif %} - - {% endfor %} - - -{% else %} -You have no planned workouts for this period. Planned workouts are created -by your coach if you are part of a team. You can create your own -planned workouts by purchasing the "Coach" or "Self-Coach" plans. -{% endif %} -

      - - Print View -

      -{% if unmatchedworkouts %} -

      Workouts that are not linked to any session

      -

      - - - - - - - - - - - - - - - {% for workout in unmatchedworkouts %} - - - - {% if workout.user.user == user or user == team.manager %} - {% if workout.name != '' %} - - {% else %} - - {% endif %} - {% else %} - {% if workout.name != '' %} - - {% else %} - - {% endif %} - {% endif %} - - - - - - - {% endfor %} - -
      Date Time Name Type Distance Duration Avg HR Max HR
      {{ workout.date|date:"Y-m-d" }} {{ workout.starttime|date:"H:i" }} - - {{ workout.name }} - - - No Name - {{ workout.name }}No Name {{ workout.workouttype }} {{ workout.distance }}m {{ workout.duration |durationprint:"%H:%M:%S.%f" }} {{ workout.averagehr }} {{ workout.maxhr }}
      - - - {% endif %} -

      - +

      +
    • +
    {% endblock %} diff --git a/rowers/views.py b/rowers/views.py index 47b71963..f93683a3 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -14791,6 +14791,14 @@ def plannedsessions_view(request, }, ] + initial = { + 'startdate':startdate, + 'enddate':enddate, + } + + dateform = DateRangeForm(initial=initial) + + return render(request,'plannedsessions.html', { 'teams':get_my_teams(request.user), @@ -14798,6 +14806,7 @@ def plannedsessions_view(request, 'plannedsessions':sps, 'plan':trainingplan, 'active': 'nav-plan', + 'dateform':dateform, 'rower':r, 'timeperiod':timeperiod, 'completeness':completeness, From 2f705d0aeae74cf143b714f0bcb830658be6a282 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 9 Nov 2018 14:07:18 +0100 Subject: [PATCH 4/4] all plan pages now have date range form --- .../.#plannedsessions_multiclone_select.html | 1 + .../templates/plannedsession_multicreate.html | 10 ++++ rowers/templates/plannedsessioncreate.html | 44 ++++++++------ rowers/templates/plannedsessionedit.html | 15 ++++- rowers/templates/plannedsessions.html | 2 +- .../plannedsessions_multiclone_select.html | 9 +++ rowers/templates/plannedsessionscoach.html | 9 +++ rowers/templates/plannedsessionsmanage.html | 10 ++++ .../templates/plannedsessionteamcreate.html | 10 ++++ rowers/templates/plannedsessionteamedit.html | 11 ++++ rowers/views.py | 57 +++++++++++++++++-- 11 files changed, 152 insertions(+), 26 deletions(-) create mode 100644 rowers/templates/.#plannedsessions_multiclone_select.html diff --git a/rowers/templates/.#plannedsessions_multiclone_select.html b/rowers/templates/.#plannedsessions_multiclone_select.html new file mode 100644 index 00000000..1fc71768 --- /dev/null +++ b/rowers/templates/.#plannedsessions_multiclone_select.html @@ -0,0 +1 @@ +E408191@CZ27LT9RCGN72.15176:1541580768 \ No newline at end of file diff --git a/rowers/templates/plannedsession_multicreate.html b/rowers/templates/plannedsession_multicreate.html index c445b54b..03716395 100644 --- a/rowers/templates/plannedsession_multicreate.html +++ b/rowers/templates/plannedsession_multicreate.html @@ -8,6 +8,16 @@

    Create Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}

      +
    • +

      +

      + + {{ dateform.as_table }} +
      + +
      +

      +
    • On this page, you can create and edit sessions for an entire time diff --git a/rowers/templates/plannedsessioncreate.html b/rowers/templates/plannedsessioncreate.html index a47cbfe2..1e7b0900 100644 --- a/rowers/templates/plannedsessioncreate.html +++ b/rowers/templates/plannedsessioncreate.html @@ -8,8 +8,34 @@

      Create Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}

      {{ timeperiod }}

      +

      +

      + + {{ dateform.as_table }} +
      + +
      +

        +
      • +

        New Session

        +
        + {% if form.errors %} +

        + Please correct the error{{ form.errors|pluralize }} below. +

        + {% endif %} + + + {{ form.as_table }} +
        + {% csrf_token %} + +
        +
        +
      • Plan

        @@ -59,24 +85,6 @@

      • -
      • -

        New Session

        -
        - {% if form.errors %} -

        - Please correct the error{{ form.errors|pluralize }} below. -

        - {% endif %} - - - {{ form.as_table }} -
        - {% csrf_token %} - -
        -
        -
      {% endblock %} diff --git a/rowers/templates/plannedsessionedit.html b/rowers/templates/plannedsessionedit.html index af68b856..edb574c7 100644 --- a/rowers/templates/plannedsessionedit.html +++ b/rowers/templates/plannedsessionedit.html @@ -6,16 +6,27 @@ {% block main %}

      Edit Session

      -{% if user.is_authenticated and user|is_manager %} -{% endif %} + +

      +

      + + {{ dateform.as_table }} +
      + +
      +

      + +
      • {{ thesession.name }}

        + {% if user.is_authenticated and user|is_manager %}

        Assign to my Teams

        + {% endif %}
        {% if form.errors %}

        diff --git a/rowers/templates/plannedsessions.html b/rowers/templates/plannedsessions.html index 2055d467..b2f0fdca 100644 --- a/rowers/templates/plannedsessions.html +++ b/rowers/templates/plannedsessions.html @@ -15,7 +15,7 @@ {{ dateform.as_table }}
        - +

      • diff --git a/rowers/templates/plannedsessions_multiclone_select.html b/rowers/templates/plannedsessions_multiclone_select.html index 7dd17c53..e39e9037 100644 --- a/rowers/templates/plannedsessions_multiclone_select.html +++ b/rowers/templates/plannedsessions_multiclone_select.html @@ -66,6 +66,15 @@

        Clone Multiple Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}

        +

        +

        + + {{ dateform.as_table }} +
        + +
        +

        +
          diff --git a/rowers/templates/plannedsessionscoach.html b/rowers/templates/plannedsessionscoach.html index c4416ec4..8e552d9a 100644 --- a/rowers/templates/plannedsessionscoach.html +++ b/rowers/templates/plannedsessionscoach.html @@ -11,6 +11,15 @@

          Coach Overview

          {% endif %} +

          + + + {{ dateform.as_table }} +
          + +

          +

          + diff --git a/rowers/templates/plannedsessionsmanage.html b/rowers/templates/plannedsessionsmanage.html index 35311a35..eb551dc8 100644 --- a/rowers/templates/plannedsessionsmanage.html +++ b/rowers/templates/plannedsessionsmanage.html @@ -19,6 +19,16 @@ {% block main %}

          Manage Plan Execution for {{ rower.user.first_name }} {{ rower.user.last_name }}

          +

          +
          +

          + {{ dateform.as_table }} +
          + + +

          + +

          Select one session on the left, and one or more workouts on the right to match the workouts to the session. For tests and training sessions, the selected workouts must be done on the same date. For all sessions, diff --git a/rowers/templates/plannedsessionteamcreate.html b/rowers/templates/plannedsessionteamcreate.html index 69f0f2fe..0a437804 100644 --- a/rowers/templates/plannedsessionteamcreate.html +++ b/rowers/templates/plannedsessionteamcreate.html @@ -7,6 +7,16 @@ {% block main %}

          Create Team Session

          +

          +

          + + {{ dateform.as_table }} +
          + +
          +

          + +
          {% if form.errors %}

          diff --git a/rowers/templates/plannedsessionteamedit.html b/rowers/templates/plannedsessionteamedit.html index a01f5c74..e36ebf79 100644 --- a/rowers/templates/plannedsessionteamedit.html +++ b/rowers/templates/plannedsessionteamedit.html @@ -6,6 +6,17 @@ {% block main %}

          Edit Team Session

          + +

          + + + {{ dateform.as_table }} +
          + +

          +

          + +
          {% if form.errors %}

          diff --git a/rowers/views.py b/rowers/views.py index f93683a3..009f2bc8 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -14091,6 +14091,11 @@ def plannedsession_multiclone_view( 'name': 'Clone Multiple Sessions' } ] + + dateform = DateRangeForm(initial={ + 'startdate':startdate, + 'enddate':enddate, + }) return render(request, 'plannedsessions_multiclone_select.html', {'plannedsessions':sps, @@ -14227,11 +14232,17 @@ def plannedsession_create_view(request, trainingplan = None timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') + + dateform = DateRangeForm(initial={ + 'startdate':startdate, + 'enddate':enddate, + }) return render(request,'plannedsessioncreate.html', { 'teams':get_my_teams(request.user), 'plan':trainingplan, + 'dateform':dateform, 'form':sessioncreateform, 'active':'nav-plan', 'plannedsessions':sps, @@ -14330,17 +14341,24 @@ def plannedsession_multicreate_view(request, } ] + dateform = DateRangeForm(initial={ + 'startdate':startdate, + 'enddate':enddate + }) + context = { 'ps_formset':ps_formset, 'breadcrumbs':breadcrumbs, 'rower':r, 'active':'nav-plan', + 'dateform':dateform, 'plan':trainingplan, 'timeperiod':timeperiod, 'teams':get_my_teams(request.user), 'extrasessions': extrasessions+1 } + return render(request,'plannedsession_multicreate.html',context) # Manager creates sessions for entire team @@ -14476,11 +14494,17 @@ def plannedsession_teamcreate_view(request, 'name': 'Add Team Session' } ] + + dateform = DateRangeForm(initial={ + 'startdate':startdate, + 'enddate':enddate, + }) return render(request,'plannedsessionteamcreate.html', { 'teams':get_my_teams(request.user), 'plan':trainingplan, + 'dateform':dateform, 'breadcrumbs':breadcrumbs, 'form':sessioncreateform, 'teamform':sessionteamselectform, @@ -14621,12 +14645,17 @@ def plannedsession_teamedit_view(request, 'name': 'Add Team Session' } ] - + + dateform = DateRangeForm(initial={ + 'startdate':startdate, + 'enddate':enddate, + }) return render(request,'plannedsessionteamedit.html', { 'plannedsession':ps, 'plan':trainingplan, + 'dateform':dateform, 'breadcrumbs':breadcrumbs, 'rower':r, 'active':'nav-plan', @@ -14710,6 +14739,11 @@ def plannedsessions_coach_view(request, } ] + dateform = DateRangeForm(initial={ + 'startdate':startdate, + 'enddate':enddate, + }) + return render(request,'plannedsessionscoach.html', { 'myteams':myteams, @@ -14717,6 +14751,7 @@ def plannedsessions_coach_view(request, 'breadcrumbs':breadcrumbs, 'plan':trainingplan, 'statusdict':statusdict, + 'dateform':dateform, 'timeperiod':timeperiod, 'rowers':rowers, 'rower':therower, @@ -14987,11 +15022,19 @@ def plannedsessions_manage_view(request,userid=0, 'name': 'Link Sessions to Workouts' }, ] + timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') + + dateform = DateRangeForm(initial={ + 'startdate':startdate, + 'enddate':enddate, + }) + return render(request,'plannedsessionsmanage.html', { 'teams':get_my_teams(request.user), 'plan':trainingplan, + 'dateform':dateform, 'plannedsessions':sps, 'workouts':ws, 'active':'nav-plan', @@ -15077,10 +15120,6 @@ def plannedsession_edit_view(request,id=0,userid=0): r = getrequestrower(request,userid=userid) - if when: - timeperiod = when - else: - timeperiod = 'thisweek' startdate,enddate = get_dates_timeperiod(request) @@ -15172,6 +15211,13 @@ def plannedsession_edit_view(request,id=0,userid=0): } ] + + dateform = DateRangeForm(initial={ + 'startdate':startdate, + 'enddate':enddate, + }) + + timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') return render(request,'plannedsessionedit.html', { @@ -15182,6 +15228,7 @@ def plannedsession_edit_view(request,id=0,userid=0): 'active':'nav-plan', 'plannedsessions':sps, 'thesession':ps, + 'dateform':dateform, 'rower':r, 'timeperiod':timeperiod, })