Private
Public Access
1
0

intervals.icu fixes

This commit is contained in:
2024-12-28 15:13:04 +01:00
parent f36c98fe56
commit 63202ac2f1
6 changed files with 129 additions and 27 deletions

View File

@@ -1,10 +1,12 @@
from .integrations import SyncIntegration, NoTokenError, create_or_update_syncrecord, get_known_ids
from rowers.models import Rower, User, Workout, TombStone, PlannedSession
from rowingdata import rowingdata
from rowingdata import FITParser as FP
from rowingdata.otherparsers import FitSummaryData
from rowers.rower_rules import user_is_not_basic, user_is_coachee
from rowers import mytypes
import shutil
from rowers.rower_rules import is_workout_user, ispromember
from rowers.utils import myqueue, dologging, custom_exception_handler
from rowers.tasks import handle_intervals_getworkout
@@ -22,7 +24,8 @@ import rowers.dataprep as dataprep
from rowers.opaque import encoder
from rowsandall_app.settings import (
INTERVALS_CLIENT_ID, INTERVALS_REDIRECT_URI, INTERVALS_CLIENT_SECRET, SITE_URL
INTERVALS_CLIENT_ID, INTERVALS_REDIRECT_URI, INTERVALS_CLIENT_SECRET, SITE_URL,
UPLOAD_SERVICE_SECRET, UPLOAD_SERVICE_URL
)
import django_rq
@@ -272,12 +275,103 @@ class IntervalsIntegration(SyncIntegration):
return workouts
def update_workout(self, id, *args, **kwargs) -> int:
_ = self.open()
r = self.rower
headers = {
'Authorization': 'Bearer ' + r.intervals_token,
}
url = self.oauth_data['base_url'] + 'activity/' + str(id)
response = requests.get(url, headers=headers)
if response.status_code != 200:
dologging('intervals.icu.log', response.text)
return 0
data = response.json()
ws = Workout.objects.filter(uploadedtointervals=id)
for w in ws:
try:
w.name = data['name']
except KeyError:
pass
try:
w.notes = data['description']
except KeyError:
pass
try:
w.workouttype = mytypes.intervalsmappinginv[data['type']]
except KeyError:
pass
w.save()
# we stop here now
return 1
url = self.oauth_data['base_url'] + 'activity/' + str(id) + '/fit-file'
response = requests.get(url, headers=headers)
if response.status_code != 200:
dologging('intervals.icu.log', response.text)
return 0
try:
fit_data = response.content
fit_filename = 'media/intervals_' + str(id) + '.fit'
with open(fit_filename, 'wb') as f:
f.write(fit_data)
except:
return 0
try:
row = FP(fit_filename)
rowdata = rowingdata(df=row.df)
rowsummary = FitSummaryData(fit_filename)
except Exception as e:
dologging('intervals.icu.log', e)
return 0
for w in ws:
# copy fit_file to random file name using shutil
temp_filename = 'media/' + str(uuid4()) + '.fit'
try:
shutil.copy(fit_filename, temp_filename)
uploadoptions = {
'secret': UPLOAD_SERVICE_SECRET,
'user': self.rower.user.id,
'boattype': '1x',
'workouttype': w.workouttype,
'file': temp_filename,
'intervalsid': id,
'id': w.id,
}
url = UPLOAD_SERVICE_URL
response = requests.post(url, data=uploadoptions)
except FileNotFoundError:
return 0
except Exception as e:
dologging('intervals.icu.log', e)
# remove fit_file
try:
os.remove(fit_filename)
except:
pass
return 1
def get_workout(self, id, *args, **kwargs) -> int:
_ = self.open()
r = self.rower
# check if workout with this id already exists
known_interval_ids = get_known_ids(r, 'intervalsid')
if id in known_interval_ids:
return self.update_workout(id)
record = create_or_update_syncrecord(r, None, intervalsid=id)
_ = myqueue(queuehigh,
@@ -583,8 +677,8 @@ class IntervalsIntegration(SyncIntegration):
id = record['id']
try:
ws = Workout.objects.filter(uploadedtointervals=id)
if w.user == self.rower:
for w in ws:
for w in ws:
if w.user == self.rower:
w.delete()
except Workout.DoesNotExist:
pass
@@ -592,3 +686,17 @@ class IntervalsIntegration(SyncIntegration):
pass
return 1
def update_activities(self, event, *args, **kwargs):
try:
record = event["activity"]
except KeyError:
records = []
try:
id = record['id']
result = self.update_workout(id)
except KeyError:
pass
return 1