Private
Public Access
1
0

understands interval string when defining workout

This commit is contained in:
Sander Roosendaal
2021-02-12 16:46:44 +01:00
parent daa92ee3e4
commit 69d3d1e46d
5 changed files with 195 additions and 3 deletions

View File

@@ -16,11 +16,15 @@ from django.conf import settings
import pytz
from dateutil import parser
from rowers.utils import myqueue,calculate_age,totaltime_sec_to_string
from fitparse import FitFile
import re
import django_rq
queue = django_rq.get_queue('default')
queuelow = django_rq.get_queue('low')
queuehigh = django_rq.get_queue('low')
import json
import pandas as pd
@@ -77,6 +81,176 @@ from rowers.tasks import (
)
from rowers.utils import totaltime_sec_to_string
def step_to_string(step):
target_dict = {
'heart_rate': {
'name':'Heart Rate between',
'low':'custom_target_heart_rate_low',
'high': 'custom_target_heart_rate_high'
},
'speed':{
'name': 'Speed between',
'low': 'custom_target_speed_low',
'high': 'custom_target_speed_high',
},
'cadence':{
'name': 'SPM between',
'low': 'custom_target_cadence_low',
'high': 'custom_target_cadence_high',
},
'open':{
'name': 'between',
'low': 'custom_target_value_low',
'high': 'custom_target_value_high',
},
'power':{
'name': 'Power between',
'low': 'custom_target_power_low',
'high': 'custom_target_power_high',
},
'stroke_type':{
'name': 'Stroke type',
'low': 'target_swim_stroke',
'high': '',
},
}
duration = ''
repeat = ''
target = ''
intensity = ''
nr = ''
name = ''
for key, value in step.items():
if key == 'duration_distance':
duration = '{v} m'.format(v=value)
if key == 'duration_time':
dd = timedelta(seconds=value)
duration = '{v} min'.format(v=str(dd))
if key in ['duration_hr']:
duration = 'until HR reaches {v}'.format(v=value)
if key == 'target_type' and value is not None:
dd = target_dict[value]
t = dd['name']
l = ''
h = ''
if dd['low']:
v = step[dd['low']]
if value == 'heart_rate':
if v<100:
v = '{v} \%'.format(v=v)
else:
v = v-100
v = '{v}'.format(v=v)
l = '{v}'.format(v=v)
if dd['high']:
v = step[dd['high']]
if value == 'heart_rate':
if v<100:
v = '{v} \%'.format(v=v)
else:
v = v-100
v = '{v}'.format(v=v)
h = 'and {v}'.format(v=v)
target = '{t} {l} {h}'.format(
t = t,
l = l,
h = h,
)
if key == 'intensity':
intensity = '{v}'.format(v=value)
if key == 'repeat':
pass
if key == 'message_index':
nr = '{v}'.format(v=value)
if key == 'wkt_step_name':
name = '{v}'.format(v=value)
s = '{nr}: {name} {intensity} {duration} {target} {repeat}'.format(
nr = nr,
name = name,
intensity = intensity,
duration = duration,
target=target,
repeat = repeat,
)
return s
def ps_dict_get_description(d):
s = ''
steps = d['steps']
for step in steps:
s += step_to_string(step)
s += '\n'
return s
class FitWorkoutSteps(object):
def __init__(self,readfile):
self.readfile = readfile
self.fitfile = FitFile(readfile, check_crc=False)
self.records = self.fitfile.messages
self.name = ''
self.sport = 'Custom'
# message 0 is file id
# message 1 must be workout description
m0 = self.records[0]
typ = m0.fields[0].value
if typ != 'workout':
raise TypeError("Wrong FIT file type")
steps = []
stepmessages = self.fitfile.get_messages('workout_step')
for msg in stepmessages:
if msg.name == 'workout_step':
step = {}
for field in msg.fields:
ff = field.as_dict()
step[ff['name']] = ff['value']
steps.append(step)
for msg in self.fitfile.get_messages('workout'):
if msg.name == 'workout':
for field in msg.fields:
ff = field.as_dict()
if ff['name'] == 'wkt_name':
self.name = ff['value']
if ff['name'] == 'sport':
self.sport = ff['value']
self.steps = steps
def to_json(self):
d = self.get_dict()
return json.dumps(d)
def get_dict(self):
d = {}
d['filename'] = self.readfile
d['name'] = self.name
d['steps'] = self.steps
d['sport'] = self.sport
return d
def get_description(self):
s = ''
for step in self.steps:
s += step_to_string(step)
s += '\n'
return s
def checkscores(r,macrocycles):
for m in macrocycles:
createmesofillers(m)
@@ -1474,7 +1648,7 @@ def default_class(r,w,race):
boatclass = 'water'
else:
boatclass = 'rower'
boattype = '1x'
adaptiveclass = 'None'
weightclass = 'hwt'