From e808b0c51f9ebcf1aa628ca7f9bf48c08504b993 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 17 Dec 2024 20:13:17 +0100 Subject: [PATCH] sort of importing ok --- rowers/integrations/intervals.py | 26 +++++++++++-------- rowers/models.py | 8 +++++- rowers/templates/intervals_list_import.html | 2 ++ rowers/templates/menu_plan.html | 5 ++++ rowers/utils.py | 28 +++++++++++++-------- rowers/views/importviews.py | 21 ++++++++++++++-- 6 files changed, 67 insertions(+), 23 deletions(-) diff --git a/rowers/integrations/intervals.py b/rowers/integrations/intervals.py index ce3ae480..5e51049a 100644 --- a/rowers/integrations/intervals.py +++ b/rowers/integrations/intervals.py @@ -324,7 +324,10 @@ class IntervalsIntegration(SyncIntegration): } # first get the folders - we need the folder id for the next call - url = self.oauth_data['base_url'] + 'athlete/0/events?category=WORKOUT' + oldest = (timezone.now() - timedelta(days=30)).strftime('%Y-%m-%d') + newest = (timezone.now() + timedelta(days=30)).strftime('%Y-%m-%d') + url = self.oauth_data['base_url'] + 'athlete/0/events' #'?category=WORKOUT' + url += '?oldest=' + oldest + '&newest=' + newest response = requests.get(url, headers=headers) if response.status_code != 200: return [] @@ -350,17 +353,20 @@ class IntervalsIntegration(SyncIntegration): data = response.json() # get file from athlete/0/events/{id}/downloadfit - url = self.oauth_data['base_url'] + 'athlete/0/events/' + str(id) + '/downloadfit' - response = requests.get(url, headers=headers) - if response.status_code != 200: - dologging('intervals.icu.log', response.text) - return 0 + if data['category'] == 'WORKOUT': + url = self.oauth_data['base_url'] + 'athlete/0/events/' + str(id) + '/downloadfit' + response = requests.get(url, headers=headers) + if response.status_code != 200: + dologging('intervals.icu.log', response.text) + return 0 - filename = 'media/planned_' + str(id) + '.fit' - with open(filename, 'wb') as f: - f.write(response.content) + filename = 'planned_' + str(id) + '.fit' + filename2 = 'media/planned_' + str(id) + '.fit' + with open(filename2, 'wb') as f: + f.write(response.content) + + data['fitfile'] = filename - data['fitfile'] = filename return data diff --git a/rowers/models.py b/rowers/models.py index 51e90d7a..71560594 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2688,9 +2688,15 @@ class PlannedSessionStep(models.Model): targettypes = ( ("Speed", "Speed"), + ("SpeedLap", "SpeedLap"), ("HeartRate", "HeartRate"), + ("HeartRateLap", "HeartRateLap"), ("Cadence", "Cadence"), - ("Power", "Power") + ("CadenceLap", "CadenceLap"), + ("Power", "Power"), + ("PowerLap", "PowerLap"), + ("Distance", "Distance"), + ("Duration", "Duration"), ) manager = models.ForeignKey(User, null=True, on_delete=models.CASCADE) diff --git a/rowers/templates/intervals_list_import.html b/rowers/templates/intervals_list_import.html index 7ecad750..6f1a8a12 100644 --- a/rowers/templates/intervals_list_import.html +++ b/rowers/templates/intervals_list_import.html @@ -17,6 +17,7 @@ Import Date + Name Description Type Training Load @@ -29,6 +30,7 @@ {{ session.start_date_local }} + {{ session.name }} {{ session.description }} {{ session.type }} {{ session.icu_training_load }} diff --git a/rowers/templates/menu_plan.html b/rowers/templates/menu_plan.html index 4ff3f5bf..89b67a4e 100644 --- a/rowers/templates/menu_plan.html +++ b/rowers/templates/menu_plan.html @@ -71,6 +71,11 @@  Import from Rojabo +
  • + +  Import from Intervals + +
  • Plan Microcycle diff --git a/rowers/utils.py b/rowers/utils.py index f403630c..f8f37440 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -774,7 +774,7 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7, powerzones rscoreperhour = 100.*veloratio rscore = rscoreperhour*seconds/3600. - if targettype == 'Power': + if targettype in ['Power','PowerLap']: value = step.get('targetValue', 0) valuelow = step.get('targetValueLow', 0) valuehigh = step.get('targetValueHigh', 0) @@ -798,7 +798,7 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7, powerzones rscore = 100.*(avgpower/ftp)*seconds/3600. - if targettype == 'Cadence': + if targettype in ['Cadence','CadenceLap']: value = step.get('targetValue', 0) valuelow = step.get('targetValueLow', 0) valuehigh = step.get('targetValueHigh', 0) @@ -820,7 +820,7 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7, powerzones seconds = distance/avgspeed rscore = 60.*float(seconds)/3600. - if targettype == 'Speed': # pragma: no cover + if targettype in ['Speed', 'SpeedLap']: # pragma: no cover value = step.get('targetValue', 0) valuelow = step.get('targetValueLow', 0) valuehigh = step.get('targetValueHigh', 0) @@ -839,7 +839,7 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7, powerzones if velomid > 0: seconds = distance/velomid - if targettype == 'Power': # pragma: no cover + if targettype in ['Power','PowerLap']: # pragma: no cover value = step.get('targetValue', 0) valuelow = step.get('targetValueLow', 0) valuehigh = step.get('targetValueHigh', 0) @@ -856,12 +856,20 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7, powerzones avgpower = targetpower if valuelow != 0 and valuehigh != 0: avgpower = (valuelow+valuehigh)/2. - avgspeed = ftv*(avgpower/ftp)**(1./3.) + if avgpower < 10 and avgpower > 0: + targetpower = ftp*0.6 + elif avgpower > 10 and avgpower < 1000: + targetpower = avgpower*ftp/100. + elif avgpower > 1000: + targetpower = avgpower-1000 + + avgspeed = ftv*(targetpower/ftp)**(1./3.) seconds = distance/avgspeed + rscore = 100.*(avgpower/ftp)*seconds/3600. - if targettype == 'Cadence': # pragma: no cover + if targettype in ['Cadence','CadenceLap']: # pragma: no cover value = step.get('targetValue', 0) valuelow = step.get('targetValueLow', 0) valuehigh = step.get('targetValueHigh', 0) @@ -1189,7 +1197,7 @@ def step_to_string(step, short=False): except KeyError: targettype = None - if targettype == 'HeartRate': # pragma: no cover + if targettype in ['HeartRate','HeartRateLap']: # pragma: no cover value = step.get('targetValue', 0) valuelow = step.get('targetValueLow', 0) valuehigh = step.get('targetValueHigh', 0) @@ -1207,7 +1215,7 @@ def step_to_string(step, short=False): l=valuelow - 100, h=valuehigh - 100, ) - elif targettype == 'Power': # pragma: no cover + elif targettype in ['Power', 'PowerLap']: # pragma: no cover value = step.get('targetValue', 0) valuelow = step.get('targetValueLow', 0) valuehigh = step.get('targetValueHigh', 0) @@ -1229,7 +1237,7 @@ def step_to_string(step, short=False): l=valuelow-1000, h=valuehigh-1000, ) - elif targettype == 'Speed': # pragma: no cover + elif targettype in ['Speed', 'SpeedLap']: # pragma: no cover value = step.get('targetValue', 0) valuelow = step.get('targetValueLow', 0) @@ -1264,7 +1272,7 @@ def step_to_string(step, short=False): pl=pacestringlow, ph=pacestringhigh, ) - elif targettype == 'Cadence': # pragma: no cover + elif targettype in ['Cadence','CadenceLap']: # pragma: no cover value = step.get('targetValue', 0) valuelow = step.get('targetValueLow', 0) valuehigh = step.get('targetValueHigh', 0) diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index f4eec10b..63e49742 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -703,10 +703,20 @@ def plannedsession_intervalsimport_view(request, message="", userid=0): sessionids = [id for id in tdict['session']] for sessionid in sessionids: sessiondata = integration.get_plannedsession(sessionid) + if sessiondata['description'] is None: + sessiondata['description'] = '' if sessiondata: + timetarget = sessiondata['time_target'] + if timetarget is None: + timetarget = sessiondata['moving_time'] + if timetarget is None: + timetarget = 3600 + timetarget = int(timetarget)/60. ps = PlannedSession( name=sessiondata['name'], comment=sessiondata['description'], + sessionmode='time', + sessionvalue=timetarget, startdate=arrow.get(sessiondata['start_date_local']).datetime, enddate=arrow.get(sessiondata['end_date_local']).datetime, preferreddate=arrow.get(sessiondata['start_date_local']).datetime, @@ -714,11 +724,18 @@ def plannedsession_intervalsimport_view(request, message="", userid=0): sessiontype='session', intervals_icu_id=sessiondata['id'], manager=request.user, - fitfile=sessiondata['fitfile'], ) ps.save() ps.rower.add(r) - ps.update_steps() + if sessiondata['category'].lower() == 'workout': + ps.fitfile = sessiondata['fitfile'] + ps.save() + ps.update_steps() + if sessiondata['category'].lower() == 'target': + ps.sessiontype = 'cycletarget' + ps.sessionvalue = int(sessiondata['time_target'])/60. + ps.enddate = ps.startdate + datetime.timedelta(days=6) + ps.save() url = reverse('plannedsessions_view') return HttpResponseRedirect(url)