Private
Public Access
1
0

sporttracks, not fully tested

This commit is contained in:
Sander Roosendaal
2023-02-13 22:50:01 +01:00
parent 410722a990
commit 91583134d2
11 changed files with 290 additions and 561 deletions

View File

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