diff --git a/rowers/models.py b/rowers/models.py index 05200a7e..616a6216 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1001,6 +1001,7 @@ class Rower(models.Model): nktokenexpirydate = models.DateTimeField(blank=True,null=True) nkrefreshtoken = models.TextField(default='',max_length=1000, blank=True,null=True) + nk_owner_id = models.BigIntegerField(default=0) trainingpeaks_auto_export = models.BooleanField(default=False) diff --git a/rowers/nkstuff.py b/rowers/nkstuff.py index 6c680a6e..b8173755 100644 --- a/rowers/nkstuff.py +++ b/rowers/nkstuff.py @@ -53,51 +53,84 @@ oauth_data = { 'scope':'read', } -import http.client as http_client -http_client.HTTPConnection.debuglevel = 1 +from requests.auth import HTTPBasicAuth -def get_token(code,callbackuri): - #client_id = oauth_data['client_id'] - #client_secret = oauth_data['client_secret'] - #base_uri = oauth_data['base_url'] - - #nk = OAuth2Session(client_id) - #token = nk.fetch_token(base_uri,client_secret=client_secret,authorization_response=callbackuri) - - #print(token) - #return [0,0,0] +def get_token(code): url = oauth_data['base_url'] + headers = {'Accept': 'application/json', - #'Api-Key': oauth_data['client_id'], - #'Content-Type': 'application/x-www-form-urlencoded', + #'Authorization': auth_header, + 'Content-Type': 'application/x-www-form-urlencoded', #'user-agent': 'sanderroosendaal' } + + post_data = {"client_id": oauth_data['client_id'], "grant_type": "authorization_code", "redirect_uri": oauth_data['redirect_uri'], - "client_secret": oauth_data['client_secret'], "code": code, - #"response_type": "code", -# "scope":oauth_data['scope'], } + response = requests.post(url,auth=HTTPBasicAuth(oauth_data['client_id'],oauth_data['client_secret']), + data=post_data) + if response.status_code != 200: + return [0,response.text,0,0] + + token_json = response.json() + + access_token = token_json['access_token'] + refresh_token = token_json['refresh_token'] + expires_in = token_json['expires_in'] + nk_owner_id = token_json['user_id'] + + return [access_token, expires_in, refresh_token,nk_owner_id] - response = requests.post(url,data=json.dumps(post_data),headers=headers) - print('Status Code',response.status_code) - return [0,response.text,0] - #return imports_get_token(code, oauth_data) def nk_open(user): - t = time.localtime() - timestamp = time.strftime('%b-%d-%Y_%H%M', t) - token = imports_open(user,oauth_data) - return token + r = Rower.objects.get(user=user) + print(r.nktokenexpirydate) + if (r.nktoken == '') or (r.nktoken is None): + s = "Token doesn't exist. Need to authorize" + raise NoTokenError("User has no token") + else: + if (timezone.now()>r.nktokenexpirydate): + thetoken = rower_nk_token_refresh(user) + if thetoken == None: + raise NoTokenError("User has no token") + return thetoken + else: + thetoken = r.nktoken + + return thetoken def do_refresh_token(refreshtoken): - return imports_do_refresh_token(refreshtoken, oauth_data) + post_data = {"grant_type": "refresh_token", + #"client_id":NK_CLIENT_ID, + "refresh_token": refreshtoken, + } + + url = oauth_data['base_url'] + + response = requests.post(url,data=post_data,auth=HTTPBasicAuth(oauth_data['client_id'],oauth_data['client_secret'])) + + print(response.request.headers) + print(post_data) + print(response.status_code,response.text) + + if response.status_code != 200: + return [0,0,0] + + token_json = response.json() + + access_token = token_json['access_token'] + refresh_token = token_json['refresh_token'] + expires_in = token_json['expires_in'] + + return access_token, expires_in, refresh_token + def rower_nk_token_refresh(user): r = Rower.objects.get(user=user) @@ -128,16 +161,25 @@ def get_nk_workout_list(user,fake=False): return custom_exception_handler(401,s) else: # ready to fetch. Hurray + endTime = int(arrow.now().timestamp())*1000 + endTime = str(endTime) + startTime = arrow.now()-timedelta(days=90)*1000 + startTime = str(int(startTime.timestamp())) authorizationstring = str('Bearer ' + r.nktoken) headers = {'Authorization': authorizationstring, 'user-agent': 'sanderroosendaal', - 'Content-Type': 'application/json'} + 'Content-Type': 'application/json', + } url = NK_API_LOCATION+"api/v1/sessions" - params = {} # start / end time + params = { + 'startTime':startTime, + 'endTime':endTime, + } # start / end time s = requests.get(url,headers=headers,params=params) + #print(s.status_code,s.json()) return s diff --git a/rowers/templates/rower_exportsettings.html b/rowers/templates/rower_exportsettings.html index 06b3a874..6cabf41f 100644 --- a/rowers/templates/rower_exportsettings.html +++ b/rowers/templates/rower_exportsettings.html @@ -11,6 +11,9 @@ {% if rower.c2token is not None and rower.c2token != '' %} Concept2 Logbook, {% endif %} + {% if rower.nktoken is not None and rower.nktoken != '' %} + NK LiNK, + {% endif %} {% if rower.sporttrackstoken is not None and rower.sporttrackstoken != '' %} SportTracks, {% endif %} diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index 9a689123..d5fb53d1 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -776,14 +776,10 @@ def rower_process_garmincallback(request): # Process NK Callback @login_required() def rower_process_nkcallback(request): - uri = request.build_absolute_uri() - uri = 'https://dunav.ngrok.io/'+uri[22:] - print(uri) - # do stuff try: code = request.GET.get('code',None) - res = nkstuff.get_token(code,uri) + res = nkstuff.get_token(code) except MultiValueDictKeyError: message = "The resource owner or authorization server denied the request" messages.error(request,message) @@ -791,8 +787,6 @@ def rower_process_nkcallback(request): url = reverse('rower_exportsettings_view') return HttpResponseRedirect(url) - uri = request.build_absolute_uri() - access_token = res[0] if access_token == 0: message = res[1] @@ -805,12 +799,14 @@ def rower_process_nkcallback(request): expires_in = res[1] refresh_token = res[2] + nk_owner_id = res[3] expirydatetime = timezone.now()+datetime.timedelta(seconds=expires_in) r = getrower(request.user) r.nktoken = access_token r.nktokenexpirydate = expirydatetime r.nkrefreshtoken = refresh_token + r.nk_owner_id = nk_owner_id r.save() @@ -836,7 +832,7 @@ def workout_nkimport_view(request,userid=0): if (r.stravatoken == '') or (r.stravatoken is None): s = "Token doesn't exist. Need to authorize" return HttpResponseRedirect("/rowers/me/stravaauthorize/") - message = "Something went wrong in workout_stravaimport_view" + message = "Something went wrong in workout_nkimport_view" messages.error(request,message) url = reverse('workouts_view') return HttpResponseRedirect(url) @@ -846,7 +842,7 @@ def workout_nkimport_view(request,userid=0): nkdata = [{ 'id':int(item['id']), 'elapsed_time':item['elapsedTime'], - 'start_date':item['startTime'], + 'start_date':arrow.get(item['startTime']), } for item in res.json()] workouts = [] @@ -857,12 +853,17 @@ def workout_nkimport_view(request,userid=0): n = item['name'] nnn = '' ttot = str(datetime.timedelta(seconds=int(float(item['elapsedTime'])/1000.))) - s = item['startTime'] + s = arrow.get(item['startTime'],tzinfo=r.defaulttimezone).format(arrow.FORMAT_W3C) + #s = arrow.get(item['startTime']).to(r.defaulttimezone).isoformat() keys = ['id','distance','duration','starttime','name','new'] values = [i,d,ttot,s,n,nnn] res = dict(zip(keys, values)) workouts.append(res) + workouts = workouts[::-1] + + print(workouts) + breadcrumbs = [ { 'url':'/rowers/list-workouts/',