Private
Public Access
1
0

Merge branch 'feature/garmin2' into develop

This commit is contained in:
Sander Roosendaal
2020-07-09 10:24:40 +02:00
6 changed files with 101 additions and 4 deletions

View File

@@ -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')
@@ -111,6 +111,21 @@ def garmin_open(user):
return token
def get_garmin_file(r,callbackURL,starttime,fileType):
job = myqueue(
queue,
handle_get_garmin_file,
oauth_data['client_id'],
oauth_data['client_secret'],
r.garmintoken,
r.garminrefreshtoken,
r.user.id,
callbackURL,
fileType,
)
return job.id
def get_garmin_workout_list(user):
r = Rower.objects.get(user=user)
if (r.garmintoken == '') or (r.stravatoken is None):

View File

@@ -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
@@ -48,6 +49,9 @@ 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
from requests_oauthlib import OAuth1, OAuth1Session
import pandas as pd
@@ -678,6 +682,52 @@ def handle_getagegrouprecords(self,
return 1
@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,
resource_owner_secret=garminrefreshtoken,
)
filename = 'media/{code}_{id}.'.format(
code = uuid4().hex[:16],
id = userid
)+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)
del response
uploadoptions = {
'secret':UPLOAD_SERVICE_SECRET,
'user':userid,
'file': filename,
'title': filename[6:],
'workouttype':'water',
'boattype':'1x',
}
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
@app.task(bind=True)
def long_test_task(self,aantal,debug=False,job=None,session_key=None):

View File

@@ -34,12 +34,10 @@
alt="connect with Polar" width="130"></a></p>
<p><a href="/rowers/me/tpauthorize/"><img src="/static/img/TP_logo_horz_2_color.png"
alt="connect with Polar" width="130"></a></p>
<!--
<p><a href="/rowers/me/garminauthorize"><img src="/static/img/garmin_badge_130.png"
alt="connect with Garmin" with="130"></a></p>
-->
{% endblock %}

View File

@@ -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<id>\b[0-9A-Fa-f]+\b)/delete/$',login_required(

View File

@@ -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']
fileType = file['fileType']
job = garmin_stuff.get_garmin_file(r,callbackURL,starttime,fileType)
except Rower.DoesNotExist:
pass
except KeyError:
pass
return HttpResponse(status=200)
@csrf_exempt
def garmin_deregistration_view(request):
if request.method != 'POST':

View File

@@ -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}