Merge branch 'release/v20.1.17'
This commit is contained in:
@@ -991,6 +991,8 @@ class SessionDateShiftForm(forms.Form):
|
|||||||
class DeltaDaysForm(forms.Form):
|
class DeltaDaysForm(forms.Form):
|
||||||
deltadays = forms.IntegerField(initial=7, required=False, label='')
|
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):
|
class RegistrationForm(UserCreationForm):
|
||||||
"""
|
"""
|
||||||
|
|||||||
+4
-1
@@ -1715,6 +1715,8 @@ class InstantPlan(models.Model):
|
|||||||
price = models.IntegerField(default=0, verbose_name="Price in EURO")
|
price = models.IntegerField(default=0, verbose_name="Price in EURO")
|
||||||
url = models.CharField(max_length=250, blank=True,
|
url = models.CharField(max_length=250, blank=True,
|
||||||
verbose_name="Link to page with more information")
|
verbose_name="Link to page with more information")
|
||||||
|
private = models.BooleanField(default=False,
|
||||||
|
verbose_name="Hidden, personal")
|
||||||
|
|
||||||
def __str__(self): # pragma: no cover
|
def __str__(self): # pragma: no cover
|
||||||
return self.name
|
return self.name
|
||||||
@@ -1753,6 +1755,7 @@ class InstantPlanForm(ModelForm):
|
|||||||
'hoursperweek',
|
'hoursperweek',
|
||||||
'sessionsperweek',
|
'sessionsperweek',
|
||||||
'yaml',
|
'yaml',
|
||||||
|
'private'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -2810,7 +2813,7 @@ class PlannedSession(models.Model):
|
|||||||
self.sessionvalue = self.approximate_duration
|
self.sessionvalue = self.approximate_duration
|
||||||
elif self.sessionmode == 'distance': # pragma: no cover
|
elif self.sessionmode == 'distance': # pragma: no cover
|
||||||
self.sessionvalue = self.approximate_distance
|
self.sessionvalue = self.approximate_distance
|
||||||
elif self.sessionmode == 'rscore': # pragma: no cover
|
elif self.sessionmode == 'rScore': # pragma: no cover
|
||||||
self.sessionvalue = self.approximate_rscore
|
self.sessionvalue = self.approximate_rscore
|
||||||
|
|
||||||
super(PlannedSession, self).save(*args, **kwargs)
|
super(PlannedSession, self).save(*args, **kwargs)
|
||||||
|
|||||||
@@ -1063,7 +1063,7 @@ def get_workouts_session(r, ps):
|
|||||||
|
|
||||||
return ws
|
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']
|
trainingdays = plansteps['trainingDays']
|
||||||
planstartdate = startdate
|
planstartdate = startdate
|
||||||
for day in trainingdays:
|
for day in trainingdays:
|
||||||
@@ -1076,6 +1076,10 @@ def create_sessions_from_json(plansteps, rower, startdate, manager):
|
|||||||
|
|
||||||
preferreddate = planstartdate+timedelta(days=day['order'])
|
preferreddate = planstartdate+timedelta(days=day['order'])
|
||||||
|
|
||||||
|
sessionmode = 'time'
|
||||||
|
if planbyrscore:
|
||||||
|
sessionmode = 'rScore'
|
||||||
|
|
||||||
ps = PlannedSession(
|
ps = PlannedSession(
|
||||||
startdate=preferreddate -
|
startdate=preferreddate -
|
||||||
timedelta(days=preferreddate.weekday()),
|
timedelta(days=preferreddate.weekday()),
|
||||||
@@ -1086,7 +1090,7 @@ def create_sessions_from_json(plansteps, rower, startdate, manager):
|
|||||||
name=workout['workoutName'],
|
name=workout['workoutName'],
|
||||||
steps=workout,
|
steps=workout,
|
||||||
manager=manager,
|
manager=manager,
|
||||||
sessionmode='time',
|
sessionmode=sessionmode,
|
||||||
comment=workout['description']
|
comment=workout['description']
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,9 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<table>
|
<table>
|
||||||
{{ form.as_table }}
|
{{ form.as_table }}
|
||||||
|
{% if byrscoreform %}
|
||||||
|
{{ byrscoreform.as_table }}
|
||||||
|
{% endif %}
|
||||||
</table>
|
</table>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{% if plan.price|discounted:rower == 0 %}
|
{% if plan.price|discounted:rower == 0 %}
|
||||||
|
|||||||
@@ -30,6 +30,9 @@
|
|||||||
<p>Created by: {{ plan.owner.first_name }} {{ plan.owner.last_name }}</p>
|
<p>Created by: {{ plan.owner.first_name }} {{ plan.owner.last_name }}</p>
|
||||||
<p>Plan length: {{ plan.duration }} days</p>
|
<p>Plan length: {{ plan.duration }} days</p>
|
||||||
<p>{{ plan.description }}</p>
|
<p>{{ plan.description }}</p>
|
||||||
|
{% if plan.private %}
|
||||||
|
<p><em>Private</em></p>
|
||||||
|
{% endif %}
|
||||||
{% if plan.target %}
|
{% if plan.target %}
|
||||||
<p>What the plan will achieve: {{ plan.target }}</p>
|
<p>What the plan will achieve: {{ plan.target }}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
BIN
Binary file not shown.
+18
-5
@@ -690,7 +690,7 @@ def steps_write_fit(steps):
|
|||||||
return filename
|
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
|
seconds = 0
|
||||||
distance = 0
|
distance = 0
|
||||||
rscore = 0
|
rscore = 0
|
||||||
@@ -721,6 +721,8 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7):
|
|||||||
else:
|
else:
|
||||||
velomid = avgspeed
|
velomid = avgspeed
|
||||||
|
|
||||||
|
distance = velomid*seconds
|
||||||
|
|
||||||
veloratio = (velomid/ftv)**(3.0)
|
veloratio = (velomid/ftv)**(3.0)
|
||||||
rscoreperhour = 100.*veloratio
|
rscoreperhour = 100.*veloratio
|
||||||
rscore = rscoreperhour*seconds/3600.
|
rscore = rscoreperhour*seconds/3600.
|
||||||
@@ -732,7 +734,9 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7):
|
|||||||
|
|
||||||
if value != 0:
|
if value != 0:
|
||||||
if value < 10 and value > 0: # pragma: no cover
|
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
|
elif value > 10 and value < 1000: # pragma: no cover
|
||||||
targetpower = value*ftp/100.
|
targetpower = value*ftp/100.
|
||||||
elif value > 1000:
|
elif value > 1000:
|
||||||
@@ -742,7 +746,7 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7):
|
|||||||
avgpower = targetpower
|
avgpower = targetpower
|
||||||
if valuelow != 0 and valuehigh != 0: # pragma: no cover
|
if valuelow != 0 and valuehigh != 0: # pragma: no cover
|
||||||
avgpower = (valuelow+valuehigh)/2.
|
avgpower = (valuelow+valuehigh)/2.
|
||||||
avgspeed = ftv*(avgspeed/ftv)**(1./3.)
|
avgspeed = ftv*(avgpower/ftp)**(1./3.)
|
||||||
distance = avgspeed*seconds
|
distance = avgspeed*seconds
|
||||||
|
|
||||||
rscore = 100.*(avgpower/ftp)*seconds/3600.
|
rscore = 100.*(avgpower/ftp)*seconds/3600.
|
||||||
@@ -758,6 +762,9 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7):
|
|||||||
avgspm = (valuelow+valuehigh)/2.
|
avgspm = (valuelow+valuehigh)/2.
|
||||||
avgpower = ftp*avgspm/ftspm
|
avgpower = ftp*avgspm/ftspm
|
||||||
|
|
||||||
|
avgspeed = ftv*(avgpower/ftp)**(1./3.)
|
||||||
|
distance = avgspeed*seconds
|
||||||
|
|
||||||
rscore = 100*(avgpower/ftp)*seconds/3600.
|
rscore = 100*(avgpower/ftp)*seconds/3600.
|
||||||
|
|
||||||
return seconds, distance, rscore
|
return seconds, distance, rscore
|
||||||
@@ -782,6 +789,7 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7):
|
|||||||
veloratio = (velomid/ftv)**(3.0)
|
veloratio = (velomid/ftv)**(3.0)
|
||||||
rscoreperhour = 100.*veloratio
|
rscoreperhour = 100.*veloratio
|
||||||
rscore = rscoreperhour*seconds/3600.
|
rscore = rscoreperhour*seconds/3600.
|
||||||
|
seconds = distance/velomid
|
||||||
|
|
||||||
if targettype == 'Power': # pragma: no cover
|
if targettype == 'Power': # pragma: no cover
|
||||||
value = step.get('targetValue', 0)
|
value = step.get('targetValue', 0)
|
||||||
@@ -800,7 +808,7 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7):
|
|||||||
avgpower = targetpower
|
avgpower = targetpower
|
||||||
if valuelow != 0 and valuehigh != 0:
|
if valuelow != 0 and valuehigh != 0:
|
||||||
avgpower = (valuelow+valuehigh)/2.
|
avgpower = (valuelow+valuehigh)/2.
|
||||||
avgspeed = ftv*(avgspeed/ftv)**(1./3.)
|
avgspeed = ftv*(avgpower/ftp)**(1./3.)
|
||||||
seconds = distance/avgspeed
|
seconds = distance/avgspeed
|
||||||
|
|
||||||
rscore = 100.*(avgpower/ftp)*seconds/3600.
|
rscore = 100.*(avgpower/ftp)*seconds/3600.
|
||||||
@@ -817,6 +825,8 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7):
|
|||||||
avgpower = ftp*avgspm/ftspm
|
avgpower = ftp*avgspm/ftspm
|
||||||
|
|
||||||
rscore = 100*(avgpower/ftp)*seconds/3600.
|
rscore = 100*(avgpower/ftp)*seconds/3600.
|
||||||
|
avgspeed = ftv*(avgpower/ftp)**(1./3.)
|
||||||
|
seconds = distance/avgspeed
|
||||||
|
|
||||||
return seconds, distance, rscore
|
return seconds, distance, rscore
|
||||||
elif durationtype in ['PowerLessThan', 'PowerGreaterThan', 'HrLessThan', 'HrGreaterThan']: # pragma: no cover
|
elif durationtype in ['PowerLessThan', 'PowerGreaterThan', 'HrLessThan', 'HrGreaterThan']: # pragma: no cover
|
||||||
@@ -890,15 +900,17 @@ def ps_dict_order(d, short=False, rower=None, html=True):
|
|||||||
steps = d['steps']
|
steps = d['steps']
|
||||||
|
|
||||||
ftp = 200
|
ftp = 200
|
||||||
|
powerzones = None
|
||||||
if rower is not None:
|
if rower is not None:
|
||||||
ftp = rower.ftp
|
ftp = rower.ftp
|
||||||
|
powerzones = [rower.pw_ut2, rower.pw_ut1, rower.pw_at, rower.pw_tr, rower.pw_an]
|
||||||
# ftv = rower.ftv
|
# ftv = rower.ftv
|
||||||
# ftspm = rower.ftspm
|
# ftspm = rower.ftspm
|
||||||
|
|
||||||
for step in steps:
|
for step in steps:
|
||||||
sstring, type, stepID, repeatID, repeatValue = step_to_string(
|
sstring, type, stepID, repeatID, repeatValue = step_to_string(
|
||||||
step, short=short)
|
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] = {
|
sdict[stepID] = {
|
||||||
'string': sstring,
|
'string': sstring,
|
||||||
@@ -913,6 +925,7 @@ def ps_dict_order(d, short=False, rower=None, html=True):
|
|||||||
|
|
||||||
sdict2 = collections.OrderedDict(reversed(list(sdict.items())))
|
sdict2 = collections.OrderedDict(reversed(list(sdict.items())))
|
||||||
|
|
||||||
|
|
||||||
for step in steps:
|
for step in steps:
|
||||||
sstring, type, stepID, repeatID, repeatValue = step_to_string(
|
sstring, type, stepID, repeatID, repeatValue = step_to_string(
|
||||||
step, short=short)
|
step, short=short)
|
||||||
|
|||||||
@@ -848,7 +848,12 @@ def rower_register_view(request):
|
|||||||
weightcategory = form.cleaned_data['weightcategory']
|
weightcategory = form.cleaned_data['weightcategory']
|
||||||
adaptiveclass = form.cleaned_data['adaptiveclass']
|
adaptiveclass = form.cleaned_data['adaptiveclass']
|
||||||
nextpage = request.POST['next']
|
nextpage = request.POST['next']
|
||||||
|
try:
|
||||||
theuser = User.objects.create_user(username, password=password)
|
theuser = User.objects.create_user(username, password=password)
|
||||||
|
except:
|
||||||
|
messages.error(request, "This user name already exists, choose another one")
|
||||||
|
url = reverse('rower_register_view')
|
||||||
|
return HttpResponseRedirect(url)
|
||||||
theuser.first_name = first_name
|
theuser.first_name = first_name
|
||||||
theuser.last_name = last_name
|
theuser.last_name = last_name
|
||||||
theuser.email = email
|
theuser.email = email
|
||||||
|
|||||||
@@ -1417,7 +1417,6 @@ def save_plan_yaml(request, userid=0):
|
|||||||
elif ps.sessionmode == 'time':
|
elif ps.sessionmode == 'time':
|
||||||
ps.interval_string = '{d}min'.format(d=ps.sessionvalue)
|
ps.interval_string = '{d}min'.format(d=ps.sessionvalue)
|
||||||
elif ps.sessionmode == 'rScore':
|
elif ps.sessionmode == 'rScore':
|
||||||
print('aap')
|
|
||||||
ps.approximate_duration = ps.sessionvalue
|
ps.approximate_duration = ps.sessionvalue
|
||||||
ps.interval_string = '{d}min'.format(d=ps.sessionvalue)
|
ps.interval_string = '{d}min'.format(d=ps.sessionvalue)
|
||||||
elif ps.sessionmode == 'TRIMP':
|
elif ps.sessionmode == 'TRIMP':
|
||||||
@@ -2624,6 +2623,8 @@ def rower_view_instantplan(request, id='', userid=0):
|
|||||||
nextday['week'] = (divmod(i, 7)[0])+1
|
nextday['week'] = (divmod(i, 7)[0])+1
|
||||||
|
|
||||||
trainingdays2.append(nextday)
|
trainingdays2.append(nextday)
|
||||||
|
|
||||||
|
workouts = nextday['workouts']
|
||||||
try:
|
try:
|
||||||
nextday = trainingdays.pop(0)
|
nextday = trainingdays.pop(0)
|
||||||
except IndexError:
|
except IndexError:
|
||||||
@@ -2670,6 +2671,14 @@ def rower_view_instantplan(request, id='', userid=0):
|
|||||||
return HttpResponseRedirect(url)
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
form = InstantPlanSelectForm(request.POST, targets=targets)
|
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 form.is_valid():
|
||||||
if plan.price > 0: # pragma: no cover
|
if plan.price > 0: # pragma: no cover
|
||||||
@@ -2718,7 +2727,7 @@ def rower_view_instantplan(request, id='', userid=0):
|
|||||||
p.save()
|
p.save()
|
||||||
p.rowers.add(r)
|
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')
|
messages.info(request, 'Your Sessions have been added')
|
||||||
|
|
||||||
@@ -2739,6 +2748,13 @@ def rower_view_instantplan(request, id='', userid=0):
|
|||||||
}
|
}
|
||||||
form = InstantPlanSelectForm(
|
form = InstantPlanSelectForm(
|
||||||
targets=targets, instantplan=plan, initial=initial)
|
targets=targets, instantplan=plan, initial=initial)
|
||||||
|
if request.user.is_superuser:
|
||||||
|
byrscoreform = PlanByRscoreForm()
|
||||||
|
else:
|
||||||
|
byrscoreform = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
else: # pragma: no cover
|
else: # pragma: no cover
|
||||||
form = None
|
form = None
|
||||||
|
|
||||||
@@ -2771,6 +2787,7 @@ def rower_view_instantplan(request, id='', userid=0):
|
|||||||
'rower': r,
|
'rower': r,
|
||||||
'active': 'nav-plan',
|
'active': 'nav-plan',
|
||||||
'plan': plan,
|
'plan': plan,
|
||||||
|
'byrscoreform': byrscoreform,
|
||||||
'trainingdays': trainingdays2,
|
'trainingdays': trainingdays2,
|
||||||
'breadcrumbs': breadcrumbs,
|
'breadcrumbs': breadcrumbs,
|
||||||
'form': form,
|
'form': form,
|
||||||
@@ -2849,8 +2866,15 @@ def rower_select_instantplan(request, id=0):
|
|||||||
r = getrequestrower(request, userid=id)
|
r = getrequestrower(request, userid=id)
|
||||||
|
|
||||||
# get and present available plans
|
# get and present available plans
|
||||||
ips = InstantPlan.objects.all().order_by(
|
ips = InstantPlan.objects.filter(private=False)
|
||||||
"name", "sessionsperweek", "hoursperweek", "duration", "id")
|
|
||||||
|
if not request.user.is_anonymous:
|
||||||
|
|
||||||
|
ips2 = InstantPlan.objects.filter(owner=request.user)
|
||||||
|
|
||||||
|
ips = ips | ips2
|
||||||
|
|
||||||
|
ips = ips.order_by("private", "name", "sessionsperweek", "hoursperweek", "duration", "id")
|
||||||
|
|
||||||
breadcrumbs = [
|
breadcrumbs = [
|
||||||
{
|
{
|
||||||
@@ -2976,6 +3000,7 @@ def rower_create_trainingplan(request, id=0):
|
|||||||
initial={'status': False, 'rowers': [therower]},
|
initial={'status': False, 'rowers': [therower]},
|
||||||
user=request.user)
|
user=request.user)
|
||||||
|
|
||||||
|
|
||||||
breadcrumbs = [
|
breadcrumbs = [
|
||||||
{
|
{
|
||||||
'url': reverse(plannedsessions_view,
|
'url': reverse(plannedsessions_view,
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ from rowers.forms import (
|
|||||||
StravaChartForm, FitnessFitForm, PerformanceManagerForm,
|
StravaChartForm, FitnessFitForm, PerformanceManagerForm,
|
||||||
TrainingPlanBillingForm, InstantPlanSelectForm,
|
TrainingPlanBillingForm, InstantPlanSelectForm,
|
||||||
TrainingZonesForm, InstrokeForm, InStrokeMultipleCompareForm,
|
TrainingZonesForm, InstrokeForm, InStrokeMultipleCompareForm,
|
||||||
ForceCurveMultipleCompareForm
|
ForceCurveMultipleCompareForm, PlanByRscoreForm
|
||||||
)
|
)
|
||||||
|
|
||||||
from django.urls import reverse, reverse_lazy
|
from django.urls import reverse, reverse_lazy
|
||||||
|
|||||||
Reference in New Issue
Block a user