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">

-
-
{% 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}