understands interval string when defining workout
This commit is contained in:
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user