first version
This commit is contained in:
@@ -316,6 +316,9 @@ class MetricsForm(forms.Form):
|
||||
class CNsummaryForm(forms.Form):
|
||||
file = forms.FileField(required=True, validators=[must_be_csv])
|
||||
|
||||
class NextWeekJsonForm(forms.Form):
|
||||
file = forms.FileField(required=True)
|
||||
|
||||
# The little window to type '4x2000m/500m' to update the workout summary
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ import rowers.dataprep as dataprep
|
||||
import numpy as np
|
||||
import rowers.metrics as metrics
|
||||
import rowers.mytypes as mytypes
|
||||
from rowers.utils import to_pace
|
||||
from rowers.utils import to_pace, intensitymap
|
||||
from rowers.opaque import encoder
|
||||
from rowingdata import rower as rrower
|
||||
from rowingdata import rowingdata as rrdata
|
||||
@@ -1067,6 +1067,63 @@ def get_workouts_session(r, ps):
|
||||
|
||||
return ws
|
||||
|
||||
def correct_intensity(workout):
|
||||
# reads the steps and if the intensity is an integer, converts it to a string
|
||||
steps = workout['steps']
|
||||
for step in steps:
|
||||
if 'intensity' in step:
|
||||
if isinstance(step['intensity'], int):
|
||||
step['intensity'] = intensitymap[step['intensity']]
|
||||
|
||||
return workout
|
||||
|
||||
|
||||
def create_next_week_from_json(plansteps, rower, planbyrscore=False, plan=None,):
|
||||
trainingdays = plansteps['cycles']
|
||||
# start date is the first day of the following week
|
||||
today = timezone.now()
|
||||
startdate = today - timezone.timedelta(days=today.weekday())+timezone.timedelta(days=7)
|
||||
ndays = 0
|
||||
for day in trainingdays:
|
||||
try:
|
||||
workouts = day[0][1:]
|
||||
except IndexError:
|
||||
workouts =[]
|
||||
for workout in workouts:
|
||||
sessionsport = 'water'
|
||||
try:
|
||||
sessionsport = mytypes.fitmappinginv[workout['sport'].lower()]
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
preferreddate = startdate+timedelta(days=ndays)
|
||||
sessionmode = 'time'
|
||||
if planbyrscore:
|
||||
sessionmode = 'rScore'
|
||||
|
||||
ps = PlannedSession(
|
||||
startdate=preferreddate - timedelta(days=preferreddate.weekday()),
|
||||
enddate=preferreddate + timedelta(days=-preferreddate.weekday()-1, weeks=1),
|
||||
preferreddate=preferreddate,
|
||||
sessionsport=sessionsport, # change this
|
||||
name=workout['workoutName'],
|
||||
steps=correct_intensity(workout),
|
||||
manager=rower.user,
|
||||
sessionmode=sessionmode,
|
||||
comment=workout['description'],
|
||||
from_plan=plan,
|
||||
)
|
||||
ps.save()
|
||||
add_rower_session(rower, ps)
|
||||
if ps.fitfile:
|
||||
ps.steps = {}
|
||||
ps.save()
|
||||
ndays += 1
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
def create_sessions_from_json(plansteps, rower, startdate, manager, planbyrscore=False, plan=None,
|
||||
plan_past_days=False,
|
||||
asynchronous=True, queue=queue):
|
||||
@@ -1094,7 +1151,7 @@ def create_sessions_from_json(plansteps, rower, startdate, manager, planbyrscore
|
||||
preferreddate=preferreddate,
|
||||
sessionsport=sessionsport, # change this
|
||||
name=workout['workoutName'],
|
||||
steps=workout,
|
||||
steps=correct_intensity(workout),
|
||||
manager=manager,
|
||||
sessionmode=sessionmode,
|
||||
comment=workout['description'],
|
||||
|
||||
24
rowers/templates/loadnextweek.html
Normal file
24
rowers/templates/loadnextweek.html
Normal file
@@ -0,0 +1,24 @@
|
||||
{% extends "newbase.html" %}
|
||||
{% load static %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Planned Sessions{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
|
||||
<h1>Load next week</h1>
|
||||
|
||||
<form enctype="multipart/form-data" method="post">
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
@@ -1109,5 +1109,7 @@ urlpatterns = [
|
||||
name="history_view_data"),
|
||||
re_path(r'^braintree/$', views.braintree_webhook_view,
|
||||
name="braintree_webhook_view"),
|
||||
re_path(r'^nextweekplan/$', views.nextweekplan_view,
|
||||
name='nextweekplan_view'),
|
||||
]
|
||||
|
||||
|
||||
@@ -34,6 +34,17 @@ from django.conf import settings
|
||||
|
||||
lbstoN = 4.44822
|
||||
|
||||
intensitymap = {
|
||||
0: "Active",
|
||||
1: "Rest",
|
||||
2: "Warmup",
|
||||
3: "Cooldown",
|
||||
4: "Recovery",
|
||||
5: "Interval",
|
||||
6: "Other",
|
||||
}
|
||||
|
||||
|
||||
landingpages = (
|
||||
('workout_view', 'Workout View'),
|
||||
('workout_edit_view', 'Edit View'),
|
||||
@@ -1363,6 +1374,10 @@ def step_to_string(step, short=False):
|
||||
unit=unit,
|
||||
)
|
||||
|
||||
if isinstance(intensity, int):
|
||||
intensity = intensitymap[intensity]
|
||||
|
||||
|
||||
if short and intensity.lower() in ['warmup', 'cooldown', 'rest']:
|
||||
s = '{intensity} {duration} {unit} {target} {repeat}'.format(
|
||||
intensity=intensity,
|
||||
|
||||
@@ -4210,3 +4210,46 @@ def planmacrocyclebymonth(request, id=0, userid=0): # pragma: no cover
|
||||
'thismesoid': str(mesos[0].id)})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@user_passes_test(can_plan, login_url="/rowers/paidplans",
|
||||
message="This functionality requires a Pro plan",
|
||||
redirect_field_name=None)
|
||||
def nextweekplan_view(request):
|
||||
r = getrower(request.user)
|
||||
|
||||
form = NextWeekJsonForm()
|
||||
|
||||
if request.method == "POST":
|
||||
form = NextWeekJsonForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
f = form.cleaned_data['file']
|
||||
if f is not None:
|
||||
filename, path_and_filename = handle_uploaded_file(f)
|
||||
try:
|
||||
with open(path_and_filename,'r') as ff:
|
||||
data = json.load(ff)
|
||||
except:
|
||||
messages.error(request,"Hmm, invalid file")
|
||||
|
||||
create_next_week_from_json(data, r)
|
||||
messages.info(request,"Your planned sessions were created")
|
||||
|
||||
active = 'nav-plan'
|
||||
|
||||
breadcrumbs = [
|
||||
{
|
||||
'url': reverse('plannedsessions_view'),
|
||||
'name': 'Sessions'
|
||||
},
|
||||
{
|
||||
'url': reverse('nextweekplan_view'),
|
||||
'name': "Next week"
|
||||
},
|
||||
]
|
||||
|
||||
return render(request,
|
||||
'loadnextweek.html',
|
||||
{'rower': r,
|
||||
'form': form,
|
||||
'active': active,
|
||||
'breadcrumbs': breadcrumbs})
|
||||
|
||||
@@ -120,7 +120,7 @@ from rowers.forms import (
|
||||
TrainingPlanBillingForm, InstantPlanSelectForm,
|
||||
TrainingZonesForm, InstrokeForm, InStrokeMultipleCompareForm,
|
||||
ForceCurveMultipleCompareForm, PlanByRscoreForm,
|
||||
AssignChoices,
|
||||
AssignChoices, NextWeekJsonForm,
|
||||
)
|
||||
|
||||
from django.urls import reverse, reverse_lazy
|
||||
|
||||
Reference in New Issue
Block a user