Private
Public Access
1
0

gets a tcx for new workouts

This commit is contained in:
Sander Roosendaal
2018-06-05 16:16:16 +02:00
parent 3dd8921f54
commit aa0431740b
4 changed files with 197 additions and 11 deletions

View File

@@ -118,8 +118,11 @@ def make_authorization_url():
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
def get_polar_workout_list(user): def get_polar_workouts(user):
r = Rower.objects.get(user=user) r = Rower.objects.get(user=user)
exercise_list = []
if (r.polartoken == '') or (r.polartoken is None): if (r.polartoken == '') or (r.polartoken is None):
s = "Token doesn't exist. Need to authorize" s = "Token doesn't exist. Need to authorize"
return custom_exception_handler(401,s) return custom_exception_handler(401,s)
@@ -131,19 +134,52 @@ def get_polar_workout_list(user):
headers = {'Authorization':authorizationstring, headers = {'Authorization':authorizationstring,
'Accept': 'application/json'} 'Accept': 'application/json'}
headers2 = {
'Authorization':authorizationstring,
}
url = 'https://polaraccesslink.com/v3/users/{userid}/exercise-transactions'.format( url = 'https://polaraccesslink.com/v3/users/{userid}/exercise-transactions'.format(
userid = r.polaruserid userid = r.polaruserid
) )
# url = 'https://polaraccesslink.com/v3/users/{userid}/activity-transactions'.format(
# userid = r.polaruserid
# )
print url
response = requests.post(url, headers=headers) response = requests.post(url, headers=headers)
print url
print r.polartoken
print response.status_code
return response if response.status_code == 201:
transactionid = response.json()['transaction-id']
url = 'https://polaraccesslink.com/v3/users/{userid}/exercise-transactions/{transactionid}'.format(
transactionid = transactionid,
userid = r.polaruserid
)
response = requests.get(url, headers=headers)
if response.status_code == 200:
exerciseurls = response.json()['exercises']
for exerciseurl in exerciseurls:
response = requests.get(exerciseurl,headers=headers)
if response.status_code == 200:
exercise_dict = response.json()
tcxuri = exerciseurl+'/tcx'
response = requests.get(tcxuri,headers=headers2)
if response.status_code == 200:
filename = 'media/polarimport{id}.tcx'.format(
id = exercise_dict['id']
)
with open(filename,'w') as fop:
fop.write(response.text)
exercise_dict['filename'] = filename
else:
exercise_dict['filename'] = None
exercise_list.append(exercise_dict)
# commit transaction
requests.put(url, headers=headers)
return exercise_list
def get_polar_user_info(user,physical=False): def get_polar_user_info(user,physical=False):
r = Rower.objects.get(user=user) r = Rower.objects.get(user=user)
@@ -160,6 +196,7 @@ def get_polar_user_info(user,physical=False):
'Accept': 'application/json' 'Accept': 'application/json'
} }
params = { params = {
'user-id': r.polaruserid 'user-id': r.polaruserid
} }
@@ -174,12 +211,78 @@ def get_polar_user_info(user,physical=False):
) )
print url
if physical: if physical:
response = requests.post(url, headers=headers) response = requests.post(url, headers=headers)
else: else:
response = requests.get(url, headers=headers) response = requests.get(url, headers=headers)
return response return response
def get_polar_workout(user,id,transactionid):
r = Rower.objects.get(user=user)
if (r.polartoken == '') or (r.polartoken is None):
s = "Token doesn't exist. Need to authorize"
return custom_exception_handler(401,s)
elif (timezone.now()>r.polartokenexpirydate):
s = "Token expired. Needs to refresh"
return custom_exception_handler(401,s)
else:
authorizationstring = str('Bearer ' + r.polartoken)
headers = {
'Authorization':authorizationstring,
'Accept': 'application/json'
}
url = 'https://polaraccesslink.com/v3/users/{userid}/exercise-transactions'.format(
userid = r.polaruserid
)
response = requests.post(url, headers=headers)
if response.status_code == 201:
transactionid = response.json()['transaction-id']
url = 'https://polaraccesslink.com/v3/users/{userid}/exercise-transactions/{transactionid}'.format(
transactionid = transactionid,
userid = r.polaruserid
)
response = requests.get(url, headers=headers)
if response.status_code == 200:
exerciseurls = response.json()['exercises']
for exerciseurl in exerciseurls:
response = requests.gedt(exerciseurl,headers=headers)
if response.status_code == 200:
exercise_dict = response.json()
thisid = exercise_dict['id']
if thisid == id:
url = 'https://polaraccesslink.com/v3/users/{userid}/exercise-transactions/{transactionid}/exercises/{exerciseid}/tcx'.format(
userid = r.polaruserid,
transactionid = transactionid,
exerciseid = id
)
print "Get TCX"
print url
response = requests.get(url,headers = headers2)
print response.status_code
if response.status_code == 200:
print response.text
result = response.text
# commit transaction
response = requests.put(url,headers=headers)
else:
result = None
return result
return None

View File

