diff --git a/rowers/integrations/intervals.py b/rowers/integrations/intervals.py index e689bdbc..68b930ee 100644 --- a/rowers/integrations/intervals.py +++ b/rowers/integrations/intervals.py @@ -220,15 +220,23 @@ class IntervalsIntegration(SyncIntegration): thetype = mytypes.intervalsmapping[workout.workouttype] jsondict = {'type': thetype} subtype = workout.sub_type - if subtype: - jsondict['sub_type'] = subtype - - jsondict['icu_rpe'] = workout.rpe + if subtype == "Warming Up": + jsondict['sub_type'] = "WARMUP" + elif subtype == "Cooling Down": + jsondict['sub_type'] = "COOLDOWN" + elif subtype == "Commute": + jsondict['commute'] = True + jsondict['sub_type'] = "COMMUTE" + else: + jsondict['sub_type'] = "NONE" + + if workout.rpe is not None and workout.rpe > 0: + jsondict['icu_rpe'] = workout.rpe + jsondict['commute'] = workout.is_commute if workout.plannedsession: jsondict['paired_event_id'] = workout.plannedsession.intervals_icu_id - - + response = requests.put(url, headers=headers, json=jsondict) if response.status_code not in [200, 201]: @@ -322,6 +330,14 @@ class IntervalsIntegration(SyncIntegration): dologging('intervals.icu.log', response.text) return 0 + subtypemapping = { + 'WARMUP': 'Warming Up', + 'COOLDOWN': 'Cooling Down', + 'COMMUTE': 'Commute', + 'NONE': None, + 'RACE': 'Race' + } + data = response.json() ws = Workout.objects.filter(uploadedtointervals=id) @@ -338,6 +354,10 @@ class IntervalsIntegration(SyncIntegration): w.workouttype = mytypes.intervalsmappinginv[data['type']] except KeyError: pass + try: + w.sub_type = subtypemapping[data['sub_type']] + except KeyError: + pass try: w.rpe = data['icu_rpe'] if w.rpe is None: @@ -873,7 +893,7 @@ class IntervalsIntegration(SyncIntegration): try: ps.comment = data['description'] except KeyError: - ps.comment = '' + ps.comment = ' ' ps.startdate = arrow.get(data['start_date_local']).datetime ps.enddate = arrow.get(data['end_date_local']).datetime ps.preferreddate = arrow.get(data['start_date_local']).datetime diff --git a/rowers/tasks.py b/rowers/tasks.py index 6013a191..e840d397 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -3585,6 +3585,45 @@ def handle_nk_async_workout(alldata, userid, nktoken, nkid, delaysec, defaulttim return workoutid +@app.task +def handle_intervals_updateworkout(workout, debug=False, **kwargs): + rower = workout.user + intervalstoken = rower.intervals_token + authorizationstring = str('Bearer ' + intervalstoken) + + headers = { + 'authorization': authorizationstring + } + + thetype = mytypes.intervalsmapping[workout.workouttype] + jsondict = {'type': thetype} + subtype = workout.sub_type + if subtype == "Warming Up": + jsondict['sub_type'] = "WARMUP" + elif subtype == "Cooling Down": + jsondict['sub_type'] = "COOLDOWN" + elif subtype == "Commute": + jsondict['commute'] = True + jsondict['sub_type'] = "COMMUTE" + else: + jsondict['sub_type'] = "NONE" + + if workout.rpe is not None and workout.rpe > 0: + jsondict['icu_rpe'] = workout.rpe + jsondict['commute'] = workout.is_commute + if workout.plannedsession: + jsondict['paired_event_id'] = workout.plannedsession.intervals_icu_id + + url = "https://intervals.icu/api/v1/activity/{activityid}".format(activityid=workout.uploadedtointervals) + response = requests.put(url, headers=headers, json=jsondict) + + response = requests.put(url, headers=headers, json=jsondict) + + if response.status_code not in [200, 201]: + dologging('intervals.icu.log', response.reason) + return 0 + + @app.task def handle_intervals_getworkout(rower, intervalstoken, workoutid, debug=False, **kwargs): authorizationstring = str('Bearer '+intervalstoken) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 1f4fd277..867eab9f 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index 1d31f0ed..755641a0 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -937,6 +937,7 @@ def intervals_webhook_view(request): else: dologging("intervals_webhooks.log",request.body) data = json.loads(request.body) + print(data) try: verificationtoken = data['secret'] except KeyError: diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 3487f0d8..ea7e84e6 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -251,6 +251,7 @@ from rowers.rows import handle_uploaded_file, handle_uploaded_image from rowers.plannedsessions import * from rowers.tasks import handle_makeplot, handle_otwsetpower, handle_sendemailtcx, handle_sendemailcsv from rowers.tasks import ( + handle_intervals_updateworkout, handle_post_workout_api, handle_sendemail_newftp, instroke_static, diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index b69629f8..fb8080fd 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -4611,6 +4611,12 @@ def workout_edit_view(request, id=0, message="", successmessage=""): except IntegrityError: # pragma: no cover pass + if row.uploadedtointervals is not None and row.user.intervals_auto_export: + _ = myqueue(queuehigh, + handle_intervals_updateworkout, + row + ) + if ps: # pragma: no cover add_workouts_plannedsession([row], ps, row.user) @@ -4629,7 +4635,7 @@ def workout_edit_view(request, id=0, message="", successmessage=""): r.rowdatetime = startdatetime r.write_csv(row.csvfilename, gzip=True) dataprep.update_strokedata(encoder.decode_hex(id), r.df) - + successmessage = "Changes saved" messages.info(request, successmessage)