Garmin connect initial auth
This commit is contained in:
82
rowers/garmin_stuff.py
Normal file
82
rowers/garmin_stuff.py
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
from rowers.imports import *
|
||||||
|
import datetime
|
||||||
|
import requests
|
||||||
|
from requests_oauthlib import OAuth1,OAuth1Session
|
||||||
|
from requests import Request, Session
|
||||||
|
import rowers.mytypes as mytypes
|
||||||
|
from rowers.mytypes import otwtypes
|
||||||
|
from rowers.rower_rules import is_workout_user,ispromember
|
||||||
|
from iso8601 import ParseError
|
||||||
|
|
||||||
|
import numpy
|
||||||
|
import json
|
||||||
|
from json.decoder import JSONDecodeError
|
||||||
|
|
||||||
|
from rowsandall_app.settings import (
|
||||||
|
GARMIN_CLIENT_KEY, GARMIN_REDIRECT_URI, GARMIN_CLIENT_SECRET
|
||||||
|
)
|
||||||
|
|
||||||
|
from rowers.tasks import handle_c2_import_stroke_data, handle_c2_sync
|
||||||
|
import django_rq
|
||||||
|
queue = django_rq.get_queue('default')
|
||||||
|
queuelow = django_rq.get_queue('low')
|
||||||
|
queuehigh = django_rq.get_queue('low')
|
||||||
|
from rowers.utils import myqueue
|
||||||
|
from rowers.models import C2WorldClassAgePerformance
|
||||||
|
|
||||||
|
from django.core.exceptions import PermissionDenied
|
||||||
|
|
||||||
|
oauth_data = {
|
||||||
|
'client_id': GARMIN_CLIENT_KEY,
|
||||||
|
'client_secret': GARMIN_CLIENT_SECRET,
|
||||||
|
'redirect_uri': GARMIN_REDIRECT_URI,
|
||||||
|
'authorization_uri': "https://connectapi.garmin.com/oauth-service/oauth/request_token",
|
||||||
|
'content_type': 'application/x-www-form-urlencoded',
|
||||||
|
'tokenname': 'garmintoken',
|
||||||
|
'refreshtokenname': 'garminrefreshtoken',
|
||||||
|
'expirydatename': 'garmintokenexpirydate',
|
||||||
|
'bearer_auth': True,
|
||||||
|
'base_url': "https://connect.garmin.com/oauthConfirm",
|
||||||
|
'scope':'write',
|
||||||
|
'headers': 'Authorization: OAuth oauth_version="1.0"'
|
||||||
|
}
|
||||||
|
|
||||||
|
def garmin_authorize():
|
||||||
|
redirect_uri = oauth_data['redirect_uri']
|
||||||
|
client_secret = oauth_data['client_secret']
|
||||||
|
client_id = oauth_data['client_id']
|
||||||
|
base_uri = oauth_data['base_url']
|
||||||
|
|
||||||
|
|
||||||
|
garmin = OAuth1Session(oauth_data['client_id'],
|
||||||
|
client_secret=oauth_data['client_secret'],
|
||||||
|
)
|
||||||
|
fetch_response = garmin.fetch_request_token(oauth_data['authorization_uri'])
|
||||||
|
resource_owner_key = fetch_response.get('oauth_token')
|
||||||
|
resource_owner_secret = fetch_response.get('oauth_token_secret')
|
||||||
|
|
||||||
|
authorization_url = garmin.authorization_url(base_uri)
|
||||||
|
return authorization_url
|
||||||
|
|
||||||
|
def garmin_processcallback(redirect_respones):
|
||||||
|
garmin = OAuth1Session(oauth_data['client_id'],
|
||||||
|
client_secret=oauth_data['client_secret'],
|
||||||
|
)
|
||||||
|
oauth_response = garmin.parse_authorization_response(redirect_response)
|
||||||
|
|
||||||
|
verifier = oauth_response.get('oauth_verifier')
|
||||||
|
token = oauth_response.get('oauth_token')
|
||||||
|
access_token_url = 'https://connectapi.garmin.com/oauth-service/oauth/access_token'
|
||||||
|
|
||||||
|
# Using OAuth1Session
|
||||||
|
garmin = OAuth1Session(oauth_data['client_id'],
|
||||||
|
client_secret=oauth_data['client_secret'],
|
||||||
|
resource_owner_key=resource_owner_key,
|
||||||
|
resource_owner_secret=resource_owner_secret,
|
||||||
|
verifier=verifier,)
|
||||||
|
oauth_tokens = garmin.fetch_access_token(access_token_url)
|
||||||
|
|
||||||
|
garmintoken = oauth_tokens.get('oauth_token')
|
||||||
|
garminrefreshtoken = oauth_tokens.get('oauth_token_secret')
|
||||||
|
|
||||||
|
return garmintoken,garminrefreshtoken
|
||||||
@@ -834,6 +834,10 @@ class Rower(models.Model):
|
|||||||
polaruserid = models.IntegerField(default=0)
|
polaruserid = models.IntegerField(default=0)
|
||||||
polar_auto_import = models.BooleanField(default=False)
|
polar_auto_import = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
garmintoken = models.CharField(default='',max_length=200,blank=True,null=True)
|
||||||
|
garminrefreshtoken = models.CharField(default='',max_length=1000,
|
||||||
|
blank=True,null=True)
|
||||||
|
|
||||||
stravatoken = models.CharField(default='',max_length=200,blank=True,null=True)
|
stravatoken = models.CharField(default='',max_length=200,blank=True,null=True)
|
||||||
stravatokenexpirydate = models.DateTimeField(blank=True,null=True)
|
stravatokenexpirydate = models.DateTimeField(blank=True,null=True)
|
||||||
stravarefreshtoken = models.CharField(default='',max_length=1000,
|
stravarefreshtoken = models.CharField(default='',max_length=1000,
|
||||||
|
|||||||
@@ -532,6 +532,7 @@ urlpatterns = [
|
|||||||
re_path(r'^me/polarauthorize/$',views.rower_polar_authorize,name='rower_polar_authorize'),
|
re_path(r'^me/polarauthorize/$',views.rower_polar_authorize,name='rower_polar_authorize'),
|
||||||
re_path(r'^me/revokeapp/(?P<id>\d+)/$',views.rower_revokeapp_view,name='rower_revokeapp_view'),
|
re_path(r'^me/revokeapp/(?P<id>\d+)/$',views.rower_revokeapp_view,name='rower_revokeapp_view'),
|
||||||
re_path(r'^me/stravaauthorize/$',views.rower_strava_authorize,name='rower_strava_authorize'),
|
re_path(r'^me/stravaauthorize/$',views.rower_strava_authorize,name='rower_strava_authorize'),
|
||||||
|
re_path(r'^me/garminauthorize/$',views.rower_garmin_authorize,name='rower_garmin_authorize'),
|
||||||
re_path(r'^me/sporttracksauthorize/$',views.rower_sporttracks_authorize,name='rower_sporttracks_authorize'),
|
re_path(r'^me/sporttracksauthorize/$',views.rower_sporttracks_authorize,name='rower_sporttracks_authorize'),
|
||||||
re_path(r'^me/underarmourauthorize/$',views.rower_underarmour_authorize,name='rower_underarmour_authorize'),
|
re_path(r'^me/underarmourauthorize/$',views.rower_underarmour_authorize,name='rower_underarmour_authorize'),
|
||||||
re_path(r'^me/tpauthorize/$',views.rower_tp_authorize,name='rower_tp_authorize'),
|
re_path(r'^me/tpauthorize/$',views.rower_tp_authorize,name='rower_tp_authorize'),
|
||||||
|
|||||||
@@ -401,6 +401,12 @@ def rower_c2_authorize(request):
|
|||||||
url += "&scope="+scope
|
url += "&scope="+scope
|
||||||
return HttpResponseRedirect(url)
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
|
# Garmin authorization
|
||||||
|
@login_required()
|
||||||
|
def rower_garmin_authorize(request):
|
||||||
|
authorization_url = garmin_stuff.garmin_authorize()
|
||||||
|
return HttpResponseRedirect(authorization_url)
|
||||||
|
|
||||||
# Strava Authorization
|
# Strava Authorization
|
||||||
@login_required()
|
@login_required()
|
||||||
def rower_strava_authorize(request):
|
def rower_strava_authorize(request):
|
||||||
@@ -705,7 +711,20 @@ def rower_process_polarcallback(request):
|
|||||||
return HttpResponseRedirect(url)
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
|
|
||||||
|
# process Garmin callback
|
||||||
|
@login_required()
|
||||||
|
def rower_process_garmincallback(request):
|
||||||
|
r = getrower(request.user)
|
||||||
|
absoluteurl = request.build_absolute_uri()
|
||||||
|
garmintoken,garminrefreshtoken = garmin_stuff.garmin_processcallback(absoluteurl)
|
||||||
|
r.garmintoken = garmintoken
|
||||||
|
r.garminrefreshtoken = garminrefreshtoken
|
||||||
|
r.save()
|
||||||
|
|
||||||
|
successmessage = "Tokens stored. Good to go"
|
||||||
|
messages.info(request,successmessage)
|
||||||
|
url = reverse('workouts_view')
|
||||||
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
# Process Strava Callback
|
# Process Strava Callback
|
||||||
@login_required()
|
@login_required()
|
||||||
|
|||||||
@@ -157,6 +157,7 @@ from rowers.sporttracksstuff import sporttracks_open
|
|||||||
from rowers.tpstuff import tp_open
|
from rowers.tpstuff import tp_open
|
||||||
from iso8601 import ParseError
|
from iso8601 import ParseError
|
||||||
import rowers.stravastuff as stravastuff
|
import rowers.stravastuff as stravastuff
|
||||||
|
import rowers.garmin_stuff as garmin_stuff
|
||||||
from rowers.stravastuff import strava_open
|
from rowers.stravastuff import strava_open
|
||||||
import rowers.polarstuff as polarstuff
|
import rowers.polarstuff as polarstuff
|
||||||
import rowers.sporttracksstuff as sporttracksstuff
|
import rowers.sporttracksstuff as sporttracksstuff
|
||||||
|
|||||||
@@ -282,6 +282,10 @@ STRAVA_CLIENT_ID = CFG['strava_client_id']
|
|||||||
STRAVA_CLIENT_SECRET = CFG['strava_client_secret']
|
STRAVA_CLIENT_SECRET = CFG['strava_client_secret']
|
||||||
STRAVA_REDIRECT_URI = CFG['strava_callback']
|
STRAVA_REDIRECT_URI = CFG['strava_callback']
|
||||||
|
|
||||||
|
# Garmin
|
||||||
|
GARMIN_CLIENT_KEY = CFG["garmin_client_key"]
|
||||||
|
GARMIN_CLIENT_SECRET = CFG['garmin_client_secret']
|
||||||
|
GARMIN_REDIRECT_URI = CFG['garmin_callback']
|
||||||
|
|
||||||
# SportTracks
|
# SportTracks
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ urlpatterns += [
|
|||||||
# re_path(r'^admin/rq/',include('django_rq_dashboard.urls')),
|
# re_path(r'^admin/rq/',include('django_rq_dashboard.urls')),
|
||||||
re_path(r'^call\_back',rowersviews.rower_process_callback),
|
re_path(r'^call\_back',rowersviews.rower_process_callback),
|
||||||
re_path(r'^stravacall\_back',rowersviews.rower_process_stravacallback),
|
re_path(r'^stravacall\_back',rowersviews.rower_process_stravacallback),
|
||||||
|
re_path(r'^garmin\_callback',rowersviews.rower_process_garmincallback),
|
||||||
re_path(r'^sporttracks\_callback',rowersviews.rower_process_sporttrackscallback),
|
re_path(r'^sporttracks\_callback',rowersviews.rower_process_sporttrackscallback),
|
||||||
re_path(r'^underarmour\_callback',rowersviews.rower_process_underarmourcallback),
|
re_path(r'^underarmour\_callback',rowersviews.rower_process_underarmourcallback),
|
||||||
re_path(r'^polarflowcallback',rowersviews.rower_process_polarcallback),
|
re_path(r'^polarflowcallback',rowersviews.rower_process_polarcallback),
|
||||||
|
|||||||
Reference in New Issue
Block a user