Private
Public Access
1
0

first version

This commit is contained in:
2025-04-13 17:28:51 +02:00
parent f56eee0d92
commit 9ef9138fc6
7 changed files with 147 additions and 3 deletions

View File

@@ -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

View File

@@ -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'],

View 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 %}

View File

@@ -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'),
]

View File

@@ -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,

View File

@@ -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})

View File

@@ -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