@@ -0,0 +1,42 @@
{% extends "base.html" %}
{% load staticfiles %}
{% load rowerfilters %}
{% block title %}Workouts{% endblock %}
{% block content %}
<h1>New Workouts Available on Polar Flow</h1>
<p>Due to a limitation in Polar Flow's API, we can only access new workouts.</p>
{% if workouts %}
<div class="grid_12 alpha">
<table width="70%" class="listtable">
<thead>
<tr>
<th> Import </th>
<th> Date</th>
<th> Duration </th>
<th> Distance </th>
<th> Type</th>
</tr>
</thead>
<tbody>
{% for workout in workouts %}
<tr>
<td>
<a href="/rowers/workout/polarimport/{{ workout|lookup:'id' }}/{{ workout|lookup:'transactionid' }}">Import</a></td>
<td>{{ workout|lookup:'starttime' }}</td>
<td>{{ workout|lookup:'duration' }} </td>
<td>{{ workout|lookup:'distance' }} m</td>
<td>{{ workout|lookup:'type' }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p> No new workouts found </p>
{% endif %}
{% endblock %}

View File

@@ -328,6 +328,8 @@ urlpatterns = [
url(r'^workout/sporttracksimport/$',views.workout_sporttracksimport_view), url(r'^workout/sporttracksimport/$',views.workout_sporttracksimport_view),
url(r'^workout/sporttracksimport/(?P<sporttracksid>\d+)/$',views.workout_getsporttracksworkout_view), url(r'^workout/sporttracksimport/(?P<sporttracksid>\d+)/$',views.workout_getsporttracksworkout_view),
url(r'^workout/sporttracksimport/all/$',views.workout_getsporttracksworkout_all), url(r'^workout/sporttracksimport/all/$',views.workout_getsporttracksworkout_all),
url(r'^workout/polarimport/$',views.workout_polarimport_view),
url(r'^workout/polarimport/(?P<polarid>\d+)/(?P<transactionid>\d+)$',views.workout_getpolarworkout_view),
url(r'^workout/runkeeperimport/$',views.workout_runkeeperimport_view), url(r'^workout/runkeeperimport/$',views.workout_runkeeperimport_view),
url(r'^workout/runkeeperimport/(?P<runkeeperid>\d+)/$',views.workout_getrunkeeperworkout_view), url(r'^workout/runkeeperimport/(?P<runkeeperid>\d+)/$',views.workout_getrunkeeperworkout_view),
url(r'^workout/underarmourimport/$',views.workout_underarmourimport_view), url(r'^workout/underarmourimport/$',views.workout_underarmourimport_view),

View File

@@ -23,6 +23,8 @@ import gc
from pyparsing import ParseException from pyparsing import ParseException
from uuid import uuid4 from uuid import uuid4
import isodate
from django.shortcuts import render from django.shortcuts import render
from django.http import ( from django.http import (
HttpResponse, HttpResponseRedirect, HttpResponse, HttpResponseRedirect,
@@ -2399,10 +2401,9 @@ def rower_polar_authorize(request):
"response_type": "code", "response_type": "code",
"redirect_uri": POLAR_REDIRECT_URI, "redirect_uri": POLAR_REDIRECT_URI,
"state": state, "state": state,
"scope":"accesslink.read_all" # "scope":"accesslink.read_all"
} }
url = "https://flow.polar.com/oauth2/authorization?" +urllib.urlencode(params) url = "https://flow.polar.com/oauth2/authorization?" +urllib.urlencode(params)
print url
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -9644,6 +9645,37 @@ def workout_underarmourimport_view(request,message=""):
return HttpResponse(res) return HttpResponse(res)
# the page where you select which Polar workout to Import
@login_required()
def workout_polarimport_view(request):
exercises = polarstuff.get_polar_workouts(request.user)
workouts = []
for exercise in exercises:
try:
d = exercise['distance']
except KeyError:
d = 0
i = exercise['id']
transactionid = exercise['transaction-id']
starttime = exercise['start-time']
rowtype = exercise['sport']
durationstring = exercise['duration']
duration = isodate.parse_duration(durationstring)
keys = ['id','distance','duration','starttime','type','transactionid']
values = [i,d,duration,starttime,rowtype,transactionid]
res = dict(zip(keys,values))
workouts.append(res)
return render(request, 'polar_list_import.html',
{
'workouts':workouts,
'teams':get_my_teams(request.user),
})
# The page where you select which SportTracks workout to import # The page where you select which SportTracks workout to import
@login_required() @login_required()
def workout_sporttracksimport_view(request,message=""): def workout_sporttracksimport_view(request,message=""):
@@ -9820,6 +9852,13 @@ def workout_c2import_view(request,page=1,message=""):
'page':page, 'page':page,
}) })
# Import a workout from Polar
@login_required()
def workout_getpolarworkout_view(request,polarid,transactionid):
result = polarstuff.get_polar_workout(request.user,polarid,transactionid)
return HttpResponse(result)
# Import a workout from Strava # Import a workout from Strava
@login_required() @login_required()
def workout_getstravaworkout_view(request,stravaid): def workout_getstravaworkout_view(request,stravaid):