From 2230883e29313ac220bb8daf1102fd667af56636 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 7 Jul 2020 22:16:29 +0200 Subject: [PATCH 1/4] garmin files - not working --- rowers/garmin_stuff.py | 9 +++++++++ rowers/views/importviews.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/rowers/garmin_stuff.py b/rowers/garmin_stuff.py index 3ce43ebf..486a3630 100644 --- a/rowers/garmin_stuff.py +++ b/rowers/garmin_stuff.py @@ -110,6 +110,15 @@ def garmin_open(user): return token +def get_garmin_file(r,callbackURL,starttime): + garmin = OAuth1Session(oauth_data['client_id'], + client_secret=oauth_data['client_secret'], + resource_owner_key=r.garmintoken, + resource_owner_secret=r.garminrefreshtoken, + ) + response = garmin.get(callbackURL) + return 1 + def get_garmin_workout_list(user): r = Rower.objects.get(user=user) if (r.garmintoken == '') or (r.stravatoken is None): diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index a512eca1..1fd2db45 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -1031,6 +1031,37 @@ def garmin_summaries_view(request): return HttpResponse(status=200) +@csrf_exempt +def garmin_newfiles_ping(request): + t = time.localtime() + timestamp = time.strftime('%b-%d-%Y_%H%M', t) + with open('garminlog.log','a') as f: + f.write('\n') + f.write(timestamp) + f.write(' ') + f.write(str(request.body)) + + if request.method != 'POST': + return HttpResponse(status=200) + + data = json.loads(request.body) + files = data['activityFiles'] + for file in data['activityFiles']: + try: + garmintoken = file['userAccessToken'] + try: + r = Rower.objects.get(garmintoken=garmintoken + ) + callbackURL = file['callbackURL'] + starttime = file['startTimeInSeconds'] + job = get_garmin_file(r,callbackURL,starttime) + except Rower.DoesNotExist: + pass + except KeyError: + pass + + return HttpResponse(status=200) + @csrf_exempt def garmin_deregistration_view(request): if request.method != 'POST': From c1803ed4a9436d79cfd51a10f4b33278d98f2b8c Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 8 Jul 2020 15:01:01 +0200 Subject: [PATCH 2/4] more code for garmin files --- rowers/garmin_stuff.py | 20 ++++++++------ rowers/tasks.py | 32 ++++++++++++++++++++++ rowers/templates/rower_exportsettings.html | 4 +-- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/rowers/garmin_stuff.py b/rowers/garmin_stuff.py index 486a3630..6e8d851f 100644 --- a/rowers/garmin_stuff.py +++ b/rowers/garmin_stuff.py @@ -110,14 +110,18 @@ def garmin_open(user): return token -def get_garmin_file(r,callbackURL,starttime): - garmin = OAuth1Session(oauth_data['client_id'], - client_secret=oauth_data['client_secret'], - resource_owner_key=r.garmintoken, - resource_owner_secret=r.garminrefreshtoken, - ) - response = garmin.get(callbackURL) - return 1 +def get_garmin_file(r,callbackURL,starttime,fileType): + job = queuehigh.enqueue( + get_garmin_file, + oauth_data['client_id'], + oauth_data['client_secret'], + garmintoken, + garminrefreshtoken, + r.user.id, + callbackURL,filetype + ) + + return job.id def get_garmin_workout_list(user): r = Rower.objects.get(user=user) diff --git a/rowers/tasks.py b/rowers/tasks.py index e83d08c3..1a63dbd8 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -48,6 +48,8 @@ from rowsandall_app.settings_dev import SITE_URL as SITE_URL_DEV from rowsandall_app.settings import PROGRESS_CACHE_SECRET from rowsandall_app.settings import SETTINGS_NAME from rowsandall_app.settings import workoutemailbox +from rowsandall_app.settings import UPLOAD_SERVICE_SECRET, UPLOAD_SERVICE_URL + import pandas as pd @@ -678,6 +680,36 @@ def handle_getagegrouprecords(self, return 1 +@app.task(bind=True) +def get_garmin_file(client_id,client_secret,garmintoken,garminrefreshtoken,userid,url,filetype): + garmin = OAuth1Session(client_id, + client_secret=client_secret, + resource_owner_key=garmintoken, + resource_owner_secret=garminrefreshtoken, + ) + + filename = 'media/{code}_{id}.'.format( + code = uuid4().hex[:16], + id = userid + )+filetype + + response = garmin.get(url, stream=True) + if response.status_code == 200: + with open(filename, 'wb') as out_file: + shutil.copyfileobj(response.raw, out_file) + + uploadoptions = { + 'secret':UPLOAD_SERVICE_SECRET, + 'user':userid, + 'file': filename, + 'title': 'Import from Garmin File' + } + + response = requests.post(UPLOAD_SERVICE_URL,data=uploadoptions) + + del response + + return 1 @app.task(bind=True) def long_test_task(self,aantal,debug=False,job=None,session_key=None): diff --git a/rowers/templates/rower_exportsettings.html b/rowers/templates/rower_exportsettings.html index 69a6bc40..14c5286b 100644 --- a/rowers/templates/rower_exportsettings.html +++ b/rowers/templates/rower_exportsettings.html @@ -34,12 +34,10 @@ alt="connect with Polar" width="130">

connect with Polar

- - {% endblock %} From 8d31e93fcd00016f1a0e70f3a7cc8f0888ed2523 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 8 Jul 2020 15:11:16 +0200 Subject: [PATCH 3/4] reponse --- rowers/tasks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rowers/tasks.py b/rowers/tasks.py index 1a63dbd8..86fbdcc1 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -698,6 +698,8 @@ def get_garmin_file(client_id,client_secret,garmintoken,garminrefreshtoken,useri with open(filename, 'wb') as out_file: shutil.copyfileobj(response.raw, out_file) + del response + uploadoptions = { 'secret':UPLOAD_SERVICE_SECRET, 'user':userid, @@ -707,8 +709,6 @@ def get_garmin_file(client_id,client_secret,garmintoken,garminrefreshtoken,useri response = requests.post(UPLOAD_SERVICE_URL,data=uploadoptions) - del response - return 1 @app.task(bind=True) From ea2af4830ce324995643adabfa7f73db0ecf2713 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 8 Jul 2020 22:04:27 +0200 Subject: [PATCH 4/4] Seems to work (golang routine to test) --- rowers/garmin_stuff.py | 14 ++++++++------ rowers/tasks.py | 28 +++++++++++++++++++++++----- rowers/urls.py | 1 + rowers/views/importviews.py | 6 +++--- rowers/views/workoutviews.py | 2 ++ 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/rowers/garmin_stuff.py b/rowers/garmin_stuff.py index ec731b31..e28c48bf 100644 --- a/rowers/garmin_stuff.py +++ b/rowers/garmin_stuff.py @@ -22,7 +22,7 @@ from rowsandall_app.settings import ( from pytz import timezone as tz, utc -from rowers.tasks import handle_c2_import_stroke_data, handle_c2_sync +from rowers.tasks import handle_get_garmin_file import django_rq queue = django_rq.get_queue('default') queuelow = django_rq.get_queue('low') @@ -112,14 +112,16 @@ def garmin_open(user): return token def get_garmin_file(r,callbackURL,starttime,fileType): - job = queuehigh.enqueue( - get_garmin_file, + job = myqueue( + queue, + handle_get_garmin_file, oauth_data['client_id'], oauth_data['client_secret'], - garmintoken, - garminrefreshtoken, + r.garmintoken, + r.garminrefreshtoken, r.user.id, - callbackURL,filetype + callbackURL, + fileType, ) return job.id diff --git a/rowers/tasks.py b/rowers/tasks.py index d8d58a7c..1d978ed0 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -12,6 +12,7 @@ import shutil import numpy as np import re import sys +import json from scipy import optimize from scipy.signal import savgol_filter @@ -50,6 +51,7 @@ from rowsandall_app.settings import SETTINGS_NAME from rowsandall_app.settings import workoutemailbox from rowsandall_app.settings import UPLOAD_SERVICE_SECRET, UPLOAD_SERVICE_URL +from requests_oauthlib import OAuth1, OAuth1Session import pandas as pd @@ -680,8 +682,19 @@ def handle_getagegrouprecords(self, return 1 -@app.task(bind=True) -def get_garmin_file(client_id,client_secret,garmintoken,garminrefreshtoken,userid,url,filetype): +@app.task +def handle_get_garmin_file(client_id, + client_secret, + garmintoken, + garminrefreshtoken, + userid, + url, + filetype, + *args, + **kwargs): + + + garmin = OAuth1Session(client_id, client_secret=client_secret, resource_owner_key=garmintoken, @@ -694,6 +707,7 @@ def get_garmin_file(client_id,client_secret,garmintoken,garminrefreshtoken,useri )+filetype response = garmin.get(url, stream=True) + print(response.status_code,filename) if response.status_code == 200: with open(filename, 'wb') as out_file: shutil.copyfileobj(response.raw, out_file) @@ -704,10 +718,14 @@ def get_garmin_file(client_id,client_secret,garmintoken,garminrefreshtoken,useri 'secret':UPLOAD_SERVICE_SECRET, 'user':userid, 'file': filename, - 'title': 'Import from Garmin File' + 'title': filename[6:], + 'workouttype':'water', + 'boattype':'1x', } - - response = requests.post(UPLOAD_SERVICE_URL,data=uploadoptions) + session = requests.session() + newHeaders = {'Content-type': 'application/json', 'Accept': 'text/plain'} + session.headers.update(newHeaders) + response = session.post(UPLOAD_SERVICE_URL,json=uploadoptions) return 1 diff --git a/rowers/urls.py b/rowers/urls.py index 2a308b47..68109a49 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -416,6 +416,7 @@ urlpatterns = [ views.WorkoutDelete.as_view()), name='workout_delete'), re_path(r'^garmin/summaries/',views.garmin_summaries_view,name='garmin_summaries_view'), + re_path(r'^garmin/files/',views.garmin_newfiles_ping,name='garmin_newfiles_ping'), re_path(r'^garmin/activities/',views.garmin_details_view,name='garmin_details_view'), re_path(r'^garmin/deregistration/',views.garmin_deregistration_view,name='garmin_deregistration_view'), # re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/delete/$',login_required( diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index 1fd2db45..0963cbf3 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -1050,11 +1050,11 @@ def garmin_newfiles_ping(request): try: garmintoken = file['userAccessToken'] try: - r = Rower.objects.get(garmintoken=garmintoken - ) + r = Rower.objects.get(garmintoken=garmintoken) callbackURL = file['callbackURL'] starttime = file['startTimeInSeconds'] - job = get_garmin_file(r,callbackURL,starttime) + fileType = file['fileType'] + job = garmin_stuff.get_garmin_file(r,callbackURL,starttime,fileType) except Rower.DoesNotExist: pass except KeyError: diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index d893b53a..83dffac6 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -4624,6 +4624,7 @@ def workout_upload_api(request): q = request.POST post_data = {k: q.getlist(k) if len(q.getlist(k))>1 else v for k, v in q.items()} + # only allow local host hostt = request.get_host().split(':') if hostt[0] not in ['localhost','127.0.0.1','dev.rowsandall.com','rowsandall.com']: @@ -4716,6 +4717,7 @@ def workout_upload_api(request): message = {'status':'false','message':'unable to process file: '+message} else: message = {'status': 'false', 'message': 'unable to process file'} + print(message) return JSONResponse(status=400,data=message) if id == -1: message = {'status': 'true', 'message':message}