From aa40c6e725fe1920e8f8398fa221b4a606fa17b5 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 15 Aug 2023 09:05:10 +0200 Subject: [PATCH] adding better rscore calc from power zone --- rowers/forms.py | 4 +++- rowers/models.py | 2 +- rowers/plannedsessions.py | 8 ++++++-- rowers/templates/instantplan.html | 3 +++ rowers/utils.py | 10 +++++++--- rowers/views/planviews.py | 20 ++++++++++++++++++-- rowers/views/statements.py | 2 +- 7 files changed, 39 insertions(+), 10 deletions(-) diff --git a/rowers/forms.py b/rowers/forms.py index 542f7cba..3cafb247 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -991,7 +991,9 @@ class SessionDateShiftForm(forms.Form): class DeltaDaysForm(forms.Form): deltadays = forms.IntegerField(initial=7, required=False, label='') - +class PlanByRscoreForm(forms.Form): + byrscore = forms.BooleanField(initial=False, required=False, label='plan by rScore') + class RegistrationForm(UserCreationForm): """ Form for registering a new user account. diff --git a/rowers/models.py b/rowers/models.py index e4e0cfe9..63da2915 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2813,7 +2813,7 @@ class PlannedSession(models.Model): self.sessionvalue = self.approximate_duration elif self.sessionmode == 'distance': # pragma: no cover self.sessionvalue = self.approximate_distance - elif self.sessionmode == 'rscore': # pragma: no cover + elif self.sessionmode == 'rScore': # pragma: no cover self.sessionvalue = self.approximate_rscore super(PlannedSession, self).save(*args, **kwargs) diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 1b52f280..8b795e05 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -1063,7 +1063,7 @@ def get_workouts_session(r, ps): return ws -def create_sessions_from_json(plansteps, rower, startdate, manager): +def create_sessions_from_json(plansteps, rower, startdate, manager, planbyrscore=False): trainingdays = plansteps['trainingDays'] planstartdate = startdate for day in trainingdays: @@ -1076,6 +1076,10 @@ def create_sessions_from_json(plansteps, rower, startdate, manager): preferreddate = planstartdate+timedelta(days=day['order']) + sessionmode = 'time' + if planbyrscore: + sessionmode = 'rScore' + ps = PlannedSession( startdate=preferreddate - timedelta(days=preferreddate.weekday()), @@ -1086,7 +1090,7 @@ def create_sessions_from_json(plansteps, rower, startdate, manager): name=workout['workoutName'], steps=workout, manager=manager, - sessionmode='time', + sessionmode=sessionmode, comment=workout['description'] ) diff --git a/rowers/templates/instantplan.html b/rowers/templates/instantplan.html index 313d75d8..727bcbcf 100644 --- a/rowers/templates/instantplan.html +++ b/rowers/templates/instantplan.html @@ -58,6 +58,9 @@ {% endif %} {{ form.as_table }} + {% if byrscoreform %} + {{ byrscoreform.as_table }} + {% endif %}
{% csrf_token %} {% if plan.price|discounted:rower == 0 %} diff --git a/rowers/utils.py b/rowers/utils.py index 72e4b799..9ec563ad 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -690,7 +690,7 @@ def steps_write_fit(steps): return filename -def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7): +def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7, powerzones=None): seconds = 0 distance = 0 rscore = 0 @@ -732,7 +732,9 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7): if value != 0: if value < 10 and value > 0: # pragma: no cover - targetpower = ftp*0.6 + targetpower = ftp*0.6 # dit is niet correct + if powerzones is not None and value < len(powerzones)-1 and value>1: + targetpower = (powerzones[int(value)-1]+powerzones[int(value)])/(2.) elif value > 10 and value < 1000: # pragma: no cover targetpower = value*ftp/100. elif value > 1000: @@ -890,15 +892,17 @@ def ps_dict_order(d, short=False, rower=None, html=True): steps = d['steps'] ftp = 200 + powerzones = None if rower is not None: ftp = rower.ftp + powerzones = [rower.pw_ut2, rower.pw_ut1, rower.pw_at, rower.pw_tr, rower.pw_an] # ftv = rower.ftv # ftspm = rower.ftspm for step in steps: sstring, type, stepID, repeatID, repeatValue = step_to_string( step, short=short) - seconds, meters, rscore = step_to_time_dist(step, ftp=ftp) + seconds, meters, rscore = step_to_time_dist(step, ftp=ftp, powerzones=powerzones) sdict[stepID] = { 'string': sstring, diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index 24b84ec4..e92669e1 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -1417,7 +1417,6 @@ def save_plan_yaml(request, userid=0): elif ps.sessionmode == 'time': ps.interval_string = '{d}min'.format(d=ps.sessionvalue) elif ps.sessionmode == 'rScore': - print('aap') ps.approximate_duration = ps.sessionvalue ps.interval_string = '{d}min'.format(d=ps.sessionvalue) elif ps.sessionmode == 'TRIMP': @@ -2670,6 +2669,14 @@ def rower_view_instantplan(request, id='', userid=0): return HttpResponseRedirect(url) form = InstantPlanSelectForm(request.POST, targets=targets) + byrscoreform = PlanByRscoreForm(request.POST) + if byrscoreform.is_valid(): + try: + byrscore = byrscoreform.cleaned_data['byrscore'] + except KeyError: + byrscore = False + else: + byrscore = False if form.is_valid(): if plan.price > 0: # pragma: no cover @@ -2718,7 +2725,7 @@ def rower_view_instantplan(request, id='', userid=0): p.save() p.rowers.add(r) - create_sessions_from_json(plansteps, r, startdate, r.user) + create_sessions_from_json(plansteps, r, startdate, r.user, planbyrscore=byrscore) messages.info(request, 'Your Sessions have been added') @@ -2739,6 +2746,13 @@ def rower_view_instantplan(request, id='', userid=0): } form = InstantPlanSelectForm( targets=targets, instantplan=plan, initial=initial) + if request.user.is_superuser: + byrscoreform = PlanByRscoreForm() + else: + byrscoreform = None + + + else: # pragma: no cover form = None @@ -2771,6 +2785,7 @@ def rower_view_instantplan(request, id='', userid=0): 'rower': r, 'active': 'nav-plan', 'plan': plan, + 'byrscoreform': byrscoreform, 'trainingdays': trainingdays2, 'breadcrumbs': breadcrumbs, 'form': form, @@ -2983,6 +2998,7 @@ def rower_create_trainingplan(request, id=0): initial={'status': False, 'rowers': [therower]}, user=request.user) + breadcrumbs = [ { 'url': reverse(plannedsessions_view, diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 1dc57d34..a1d2acc3 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -113,7 +113,7 @@ from rowers.forms import ( StravaChartForm, FitnessFitForm, PerformanceManagerForm, TrainingPlanBillingForm, InstantPlanSelectForm, TrainingZonesForm, InstrokeForm, InStrokeMultipleCompareForm, - ForceCurveMultipleCompareForm + ForceCurveMultipleCompareForm, PlanByRscoreForm ) from django.urls import reverse, reverse_lazy