runkeeper retired, updated sporttraclks
This commit is contained in:
@@ -225,67 +225,6 @@ def workout_c2_upload_view(request,id=0):
|
||||
|
||||
return response
|
||||
|
||||
# Upload workout to RunKeeper
|
||||
@permission_required('workout.change_workout',fn=get_workout_by_opaqueid,raise_exception=True)
|
||||
def workout_runkeeper_upload_view(request,id=0):
|
||||
message = ""
|
||||
w = get_workout(id)
|
||||
r = w.user
|
||||
|
||||
try:
|
||||
thetoken = runkeeper_open(r.user)
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/runkeeperauthorize/")
|
||||
|
||||
# ready to upload. Hurray
|
||||
|
||||
|
||||
data = runkeeperstuff.createrunkeeperworkoutdata(w)
|
||||
if not data: # pragma: no cover
|
||||
message = "Data error"
|
||||
messages.error(request,message)
|
||||
url = reverse(r.defaultlandingpage,
|
||||
kwargs = {
|
||||
'id':id,
|
||||
})
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
authorizationstring = str('Bearer ' + thetoken)
|
||||
headers = {'Authorization': authorizationstring,
|
||||
'user-agent': 'sanderroosendaal',
|
||||
'Content-Type': 'application/vnd.com.runkeeper.NewFitnessActivity+json',
|
||||
'Content-Length':'nnn'}
|
||||
|
||||
url = "https://api.runkeeper.com/fitnessActivities"
|
||||
response = requests.post(url,headers=headers,data=json.dumps(data,default=default))
|
||||
|
||||
# check for duplicate error first
|
||||
if (response.status_code == 409 ): # pragma: no cover # pragma: no cover
|
||||
message = "Duplicate error"
|
||||
messages.error(request,message)
|
||||
w.uploadedtorunkeeper = -1
|
||||
w.save()
|
||||
elif (response.status_code == 201 or response.status_code==200):
|
||||
runkeeperid = runkeeperstuff.getidfromresponse(response)
|
||||
w.uploadedtorunkeeper = runkeeperid
|
||||
w.save()
|
||||
url = reverse('workout_edit_view',
|
||||
kwargs={'id':encoder.encode_hex(w.id)})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
else: # pragma: no cover
|
||||
s = response
|
||||
message = "Something went wrong in workout_runkeeper_upload_view: %s - %s" % (s.reason,s.text)
|
||||
messages.error(request,message)
|
||||
|
||||
|
||||
url = reverse(r.defaultlandingpage,
|
||||
kwargs = {
|
||||
'id':encoder.encode_hex(w.id),
|
||||
}) # pragma: no cover
|
||||
|
||||
return HttpResponseRedirect(url) # pragma: no cover
|
||||
|
||||
|
||||
# Upload workout to SportTracks
|
||||
@permission_required('workout.change_workout',fn=get_workout_by_opaqueid)
|
||||
@@ -384,6 +323,7 @@ def rower_c2_authorize(request): # pragma: no cover
|
||||
"redirect_uri": C2_REDIRECT_URI}
|
||||
url = "http://log.concept2.com/oauth/authorize?"+ urllib.parse.urlencode(params)
|
||||
url += "&scope="+scope
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
# Garmin authorization
|
||||
@@ -429,23 +369,6 @@ def rower_polar_authorize(request): # pragma: no cover
|
||||
|
||||
|
||||
|
||||
# Runkeeper authorization
|
||||
@login_required()
|
||||
def rower_runkeeper_authorize(request): # pragma: no cover
|
||||
# Generate a random string for the state parameter
|
||||
# Save it for use later to prevent xsrf attacks
|
||||
|
||||
state = str(uuid4())
|
||||
|
||||
params = {"client_id": RUNKEEPER_CLIENT_ID,
|
||||
"response_type": "code",
|
||||
"state": state,
|
||||
"redirect_uri": RUNKEEPER_REDIRECT_URI}
|
||||
|
||||
url = "https://runkeeper.com/apps/authorize?"+ urllib.parse.urlencode(params)
|
||||
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
# SportTracks Authorization
|
||||
@login_required()
|
||||
@@ -923,31 +846,6 @@ def rower_process_stravacallback(request):
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
# Process Runkeeper callback
|
||||
@login_required()
|
||||
def rower_process_runkeepercallback(request):
|
||||
code = request.GET['code']
|
||||
res = runkeeperstuff.get_token(code)
|
||||
access_token = res[0]
|
||||
|
||||
if access_token == 0:# pragma: no cover
|
||||
messages.error(request,"Something went wrong importing the token")
|
||||
url = reverse('workouts_view')
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
|
||||
r = getrower(request.user)
|
||||
r.runkeepertoken = access_token
|
||||
|
||||
r.save()
|
||||
|
||||
successmessage = "Tokens stored. Good to go. Please check your import/export settings"
|
||||
messages.info(request,successmessage)
|
||||
url = reverse('rower_exportsettings_view')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
|
||||
# Process SportTracks callback
|
||||
@@ -1498,61 +1396,6 @@ def garmin_details_view(request):
|
||||
return HttpResponse(status=200)
|
||||
|
||||
|
||||
# The page where you select which RunKeeper workout to import
|
||||
@login_required()
|
||||
@permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True)
|
||||
def workout_runkeeperimport_view(request,message="",userid=0):
|
||||
res = runkeeperstuff.get_runkeeper_workout_list(request.user)
|
||||
if (res.status_code != 200):
|
||||
if (res.status_code == 401):
|
||||
r = getrower(request.user)
|
||||
if (r.runkeepertoken == '') or (r.runkeepertoken is None):
|
||||
s = "Token doesn't exist. Need to authorize"
|
||||
return HttpResponseRedirect("/rowers/me/runkeeperauthorize/")
|
||||
message = "Something went wrong in workout_runkeeperimport_view" # pragma: no cover
|
||||
messages.error(request,message) # pragma: no cover
|
||||
|
||||
if settings.DEBUG: # pragma: no cover
|
||||
return HttpResponse(res)
|
||||
else: # pragma: no cover
|
||||
url = reverse('workouts_view')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
workouts = []
|
||||
for item in res.json()['items']:
|
||||
d = int(float(item['total_distance']))
|
||||
i = getidfromuri(item['uri'])
|
||||
ttot = str(datetime.timedelta(seconds=int(float(item['duration']))))
|
||||
s = item['start_time']
|
||||
r = item['type']
|
||||
keys = ['id','distance','duration','starttime','type']
|
||||
values = [i,d,ttot,s,r]
|
||||
|
||||
res = dict(zip(keys,values))
|
||||
workouts.append(res)
|
||||
|
||||
breadcrumbs = [
|
||||
{
|
||||
'url':'/rowers/list-workouts/',
|
||||
'name':'Workouts'
|
||||
},
|
||||
{
|
||||
'url':reverse('workout_runkeeperimport_view'),
|
||||
'name':'Runkeeper'
|
||||
}
|
||||
]
|
||||
|
||||
r = getrower(request.user)
|
||||
|
||||
return render(request,'runkeeper_list_import.html',
|
||||
{'workouts':workouts,
|
||||
'rower':r,
|
||||
'active':'nav-workouts',
|
||||
'breadcrumbs':breadcrumbs,
|
||||
'teams':get_my_teams(request.user),
|
||||
})
|
||||
|
||||
return HttpResponse(res) # pragma: no cover
|
||||
|
||||
|
||||
# the page where you select which Polar workout to Import
|
||||
@@ -1853,18 +1696,26 @@ importlistviews = {
|
||||
'strava':'workout_stravaimport_view',
|
||||
'polar':'workout_polarimport_view',
|
||||
'ownapi':'workout_view',
|
||||
'runkeeper':'workout_runkeeperimport_view',
|
||||
'sporttracks':'workout_sporttracksimport_view',
|
||||
'trainingpeaks':'workout_view',
|
||||
'nk':'workout_nkimport_view',
|
||||
}
|
||||
|
||||
importauthorizeviews = {
|
||||
'c2':'rower_c2_authorize',
|
||||
'strava':'rower_strava_authorize',
|
||||
'polar':'rower_polar_authorize',
|
||||
'ownapi':'workout_view',
|
||||
'sporttracks':'rower_sporttracks_authorize',
|
||||
'trainingpeaks':'rower_tp_authorize',
|
||||
'nk':'rower_nk_authorize',
|
||||
}
|
||||
|
||||
importsources = {
|
||||
'c2':c2stuff,
|
||||
'strava':stravastuff,
|
||||
'polar':polarstuff,
|
||||
'ownapi':ownapistuff,
|
||||
'runkeeper':runkeeperstuff,
|
||||
'sporttracks':sporttracksstuff,
|
||||
'trainingpeaks':tpstuff,
|
||||
'nk':nkstuff,
|
||||
@@ -1894,8 +1745,12 @@ def workout_getrp3importview(request,externalid):
|
||||
|
||||
@login_required()
|
||||
def workout_getimportview(request,externalid,source = 'c2',do_async=True):
|
||||
result = importsources[source].get_workout(request.user,externalid,
|
||||
do_async=do_async)
|
||||
try:
|
||||
result = importsources[source].get_workout(request.user,externalid,
|
||||
do_async=do_async)
|
||||
except NoTokenError:
|
||||
|
||||
return HttpResponseRedirect(reverse(importauthorizeviews[source]))
|
||||
|
||||
if result: # pragma: no cover
|
||||
messages.info(request,"Your workout will be imported in the background")
|
||||
@@ -1919,14 +1774,11 @@ def workout_getsporttracksworkout_all(request):
|
||||
])
|
||||
newids = [stid for stid in stids if not stid in knownstids]
|
||||
for sporttracksid in newids:
|
||||
data,strokedata = sporttracksstuff.get_workout(
|
||||
id = sporttracksstuff.get_workout(
|
||||
request.user,sporttracksid)
|
||||
|
||||
id,message = sporttracksstuff.add_workout_from_data(
|
||||
request.user,sporttracksid,data,strokedata
|
||||
)
|
||||
if id==0: # pragma: no cover
|
||||
messages.error(request,message)
|
||||
messages.error(request,"Something went wrong with workout {id}".format(id=sporttracksid))
|
||||
|
||||
else:
|
||||
w = Workout.objects.get(id=id)
|
||||
|
||||
@@ -158,7 +158,6 @@ import rowers.nkstuff as nkstuff
|
||||
from rowers.c2stuff import c2_open
|
||||
from rowers.nkstuff import nk_open
|
||||
from rowers.rp3stuff import rp3_open
|
||||
from rowers.runkeeperstuff import runkeeper_open
|
||||
from rowers.sporttracksstuff import sporttracks_open
|
||||
from rowers.tpstuff import tp_open
|
||||
from iso8601 import ParseError
|
||||
@@ -170,7 +169,6 @@ import rowers.sporttracksstuff as sporttracksstuff
|
||||
|
||||
|
||||
import rowers.tpstuff as tpstuff
|
||||
import rowers.runkeeperstuff as runkeeperstuff
|
||||
import rowers.rp3stuff as rp3stuff
|
||||
import rowers.ownapistuff as ownapistuff
|
||||
from rowers.ownapistuff import TEST_CLIENT_ID, TEST_CLIENT_SECRET, TEST_REDIRECT_URI
|
||||
@@ -180,7 +178,6 @@ from rowsandall_app.settings import (
|
||||
POLAR_CLIENT_ID, POLAR_REDIRECT_URI, POLAR_CLIENT_SECRET,
|
||||
SPORTTRACKS_CLIENT_ID, SPORTTRACKS_REDIRECT_URI,
|
||||
SPORTTRACKS_CLIENT_SECRET,
|
||||
RUNKEEPER_CLIENT_ID,RUNKEEPER_REDIRECT_URI,RUNKEEPER_CLIENT_SECRET,
|
||||
TP_CLIENT_ID,TP_REDIRECT_URI,TP_CLIENT_KEY,TP_CLIENT_SECRET,
|
||||
RP3_CLIENT_ID,RP3_REDIRECT_URI,RP3_CLIENT_KEY,RP3_CLIENT_SECRET,
|
||||
BRAINTREE_MERCHANT_ID,BRAINTREE_PUBLIC_KEY,BRAINTREE_PRIVATE_KEY,
|
||||
|
||||
@@ -4864,8 +4864,6 @@ def workout_upload_api(request):
|
||||
upload_to_c2 = optionsform.cleaned_data['upload_to_C2']
|
||||
upload_to_strava = optionsform.cleaned_data['upload_to_Strava']
|
||||
upload_to_st = optionsform.cleaned_data['upload_to_SportTracks']
|
||||
upload_to_rk = optionsform.cleaned_data['upload_to_RunKeeper']
|
||||
upload_to_ua = optionsform.cleaned_data['upload_to_MapMyFitness']
|
||||
upload_to_tp = optionsform.cleaned_data['upload_to_TrainingPeaks']
|
||||
makeprivate = optionsform.cleaned_data['makeprivate']
|
||||
else: # pragma: no cover
|
||||
@@ -5042,8 +5040,6 @@ def workout_upload_view(request,
|
||||
upload_to_c2 = uploadoptions.get('upload_to_C2',False)
|
||||
upload_to_strava = uploadoptions.get('upload_to_Strava',False)
|
||||
upload_to_st = uploadoptions.get('upload_to_SportTracks',False)
|
||||
upload_to_rk = uploadoptions.get('upload_to_RunKeeper',False)
|
||||
upload_to_ua = uploadoptions.get('upload_to_MapMyFitness',False)
|
||||
upload_to_tp = uploadoptions.get('upload_to_TrainingPeaks',False)
|
||||
|
||||
response = {}
|
||||
@@ -5093,8 +5089,6 @@ def workout_upload_view(request,
|
||||
upload_to_c2 = optionsform.cleaned_data['upload_to_C2']
|
||||
upload_to_strava = optionsform.cleaned_data['upload_to_Strava']
|
||||
upload_to_st = optionsform.cleaned_data['upload_to_SportTracks']
|
||||
upload_to_rk = optionsform.cleaned_data['upload_to_RunKeeper']
|
||||
upload_to_ua = optionsform.cleaned_data['upload_to_MapMyFitness']
|
||||
upload_to_tp = optionsform.cleaned_data['upload_to_TrainingPeaks']
|
||||
makeprivate = optionsform.cleaned_data['makeprivate']
|
||||
landingpage = optionsform.cleaned_data['landingpage']
|
||||
@@ -5112,8 +5106,6 @@ def workout_upload_view(request,
|
||||
'upload_to_C2':upload_to_c2,
|
||||
'upload_to_Strava':upload_to_strava,
|
||||
'upload_to_SportTracks':upload_to_st,
|
||||
'upload_to_RunKeeper':upload_to_rk,
|
||||
'upload_to_MapMyFitness':upload_to_ua,
|
||||
'upload_to_TrainingPeaks':upload_to_tp,
|
||||
'landingpage':landingpage,
|
||||
'boattype': boattype,
|
||||
@@ -5255,20 +5247,6 @@ def workout_upload_view(request,
|
||||
else:
|
||||
messages.error(request,message)
|
||||
|
||||
if (upload_to_rk): # pragma: no cover
|
||||
try:
|
||||
message,id = runkeeperstuff.workout_runkeeper_upload(
|
||||
request.user,w
|
||||
)
|
||||
except NoTokenError:
|
||||
message = "Please connect to Runkeeper first"
|
||||
id = 0
|
||||
|
||||
if id>1:
|
||||
messages.info(request,message)
|
||||
else:
|
||||
messages.error(request,message)
|
||||
|
||||
|
||||
if (upload_to_tp): # pragma: no cover
|
||||
try:
|
||||
@@ -5447,14 +5425,9 @@ def workout_upload_view(request,
|
||||
if r.sporttracks_auto_export and ispromember(r.user): # pragma: no cover
|
||||
uploadoptions['upload_to_SportTracks'] = True
|
||||
|
||||
if r.runkeeper_auto_export and ispromember(r.user): # pragma: no cover
|
||||
uploadoptions['upload_to_RunKeeper'] = True
|
||||
|
||||
if r.trainingpeaks_auto_export and ispromember(r.user): # pragma: no cover
|
||||
uploadoptions['upload_to_TrainingPeaks'] = True
|
||||
|
||||
if r.mapmyfitness_auto_export and ispromember(r.user): # pragma: no cover
|
||||
uploadoptions['upload_to_MapMyFitness'] = True
|
||||
|
||||
form = DocumentsForm(initial=docformoptions)
|
||||
optionsform = UploadOptionsForm(initial=uploadoptions,
|
||||
|
||||
Reference in New Issue
Block a user