sporttracks, not fully tested
This commit is contained in:
@@ -138,13 +138,13 @@ def workout_c2_upload_view(request, id=0):
|
||||
# Upload workout to SportTracks
|
||||
@permission_required('workout.change_workout', fn=get_workout_by_opaqueid)
|
||||
def workout_sporttracks_upload_view(request, id=0):
|
||||
message = ""
|
||||
st_integration = SportTracksIntegration(request.user)
|
||||
|
||||
# ready to upload. Hurray
|
||||
w = get_workout(id)
|
||||
r = w.user
|
||||
|
||||
message, res = sporttracksstuff.workout_sporttracks_upload(
|
||||
r.user, w, asynchron=True)
|
||||
id = st_integration.workout_export(w)
|
||||
|
||||
messages.info(
|
||||
request, 'Your workout will be synchronized with SportTracks in the background')
|
||||
@@ -240,16 +240,8 @@ def rower_polar_authorize(request): # pragma: no cover
|
||||
def rower_sporttracks_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": SPORTTRACKS_CLIENT_ID,
|
||||
"response_type": "code",
|
||||
"state": state,
|
||||
"redirect_uri": SPORTTRACKS_REDIRECT_URI}
|
||||
|
||||
url = "https://api.sporttracks.mobi/oauth2/authorize?" + \
|
||||
urllib.parse.urlencode(params)
|
||||
st_integration = SportTracksIntegration(request.user)
|
||||
url = st_integration.make_authorization_url()
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@@ -335,24 +327,8 @@ def rower_tp_token_refresh(request):
|
||||
# SportTracks token refresh. URL for manual refresh. Not visible to users
|
||||
@login_required()
|
||||
def rower_sporttracks_token_refresh(request):
|
||||
r = getrower(request.user)
|
||||
res = sporttracksstuff.do_refresh_token(
|
||||
r.sporttracksrefreshtoken,
|
||||
)
|
||||
access_token = res[0]
|
||||
expires_in = res[1]
|
||||
refresh_token = res[2]
|
||||
expirydatetime = timezone.now()+datetime.timedelta(seconds=expires_in)
|
||||
|
||||
r = getrower(request.user)
|
||||
r.sporttrackstoken = access_token
|
||||
r.sporttrackstokenexpirydate = expirydatetime
|
||||
r.sporttracksrefreshtoken = refresh_token
|
||||
|
||||
r.save()
|
||||
|
||||
successmessage = "Tokens refreshed. Good to go"
|
||||
messages.info(request, successmessage)
|
||||
st_integration = SportTracksIntegration(request.user)
|
||||
result = st_integration.token_refresh()
|
||||
|
||||
url = reverse('workouts_view')
|
||||
|
||||
@@ -725,20 +701,8 @@ def rower_process_sporttrackscallback(request):
|
||||
url = reverse('rower_exportsettings_view')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
res = sporttracksstuff.get_token(code)
|
||||
|
||||
access_token = res[0]
|
||||
expires_in = res[1]
|
||||
refresh_token = res[2]
|
||||
|
||||
expirydatetime = timezone.now()+datetime.timedelta(seconds=expires_in)
|
||||
|
||||
r = getrower(request.user)
|
||||
r.sporttrackstoken = access_token
|
||||
r.sporttrackstokenexpirydate = expirydatetime
|
||||
r.sporttracksrefreshtoken = refresh_token
|
||||
|
||||
r.save()
|
||||
st_integration = SportTracksIntegration(request.user)
|
||||
token = st_integration.get_token(code)
|
||||
|
||||
successmessage = "Tokens stored. Good to go. Please check your import/export settings"
|
||||
messages.info(request, successmessage)
|
||||
@@ -1100,17 +1064,8 @@ def workout_stravaimport_view(request, message="", userid=0):
|
||||
alldata = {}
|
||||
|
||||
for stravaid in stravaids:
|
||||
csvfilename = 'media/{code}_{stravaid}.csv'.format(
|
||||
code=uuid4().hex[:16], stravaid=stravaid)
|
||||
_ = myqueue(
|
||||
queue,
|
||||
fetch_strava_workout,
|
||||
r.stravatoken,
|
||||
strava_integration.oauth_data,
|
||||
stravaid,
|
||||
csvfilename,
|
||||
r.user.id
|
||||
)
|
||||
res = strava_integration.get_workout(id)
|
||||
|
||||
# done, redirect to workouts list
|
||||
messages.info(request,
|
||||
'Your Strava workouts will be imported in the background.'
|
||||
@@ -1416,54 +1371,34 @@ def workout_polarimport_view(request, userid=0): # pragma: no cover
|
||||
@permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True)
|
||||
@permission_required('rower.is_not_freecoach', fn=get_user_by_userid, raise_exception=True)
|
||||
def workout_sporttracksimport_view(request, message="", userid=0):
|
||||
r = getrequestrower(request, userid=userid)
|
||||
if r.user != request.user:
|
||||
messages.error(
|
||||
request, 'You can only access your own workouts on the NK Logbook, not those of your athletes')
|
||||
url = reverse('workout_sporttracksimport_view',
|
||||
kwargs={'userid': request.user.id})
|
||||
return HttpResponseRedirect(url)
|
||||
st_integration = SportTracksIntegration(request.user)
|
||||
try:
|
||||
_ = st_integration.open()
|
||||
except NoTokenError:
|
||||
return HttpResponseRedirect("/rowers/me/sporttracksauthorize/")
|
||||
|
||||
res = sporttracksstuff.get_sporttracks_workout_list(request.user)
|
||||
if (res.status_code != 200):
|
||||
if (res.status_code == 401):
|
||||
r = getrower(request.user)
|
||||
if (r.sporttrackstoken == '') or (r.sporttrackstoken is None):
|
||||
s = "Token doesn't exist. Need to authorize"
|
||||
return HttpResponseRedirect("/rowers/me/sporttracksauthorize/")
|
||||
else: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/sporttracksrefresh/")
|
||||
message = "Something went wrong in workout_sporttracksimport_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 = []
|
||||
|
||||
knownstids = uniqify([
|
||||
w.uploadedtosporttracks for w in Workout.objects.filter(user=r)
|
||||
])
|
||||
for item in res.json()['items']:
|
||||
d = int(float(item['total_distance']))
|
||||
i = int(getidfromuri(item['uri']))
|
||||
if i in knownstids: # pragma: no cover
|
||||
nnn = ''
|
||||
else:
|
||||
nnn = 'NEW'
|
||||
n = item['name']
|
||||
ttot = str(datetime.timedelta(seconds=int(float(item['duration']))))
|
||||
s = item['start_time']
|
||||
r = item['type']
|
||||
keys = ['id', 'distance', 'duration',
|
||||
'starttime', 'type', 'name', 'new']
|
||||
values = [i, d, ttot, s, r, n, nnn]
|
||||
res = dict(zip(keys, values))
|
||||
workouts.append(res)
|
||||
workouts = st_integration.get_workout_list()
|
||||
|
||||
r = getrower(request.user)
|
||||
|
||||
if request.method == "POST":
|
||||
try: # pragma: no cover
|
||||
tdict = dict(request.POST.lists())
|
||||
ids = tdict['workoutid']
|
||||
stids = [int(id) for id in ids]
|
||||
alldata = {}
|
||||
|
||||
for id in stids:
|
||||
res = st_integration.get_workout(id)
|
||||
|
||||
# done, redirect to workouts list
|
||||
messages.info(request,
|
||||
'Your SportTracks workouts will be imported in the background.'
|
||||
' It may take a few minutes before they appear.')
|
||||
url = reverse('workouts_view')
|
||||
return HttpResponseRedirect(url)
|
||||
except KeyError: # pragma: no cover
|
||||
pass
|
||||
|
||||
breadcrumbs = [
|
||||
{
|
||||
@@ -1476,12 +1411,17 @@ def workout_sporttracksimport_view(request, message="", userid=0):
|
||||
},
|
||||
]
|
||||
|
||||
return render(request, 'sporttracks_list_import.html',
|
||||
checknew = request.GET.get('selectallnew', False)
|
||||
|
||||
|
||||
return render(request, 'list_import.html',
|
||||
{'workouts': workouts,
|
||||
'breadcrumbs': breadcrumbs,
|
||||
'active': 'nav-workouts',
|
||||
'rower': r,
|
||||
'teams': get_my_teams(request.user),
|
||||
'integration':'SportTracks',
|
||||
'checknew': checknew,
|
||||
})
|
||||
|
||||
return HttpResponse(res) # pragma: no cover
|
||||
@@ -1630,7 +1570,7 @@ importsources = {
|
||||
'strava': StravaIntegration,
|
||||
'polar': polarstuff,
|
||||
'ownapi': ownapistuff,
|
||||
'sporttracks': sporttracksstuff,
|
||||
'sporttracks': SportTracksIntegration,
|
||||
'trainingpeaks': tpstuff,
|
||||
'nk': NKIntegration,
|
||||
}
|
||||
@@ -1698,27 +1638,9 @@ def workout_getimportview_old(request, externalid, source='c2', do_async=True):
|
||||
# Imports all new workouts from SportTracks
|
||||
@login_required()
|
||||
def workout_getsporttracksworkout_all(request):
|
||||
res = sporttracksstuff.get_sporttracks_workout_list(request.user)
|
||||
if (res.status_code == 200):
|
||||
r = getrower(request.user)
|
||||
stids = [int(getidfromuri(item['uri']))
|
||||
for item in res.json()['items']]
|
||||
knownstids = uniqify([
|
||||
w.uploadedtosporttracks for w in Workout.objects.filter(user=r)
|
||||
])
|
||||
newids = [stid for stid in stids if stid not in knownstids]
|
||||
for sporttracksid in newids:
|
||||
id = sporttracksstuff.get_workout(
|
||||
request.user, sporttracksid)
|
||||
|
||||
if id == 0: # pragma: no cover
|
||||
messages.error(
|
||||
request, "Something went wrong with workout {id}".format(id=sporttracksid))
|
||||
|
||||
else:
|
||||
w = Workout.objects.get(id=id)
|
||||
w.uploadedtosporttracks = sporttracksid
|
||||
w.save()
|
||||
st_integration = SportTracksIntegration(request.user)
|
||||
st_integration.get_workouts()
|
||||
messages.info(request,"Your SportTracks workouts will be imported in the background")
|
||||
|
||||
url = reverse('workouts_view')
|
||||
return HttpResponseRedirect(url)
|
||||
@@ -1761,27 +1683,9 @@ def workout_getimportview(request, externalid, source='c2', do_async=True):
|
||||
# Imports all new workouts from SportTracks
|
||||
@login_required()
|
||||
def workout_getsporttracksworkout_all(request):
|
||||
res = sporttracksstuff.get_sporttracks_workout_list(request.user)
|
||||
if (res.status_code == 200):
|
||||
r = getrower(request.user)
|
||||
stids = [int(getidfromuri(item['uri']))
|
||||
for item in res.json()['items']]
|
||||
knownstids = uniqify([
|
||||
w.uploadedtosporttracks for w in Workout.objects.filter(user=r)
|
||||
])
|
||||
newids = [stid for stid in stids if stid not in knownstids]
|
||||
for sporttracksid in newids:
|
||||
id = sporttracksstuff.get_workout(
|
||||
request.user, sporttracksid)
|
||||
|
||||
if id == 0: # pragma: no cover
|
||||
messages.error(
|
||||
request, "Something went wrong with workout {id}".format(id=sporttracksid))
|
||||
|
||||
else:
|
||||
w = Workout.objects.get(id=id)
|
||||
w.uploadedtosporttracks = sporttracksid
|
||||
w.save()
|
||||
st_integration = SportTracksIntegration(request.user)
|
||||
_ = st_integration.get_workouts()
|
||||
messages.info(request,"Your SportTracks workouts will be imported in the background")
|
||||
|
||||
url = reverse('workouts_view')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
Reference in New Issue
Block a user