strava done
This commit is contained in:
@@ -197,6 +197,8 @@ def create_async_workout(alldata,user,stravaid,debug=False):
|
|||||||
|
|
||||||
from utils import get_strava_stream
|
from utils import get_strava_stream
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Get a Strava workout summary data and stroke data by ID
|
# Get a Strava workout summary data and stroke data by ID
|
||||||
def get_workout(user,stravaid):
|
def get_workout(user,stravaid):
|
||||||
r = Rower.objects.get(user=user)
|
r = Rower.objects.get(user=user)
|
||||||
@@ -225,12 +227,15 @@ def get_workout(user,stravaid):
|
|||||||
distancejson = get_strava_stream(r,'distance',stravaid)
|
distancejson = get_strava_stream(r,'distance',stravaid)
|
||||||
latlongjson = get_strava_stream(r,'latlng',stravaid)
|
latlongjson = get_strava_stream(r,'latlng',stravaid)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
t = np.array(timejson.json()[0]['data'])
|
t = np.array(timejson.json()[0]['data'])
|
||||||
nr_rows = len(t)
|
nr_rows = len(t)
|
||||||
d = np.array(distancejson.json()[1]['data'])
|
d = np.array(distancejson.json()[1]['data'])
|
||||||
if nr_rows == 0:
|
if nr_rows == 0:
|
||||||
return (0,"Error: Time data had zero length")
|
return (0,"Error: Time data had zero length")
|
||||||
|
|
||||||
except IndexError:
|
except IndexError:
|
||||||
d = 0*t
|
d = 0*t
|
||||||
# return (0,"Error: No Distance information in the Strava data")
|
# return (0,"Error: No Distance information in the Strava data")
|
||||||
@@ -277,6 +282,7 @@ def get_workout(user,stravaid):
|
|||||||
strokelength = velo*60./(spm)
|
strokelength = velo*60./(spm)
|
||||||
strokelength[np.isinf(strokelength)] = 0.0
|
strokelength[np.isinf(strokelength)] = 0.0
|
||||||
|
|
||||||
|
|
||||||
pace = 500./(1.0*velo2)
|
pace = 500./(1.0*velo2)
|
||||||
pace[np.isinf(pace)] = 0.0
|
pace[np.isinf(pace)] = 0.0
|
||||||
|
|
||||||
@@ -290,6 +296,7 @@ def get_workout(user,stravaid):
|
|||||||
'strokelength':strokelength,
|
'strokelength':strokelength,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
# startdatetime = datetime.datetime.strptime(startdatetime,"%Y-%m-%d-%H:%M:%S")
|
# startdatetime = datetime.datetime.strptime(startdatetime,"%Y-%m-%d-%H:%M:%S")
|
||||||
|
|
||||||
return [workoutsummary,df]
|
return [workoutsummary,df]
|
||||||
@@ -488,6 +495,7 @@ def add_workout_from_data(user,importid,data,strokedata,
|
|||||||
|
|
||||||
df.sort_values(by='TimeStamp (sec)',ascending=True)
|
df.sort_values(by='TimeStamp (sec)',ascending=True)
|
||||||
|
|
||||||
|
|
||||||
timestr = strftime("%Y%m%d-%H%M%S")
|
timestr = strftime("%Y%m%d-%H%M%S")
|
||||||
|
|
||||||
|
|
||||||
@@ -510,7 +518,6 @@ def add_workout_from_data(user,importid,data,strokedata,
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return id,message
|
return id,message
|
||||||
|
|
||||||
def workout_strava_upload(user,w):
|
def workout_strava_upload(user,w):
|
||||||
|
|||||||
2
rowers/testdata/stravadistancetestdata.txt
vendored
2
rowers/testdata/stravadistancetestdata.txt
vendored
File diff suppressed because one or more lines are too long
2
rowers/testdata/stravahrtestdata.txt
vendored
2
rowers/testdata/stravahrtestdata.txt
vendored
File diff suppressed because one or more lines are too long
2
rowers/testdata/stravalatlongtestdata.txt
vendored
2
rowers/testdata/stravalatlongtestdata.txt
vendored
File diff suppressed because one or more lines are too long
2
rowers/testdata/stravaspmtestdata.txt
vendored
2
rowers/testdata/stravaspmtestdata.txt
vendored
File diff suppressed because one or more lines are too long
2
rowers/testdata/stravatimetestdata.txt
vendored
2
rowers/testdata/stravatimetestdata.txt
vendored
File diff suppressed because one or more lines are too long
2
rowers/testdata/stravavelotestdata.txt
vendored
2
rowers/testdata/stravavelotestdata.txt
vendored
File diff suppressed because one or more lines are too long
1
rowers/testdata/stravaworkoutsummary.txt
vendored
Normal file
1
rowers/testdata/stravaworkoutsummary.txt
vendored
Normal file
File diff suppressed because one or more lines are too long
195
rowers/tests.py
195
rowers/tests.py
@@ -61,6 +61,23 @@ def mocked_requests(*args, **kwargs):
|
|||||||
|
|
||||||
c2workoutlist = json.load(open('rowers/testdata/c2workoutlist.txt'))
|
c2workoutlist = json.load(open('rowers/testdata/c2workoutlist.txt'))
|
||||||
stravaworkoutlist = json.load(open('rowers/testdata/stravaworkoutlist.txt'))
|
stravaworkoutlist = json.load(open('rowers/testdata/stravaworkoutlist.txt'))
|
||||||
|
stravasummaryjson = json.load(open('rowers/testdata/stravaworkoutsummary.txt','r'))
|
||||||
|
|
||||||
|
stravatimejson = json.load(open('rowers/testdata/stravatimetestdata.txt','r'))
|
||||||
|
stravavelojson = json.load(open('rowers/testdata/stravavelotestdata.txt','r'))
|
||||||
|
stravadistancejson = json.load(open('rowers/testdata/stravadistancetestdata.txt','r'))
|
||||||
|
stravalatlongjson = json.load(open('rowers/testdata/stravalatlongtestdata.txt','r'))
|
||||||
|
stravahrjson = json.load(open('rowers/testdata/stravahrtestdata.txt','r'))
|
||||||
|
stravaspmjson = json.load(open('rowers/testdata/stravaspmtestdata.txt','r'))
|
||||||
|
|
||||||
|
stravastreamjson = {
|
||||||
|
'time':stravatimejson,
|
||||||
|
'velocity_smooth':stravavelojson,
|
||||||
|
'distance':stravadistancejson,
|
||||||
|
'latlng':stravalatlongjson,
|
||||||
|
'heartrate':stravahrjson,
|
||||||
|
'cadence':stravaspmjson,
|
||||||
|
}
|
||||||
|
|
||||||
class MockResponse:
|
class MockResponse:
|
||||||
def __init__(self, json_data, status_code):
|
def __init__(self, json_data, status_code):
|
||||||
@@ -103,9 +120,21 @@ def mocked_requests(*args, **kwargs):
|
|||||||
stravaworkoutlistregex = '.*?strava\.com\/api\/v3\/athlete\/activities'
|
stravaworkoutlistregex = '.*?strava\.com\/api\/v3\/athlete\/activities'
|
||||||
stravaworkoutlisttester = re.compile(stravaworkoutlistregex)
|
stravaworkoutlisttester = re.compile(stravaworkoutlistregex)
|
||||||
|
|
||||||
|
stravastreamregex = '.*?strava\.com\/api\/v3\/activities\/\d+\/streams\/(\w.*?)\?'
|
||||||
|
stravastreamtester = re.compile(stravastreamregex)
|
||||||
|
|
||||||
|
stravasummaryregex = '.*?strava\.com\/api\/v3\/activities\/\d+$'
|
||||||
|
stravasummarytester = re.compile(stravasummaryregex)
|
||||||
|
|
||||||
if stravatester.match(args[0]):
|
if stravatester.match(args[0]):
|
||||||
if stravaworkoutlisttester.match(args[0]):
|
if stravaworkoutlisttester.match(args[0]):
|
||||||
return MockResponse(stravaworkoutlist,200)
|
return MockResponse(stravaworkoutlist,200)
|
||||||
|
if stravastreamtester.match(args[0]):
|
||||||
|
metric = stravastreamtester.match(args[0]).group(1)
|
||||||
|
json_data = stravastreamjson[metric]
|
||||||
|
return MockResponse(json_data,200)
|
||||||
|
elif stravasummarytester.match(args[0]):
|
||||||
|
return MockResponse(stravasummaryjson,200)
|
||||||
|
|
||||||
if c2tester.match(args[0]):
|
if c2tester.match(args[0]):
|
||||||
if c2strokestester.match(args[0]):
|
if c2strokestester.match(args[0]):
|
||||||
@@ -245,170 +274,22 @@ class StravaObjects(DjangoTestCase):
|
|||||||
self.r.save()
|
self.r.save()
|
||||||
self.c.login(username='john',password='koeinsloot')
|
self.c.login(username='john',password='koeinsloot')
|
||||||
|
|
||||||
@patch('rowers.stravastuff.requests.post', side_effects=mocked_requests)
|
@patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
|
||||||
def test_strava_list(self, mock_get):
|
def test_strava_list(self, mock_get):
|
||||||
response = self.c.get('/rowers/workout/stravaimport',follow=True)
|
response = self.c.get('/rowers/workout/stravaimport/',follow=True)
|
||||||
|
|
||||||
self.assertEqual(response.status_code,200)
|
self.assertEqual(response.status_code,200)
|
||||||
|
|
||||||
|
@patch('rowers.utils.requests.get', side_effect=mocked_requests)
|
||||||
|
def test_strava_import(self, mock_get):
|
||||||
|
|
||||||
|
response = self.c.get('/rowers/workout/stravaimport/12',follow=True)
|
||||||
|
|
||||||
def test_strokedata(self):
|
self.assertRedirects(response,
|
||||||
timejson = json.load(open('rowers/testdata/stravatimetestdata.txt','r'))
|
expected_url='/rowers/workout/1/edit',
|
||||||
velojson = json.load(open('rowers/testdata/stravavelotestdata.txt','r'))
|
status_code=301,target_status_code=200)
|
||||||
distancejson = json.load(open('rowers/testdata/stravadistancetestdata.txt','r'))
|
|
||||||
latlongjson = json.load(open('rowers/testdata/stravalatlongtestdata.txt','r'))
|
|
||||||
hrjson = json.load(open('rowers/testdata/stravahrtestdata.txt','r'))
|
|
||||||
spmjson = json.load(open('rowers/testdata/stravaspmtestdata.txt','r'))
|
|
||||||
workoutsummary = json.load(open('rowers/testdata/stravasummarytestdata.txt','r'))
|
|
||||||
workoutsummary['timezone'] = "Etc/UTC"
|
|
||||||
startdatetime = workoutsummary['start_date']
|
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
t = np.array(timejson[0]['data'])
|
|
||||||
d = np.array(distancejson[0]['data'])
|
|
||||||
nr_rows = len(t)
|
|
||||||
|
|
||||||
try:
|
|
||||||
spm = np.array( spmjson[1]['data'])
|
|
||||||
except IndexError:
|
|
||||||
spm = np.zeros(nr_rows)
|
|
||||||
|
|
||||||
try:
|
|
||||||
hr = np.array(hrjson[1]['data'])
|
|
||||||
except IndexError:
|
|
||||||
hr = np.zeros(nr_rows)
|
|
||||||
|
|
||||||
try:
|
|
||||||
velo = np.array(velojson[1]['data'])
|
|
||||||
except IndexError:
|
|
||||||
velo = np.zeros(nr_rows)
|
|
||||||
|
|
||||||
dt = np.diff(t).mean()
|
|
||||||
wsize = round(5./dt)
|
|
||||||
|
|
||||||
from stravastuff import ewmovingaverage
|
|
||||||
velo2 = ewmovingaverage(velo,wsize)
|
|
||||||
coords = np.array(latlongjson[0]['data'])
|
|
||||||
try:
|
|
||||||
lat = coords[:,0]
|
|
||||||
lon = coords[:,1]
|
|
||||||
except IndexError:
|
|
||||||
lat = np.zeros(len(t))
|
|
||||||
lon = np.zeros(len(t))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
strokelength = velo*60./(spm)
|
|
||||||
strokelength[np.isinf(strokelength)] = 0.0
|
|
||||||
|
|
||||||
pace = 500./(1.0*velo2)
|
|
||||||
pace[np.isinf(pace)] = 0.0
|
|
||||||
|
|
||||||
strokedata = pd.DataFrame({'t':10*t,
|
|
||||||
'd':10*d,
|
|
||||||
'p':10*pace,
|
|
||||||
'spm':spm,
|
|
||||||
'hr':hr,
|
|
||||||
'lat':lat,
|
|
||||||
'lon':lon,
|
|
||||||
'strokelength':strokelength,
|
|
||||||
})
|
|
||||||
|
|
||||||
from rowers.views import add_workout_from_strokedata
|
|
||||||
|
|
||||||
u = User.objects.create_user('john',
|
|
||||||
'sander@ds.ds',
|
|
||||||
'koeinsloot')
|
|
||||||
u.first_name = 'John'
|
|
||||||
u.last_name = 'Sander'
|
|
||||||
u.save()
|
|
||||||
r = Rower.objects.create(user=u,gdproptin=True,
|
|
||||||
gdproptindate=timezone.now()
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
res = add_workout_from_strokedata(u,1,workoutsummary,strokedata,
|
|
||||||
source='strava')
|
|
||||||
|
|
||||||
def test_strokedatanohr(self):
|
|
||||||
timejson = json.load(open('rowers/testdata/stravatimetestdata.txt','r'))
|
|
||||||
velojson = json.load(open('rowers/testdata/stravavelotestdata.txt','r'))
|
|
||||||
distancejson = json.load(open('rowers/testdata/stravadistancetestdata.txt','r'))
|
|
||||||
latlongjson = json.load(open('rowers/testdata/stravalatlongtestdata.txt','r'))
|
|
||||||
hrjson = json.load(open('rowers/testdata/stravahrtestnodata.txt','r'))
|
|
||||||
spmjson = json.load(open('rowers/testdata/stravaspmtestdata.txt','r'))
|
|
||||||
workoutsummary = json.load(open('rowers/testdata/stravasummarytestdata.txt','r'))
|
|
||||||
workoutsummary['timezone'] = "Etc/UTC"
|
|
||||||
startdatetime = workoutsummary['start_date']
|
|
||||||
|
|
||||||
|
|
||||||
t = np.array(timejson[0]['data'])
|
|
||||||
d = np.array(distancejson[0]['data'])
|
|
||||||
nr_rows = len(t)
|
|
||||||
|
|
||||||
try:
|
|
||||||
spm = np.array( spmjson[1]['data'])
|
|
||||||
except IndexError:
|
|
||||||
spm = np.zeros(nr_rows)
|
|
||||||
|
|
||||||
try:
|
|
||||||
hr = np.array(hrjson[1]['data'])
|
|
||||||
except IndexError:
|
|
||||||
hr = np.zeros(nr_rows)
|
|
||||||
|
|
||||||
try:
|
|
||||||
velo = np.array(velojson[1]['data'])
|
|
||||||
except IndexError:
|
|
||||||
velo = np.zeros(nr_rows)
|
|
||||||
|
|
||||||
dt = np.diff(t).mean()
|
|
||||||
wsize = round(5./dt)
|
|
||||||
|
|
||||||
from stravastuff import ewmovingaverage
|
|
||||||
velo2 = ewmovingaverage(velo,wsize)
|
|
||||||
coords = np.array(latlongjson[0]['data'])
|
|
||||||
try:
|
|
||||||
lat = coords[:,0]
|
|
||||||
lon = coords[:,1]
|
|
||||||
except IndexError:
|
|
||||||
lat = np.zeros(len(t))
|
|
||||||
lon = np.zeros(len(t))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
strokelength = velo*60./(spm)
|
|
||||||
strokelength[np.isinf(strokelength)] = 0.0
|
|
||||||
|
|
||||||
pace = 500./(1.0*velo2)
|
|
||||||
pace[np.isinf(pace)] = 0.0
|
|
||||||
|
|
||||||
strokedata = pd.DataFrame({'t':10*t,
|
|
||||||
'd':10*d,
|
|
||||||
'p':10*pace,
|
|
||||||
'spm':spm,
|
|
||||||
'hr':hr,
|
|
||||||
'lat':lat,
|
|
||||||
'lon':lon,
|
|
||||||
'strokelength':strokelength,
|
|
||||||
})
|
|
||||||
|
|
||||||
from rowers.views import add_workout_from_strokedata
|
|
||||||
|
|
||||||
u = User.objects.create_user('john',
|
|
||||||
'sander@ds.ds',
|
|
||||||
'koeinsloot')
|
|
||||||
u.first_name = 'John'
|
|
||||||
u.last_name = 'Sander'
|
|
||||||
u.save()
|
|
||||||
r = Rower.objects.create(user=u,gdproptin=True,
|
|
||||||
gdproptindate=timezone.now()
|
|
||||||
)
|
|
||||||
|
|
||||||
res = add_workout_from_strokedata(u,1,workoutsummary,strokedata,
|
|
||||||
source='strava')
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -445,4 +445,7 @@ def get_strava_stream(r,metric,stravaid,series_type='time',fetchresolution='high
|
|||||||
metric=metric
|
metric=metric
|
||||||
)
|
)
|
||||||
|
|
||||||
return requests.get(url,headers=headers)
|
|
||||||
|
s = requests.get(url,headers=headers)
|
||||||
|
|
||||||
|
return s
|
||||||
|
|||||||
Reference in New Issue
Block a user