From 0c13f798de693df4a27456849d36926fb2aa7e97 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 19 Apr 2021 08:41:48 +0200 Subject: [PATCH] adding async option to NK import --- rowers/c2stuff.py | 2 +- rowers/nkstuff.py | 24 ++++++++++++++++++++++-- rowers/runkeeperstuff.py | 2 +- rowers/sporttracksstuff.py | 2 +- rowers/stravastuff.py | 4 ++-- rowers/tasks.py | 5 ++++- rowers/underarmourstuff.py | 2 +- rowers/urls.py | 1 + rowers/views/importviews.py | 12 +++++++++--- 9 files changed, 42 insertions(+), 12 deletions(-) diff --git a/rowers/c2stuff.py b/rowers/c2stuff.py index 2540fc07..bb166676 100644 --- a/rowers/c2stuff.py +++ b/rowers/c2stuff.py @@ -902,7 +902,7 @@ def make_authorization_url(request): return HttpResponseRedirect(url) # Get workout from C2 ID -def get_workout(user,c2id): +def get_workout(user,c2id,do_async=False): r = Rower.objects.get(user=user) if (r.c2token == '') or (r.c2token is None): s = "Token doesn't exist. Need to authorize" diff --git a/rowers/nkstuff.py b/rowers/nkstuff.py index 82a5f48d..5d82f692 100644 --- a/rowers/nkstuff.py +++ b/rowers/nkstuff.py @@ -247,7 +247,7 @@ def get_nk_workout_list(user,fake=False,after=0,before=0): # -def get_workout(user,nkid): +def get_workout(user,nkid,do_async=False): r = Rower.objects.get(user=user) if (r.nktoken == '') or (r.nktoken is None): s = "Token doesn't exist. Need to authorize" @@ -260,6 +260,27 @@ def get_workout(user,nkid): 'sessionIds': nkid, } + if do_async: + res = get_nk_workout_list(r.user) + if res.status_code != 200: + return 0 + alldata = {} + for item in res.json(): + alldata[item['id']] = item + + res = myqueue( + queuehigh, + handle_nk_async_workout, + alldata, + r.user.id, + r.nktoken, + nkid, + 0, + r.defaulttimezone, + ) + + return {},pd.DataFrame() + authorizationstring = str('Bearer ' + r.nktoken) headers = {'Authorization': authorizationstring, @@ -292,7 +313,6 @@ def get_workout(user,nkid): before = before+timedelta(days=1) before = str(int(before.timestamp())*1000) after = str(int(after.timestamp())*1000) - print(after) url = NK_API_LOCATION+"api/v1/sessions/" diff --git a/rowers/runkeeperstuff.py b/rowers/runkeeperstuff.py index a087f7bf..4329cdb9 100644 --- a/rowers/runkeeperstuff.py +++ b/rowers/runkeeperstuff.py @@ -92,7 +92,7 @@ def get_runkeeper_workout_list(user): return s # Get workout summary data by Runkeeper ID -def get_workout(user,runkeeperid): +def get_workout(user,runkeeperid,do_async=False): r = Rower.objects.get(user=user) if (r.runkeepertoken == '') or (r.runkeepertoken is None): return custom_exception_handler(401,s) diff --git a/rowers/sporttracksstuff.py b/rowers/sporttracksstuff.py index 55cf279f..8cb5d1e4 100644 --- a/rowers/sporttracksstuff.py +++ b/rowers/sporttracksstuff.py @@ -97,7 +97,7 @@ def get_sporttracks_workout_list(user): return s # Get workout summary data by SportTracks ID -def get_workout(user,sporttracksid): +def get_workout(user,sporttracksid,do_async=False): r = Rower.objects.get(user=user) if (r.sporttrackstoken == '') or (r.sporttrackstoken is None): return custom_exception_handler(401,s) diff --git a/rowers/stravastuff.py b/rowers/stravastuff.py index c1b319ae..966dc278 100644 --- a/rowers/stravastuff.py +++ b/rowers/stravastuff.py @@ -382,7 +382,7 @@ def async_get_workout(user,stravaid): return job # Get a Strava workout summary data and stroke data by ID -def get_workout(user,stravaid): +def get_workout(user,stravaid,do_async=False): try: thetoken = strava_open(user) except NoTokenError: @@ -773,7 +773,7 @@ def workout_strava_upload(user,w, quick=False,asynchron=True): activity_type = mytypes.stravamapping[w.workouttype] except KeyError: activity_type = 'Rowing' - + with open(tcxfile,'rb') as f: res,mes = handle_stravaexport( f,w.name, diff --git a/rowers/tasks.py b/rowers/tasks.py index 36008a98..c9355451 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -2894,7 +2894,10 @@ def handle_rp3_async_workout(userid,rp3token,rp3id,startdatetime,max_attempts,de def handle_nk_async_workout(alldata,userid,nktoken,nkid,delaysec,defaulttimezone,debug=False,**kwargs): time.sleep(delaysec) - data = alldata[nkid] + try: + data = alldata[nkid] + except KeyError: + data = alldata[int(nkid)] params = { 'sessionIds': nkid, diff --git a/rowers/underarmourstuff.py b/rowers/underarmourstuff.py index be44ea7f..f230e8de 100644 --- a/rowers/underarmourstuff.py +++ b/rowers/underarmourstuff.py @@ -70,7 +70,7 @@ def get_underarmour_workout_list(user): return s # Get workout summary data by Underarmour ID -def get_workout(user,underarmourid): +def get_workout(user,underarmourid,do_async=False): r = Rower.objects.get(user=user) if (r.underarmourtoken == '') or (r.underarmourtoken is None): return custom_exception_handler(401,s) diff --git a/rowers/urls.py b/rowers/urls.py index 3df7665a..c7b0d31c 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -496,6 +496,7 @@ urlpatterns = [ name='workout_getrp3importview'), re_path(r'^workout/rp3import/all/$',views.workout_getrp3workout_all,name='workout_getrp3workout_all'), re_path(r'^workout/(?P\w+.*)import/(?P\d+)/$',views.workout_getimportview,name='workout_getimportview'), + re_path(r'^workout/(?P\w+.*)import/(?P\d+)/async/$',views.workout_getimportview,{'do_async':True},name='workout_getimportview'), re_path(r'^workout/stravaimport/all/$',views.workout_getstravaworkout_all,name='workout_getstravaworkout_all'), re_path(r'^workout/stravaimport/next/$',views.workout_getstravaworkout_next,name='workout_getstravaworkout_next'), re_path(r'^workout/sporttracksimport/$',views.workout_sporttracksimport_view,name='workout_sporttracksimport_view'), diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index fc19b013..fe8d9d00 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -2001,9 +2001,15 @@ def workout_getrp3importview(request,externalid): return HttpResponseRedirect(url) @login_required() -def workout_getimportview(request,externalid,source = 'c2'): - data,strokedata = importsources[source].get_workout(request.user,externalid) - +def workout_getimportview(request,externalid,source = 'c2',do_async=False): + data,strokedata = importsources[source].get_workout(request.user,externalid, + do_async=do_async) + + if do_async: + messages.info(request,"Your workout will be imported in the background") + url = reverse('workouts_view') + return HttpResponseRedirect(url) + if not data: messages.error(request,"No strokedata received") url = reverse('workouts_view')