intervals.icu fixes
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user