going through importviews ... coverage
This commit is contained in:
@@ -14,6 +14,9 @@ import rowers
|
||||
from rowers import dataprep
|
||||
from rowers import tasks
|
||||
from rowers import c2stuff
|
||||
from rowers import stravastuff
|
||||
import urllib
|
||||
import json
|
||||
|
||||
@pytest.mark.django_db
|
||||
@override_settings(TESTING=True)
|
||||
@@ -461,6 +464,11 @@ class NKObjects(DjangoTestCase):
|
||||
)
|
||||
self.assertTrue(res>0)
|
||||
|
||||
@patch('rowers.nkstuff.requests.post', side_effect=mocked_requests)
|
||||
def notest_nk_callback(self, mock_post):
|
||||
response = self.c.get('/nk_callback?code=absdef23&scope=read',follow=True)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
|
||||
@patch('rowers.nkstuff.requests.get', side_effect=mocked_requests)
|
||||
@patch('rowers.nkstuff.requests.post', side_effect=mocked_requests)
|
||||
@@ -609,6 +617,10 @@ class RP3Objects(DjangoTestCase):
|
||||
res = tasks.handle_rp3_async_workout(userid,rp3token,rp3id,startdatetime,max_attempts)
|
||||
self.assertEqual(res,1)
|
||||
|
||||
@patch('rowers.rp3stuff.requests.post', side_effect=mocked_requests)
|
||||
def notest_rp3_callback(self, mock_post):
|
||||
response = self.c.get('/rp3_callback?code=absdef23&scope=read',follow=True)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
|
||||
#@pytest.mark.django_db
|
||||
@@ -630,6 +642,7 @@ class StravaObjects(DjangoTestCase):
|
||||
self.r.stravatoken = '12'
|
||||
self.r.stravarefreshtoken = '123'
|
||||
self.r.stravatokenexpirydate = arrow.get(datetime.datetime.now()-datetime.timedelta(days=1)).datetime
|
||||
self.r.strava_owner_id = 4
|
||||
|
||||
self.r.save()
|
||||
self.c.login(username='john',password='koeinsloot')
|
||||
@@ -666,6 +679,79 @@ class StravaObjects(DjangoTestCase):
|
||||
csvfilename=filename
|
||||
)
|
||||
|
||||
@patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
|
||||
@patch('rowers.stravastuff.requests.get', side_effect=mocked_requests)
|
||||
def test_strava_webhook(self, mock_get, mock_post):
|
||||
url = reverse('strava_webhook_view')
|
||||
|
||||
params = {
|
||||
'hub.challenge':'aap',
|
||||
'hub.verify_token':stravastuff.webhookverification,
|
||||
}
|
||||
|
||||
url2 = url+'?'+urllib.parse.urlencode(params)
|
||||
|
||||
response = self.c.get(url2)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
data = {
|
||||
'aspect_type':'create',
|
||||
'object_id': 123,
|
||||
'object_type':'activity',
|
||||
'strava_owner': self.r.strava_owner_id,
|
||||
'starttimeunix': arrow.get(datetime.datetime.now()).timestamp(),
|
||||
}
|
||||
|
||||
raw_data = json.dumps(data)
|
||||
|
||||
response = self.c.generic('POST', url, raw_data)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
data = {
|
||||
'aspect_type':'update',
|
||||
'updates':{
|
||||
'title':faker.word(),
|
||||
'type': 'Ride',
|
||||
},
|
||||
'object_id': 123,
|
||||
'object_type':'activity',
|
||||
'strava_owner': self.r.strava_owner_id,
|
||||
'starttimeunix': arrow.get(datetime.datetime.now()).timestamp(),
|
||||
}
|
||||
|
||||
raw_data = json.dumps(data)
|
||||
|
||||
response = self.c.generic('POST', url, raw_data)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
data = {
|
||||
'aspect_type':'delete',
|
||||
'object_id': 123,
|
||||
'object_type':'activity',
|
||||
'strava_owner': self.r.strava_owner_id,
|
||||
'starttimeunix': arrow.get(datetime.datetime.now()).timestamp(),
|
||||
}
|
||||
|
||||
raw_data = json.dumps(data)
|
||||
|
||||
response = self.c.generic('POST', url, raw_data)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
|
||||
|
||||
@patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
|
||||
@patch('rowers.stravastuff.requests.get', side_effect=mocked_requests)
|
||||
@patch('rowers.stravastuff.stravalib.Client',side_effect=MockStravalibClient)
|
||||
def test_strava_upload(self, mock_get, mock_post,MockStravalibClient):
|
||||
response = self.c.get('/rowers/workout/'+encoded1+'/stravauploadw/')
|
||||
|
||||
self.assertRedirects(response,
|
||||
expected_url = '/rowers/workout/'+encoded1+'/edit/',
|
||||
status_code=302,target_status_code=200)
|
||||
|
||||
self.assertEqual(response.url, '/rowers/workout/'+encoded1+'/edit/')
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
|
||||
@patch('rowers.stravastuff.requests.get', side_effect=mocked_requests)
|
||||
@patch('rowers.stravastuff.requests.post', side_effect=mocked_requests)
|
||||
|
||||
@@ -9,6 +9,14 @@ from .statements import *
|
||||
nu = datetime.datetime.now()
|
||||
|
||||
from rowers.rower_rules import is_workout_user
|
||||
from rowers.models import update_records
|
||||
|
||||
class MiscTests(TestCase):
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def test_c2records(self):
|
||||
update_records(verbose=False)
|
||||
|
||||
#@pytest.mark.django_db
|
||||
class WorkoutTests(TestCase):
|
||||
|
||||
@@ -1442,6 +1442,104 @@ class PlannedSessionsView(TestCase):
|
||||
added = plannedsessions.add_team_session(self.team,self.ps_trimp)
|
||||
self.ps_trimp.save()
|
||||
|
||||
s = b"""filename: britishrowing.json
|
||||
name: British Rowing Training Plan Beginner Week 1
|
||||
trainingDays:
|
||||
- order: 1
|
||||
workouts:
|
||||
- workoutName: Week 1 Session 1
|
||||
steps:
|
||||
- stepId: 0
|
||||
wkt_step_name: Warmup
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Warmup
|
||||
description: ""
|
||||
- stepId: 1
|
||||
wkt_step_name: Intervals
|
||||
durationType: Time
|
||||
durationValue: 60000
|
||||
intensity: Active
|
||||
description: ""
|
||||
- stepId: 2
|
||||
wkt_step_name: Interval Rest
|
||||
durationType: Time
|
||||
durationValue: 60000
|
||||
intensity: Rest
|
||||
description: ""
|
||||
- stepId: 3
|
||||
wkt_step_name: Rep
|
||||
durationType: RepeatUntilStepsCmplt
|
||||
durationValue: 1
|
||||
targetValue: 5
|
||||
- stepId: 4
|
||||
wkt_step_name: Cooldown
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Cooldown
|
||||
description: ""
|
||||
sport: ""
|
||||
description: ""
|
||||
- order: 4
|
||||
workouts:
|
||||
- workoutName: Week 1 Session 2
|
||||
steps:
|
||||
- stepId: 0
|
||||
wkt_step_name: Warmup
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Warmup
|
||||
description: ""
|
||||
- stepId: 1
|
||||
wkt_step_name: Interval
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Active
|
||||
description: ""
|
||||
- stepId: 2
|
||||
wkt_step_name: Interval Rest
|
||||
durationType: Time
|
||||
durationValue: 180000
|
||||
intensity: Rest
|
||||
description: ""
|
||||
- stepId: 3
|
||||
wkt_step_name: Rep
|
||||
durationType: RepeatUntilStepsCmplt
|
||||
durationValue: 1
|
||||
targetValue: 5
|
||||
- stepId: 4
|
||||
wkt_step_name: Cooldown
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Cooldown
|
||||
description: ""
|
||||
sport: ""
|
||||
description: ""
|
||||
duration: 7
|
||||
description: ""
|
||||
"""
|
||||
|
||||
self.file_data = {'yaml': SimpleUploadedFile('britishrowing.yml', s)}
|
||||
|
||||
with open('media/temp.yml','wb') as f:
|
||||
f.write(s)
|
||||
|
||||
self.instantplan = InstantPlan(
|
||||
uuid = "79b0dacf-9b49-4f33-9acf-e2e6734e22dc",
|
||||
url = "https://thepeteplan.wordpress.com/beginner-training/",
|
||||
name = faker.word(),
|
||||
goal = faker.word(),
|
||||
duration = 42,
|
||||
description = faker.word(),
|
||||
target = faker.word(),
|
||||
hoursperweek = 3,
|
||||
sessionsperweek = 3,
|
||||
price = 0,
|
||||
yaml = 'temp.yml',
|
||||
)
|
||||
|
||||
self.instantplan.save()
|
||||
|
||||
|
||||
|
||||
def tearDown(self):
|
||||
@@ -1555,6 +1653,29 @@ class PlannedSessionsView(TestCase):
|
||||
response = self.c.post(url,formdata,follow=True)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
def test_deletetarget_view(self):
|
||||
login = self.c.login(username=self.u.username, password=self.password)
|
||||
self.assertTrue(login)
|
||||
|
||||
url = reverse('rower_delete_trainingtarget',kwargs={'id':self.target.id})
|
||||
|
||||
response = self.c.get(url)
|
||||
self.assertEqual(response.status_code,302)
|
||||
|
||||
def test_deletetrainingplan_view(self):
|
||||
login = self.c.login(username=self.u.username, password=self.password)
|
||||
self.assertTrue(login)
|
||||
|
||||
url = reverse('trainingplan_delete_view',kwargs={'pk':self.plan.id})
|
||||
|
||||
response = self.c.get(url)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
form = {}
|
||||
response = self.c.post(url,form)
|
||||
self.assertEqual(response.status_code,302)
|
||||
|
||||
|
||||
|
||||
def test_multicreate_view(self):
|
||||
login = self.c.login(username=self.u.username, password=self.password)
|
||||
@@ -1637,6 +1758,10 @@ class PlannedSessionsView(TestCase):
|
||||
response = self.c.post(url,form_data,follow=True)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
url = reverse('remove_groupsession_view',kwargs={'id':self.ps_trimp.id})
|
||||
response = self.c.get(url)
|
||||
self.assertEqual(response.status_code,302)
|
||||
|
||||
|
||||
def test_teamedit_view(self):
|
||||
login = self.c.login(username=self.u.username, password=self.password)
|
||||
@@ -1908,86 +2033,29 @@ class PlannedSessionsView(TestCase):
|
||||
#'yaml': {'yaml': SimpleUploadedFile('britishrowing.yml', f.read())}
|
||||
}
|
||||
|
||||
s = b"""filename: britishrowing.json
|
||||
name: British Rowing Training Plan Beginner Week 1
|
||||
trainingDays:
|
||||
- order: 1
|
||||
workouts:
|
||||
- workoutName: Week 1 Session 1
|
||||
steps:
|
||||
- stepId: 0
|
||||
wkt_step_name: Warmup
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Warmup
|
||||
description: ""
|
||||
- stepId: 1
|
||||
wkt_step_name: Intervals
|
||||
durationType: Time
|
||||
durationValue: 60000
|
||||
intensity: Active
|
||||
description: ""
|
||||
- stepId: 2
|
||||
wkt_step_name: Interval Rest
|
||||
durationType: Time
|
||||
durationValue: 60000
|
||||
intensity: Rest
|
||||
description: ""
|
||||
- stepId: 3
|
||||
wkt_step_name: Rep
|
||||
durationType: RepeatUntilStepsCmplt
|
||||
durationValue: 1
|
||||
targetValue: 5
|
||||
- stepId: 4
|
||||
wkt_step_name: Cooldown
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Cooldown
|
||||
description: ""
|
||||
sport: ""
|
||||
description: ""
|
||||
- order: 4
|
||||
workouts:
|
||||
- workoutName: Week 1 Session 2
|
||||
steps:
|
||||
- stepId: 0
|
||||
wkt_step_name: Warmup
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Warmup
|
||||
description: ""
|
||||
- stepId: 1
|
||||
wkt_step_name: Interval
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Active
|
||||
description: ""
|
||||
- stepId: 2
|
||||
wkt_step_name: Interval Rest
|
||||
durationType: Time
|
||||
durationValue: 180000
|
||||
intensity: Rest
|
||||
description: ""
|
||||
- stepId: 3
|
||||
wkt_step_name: Rep
|
||||
durationType: RepeatUntilStepsCmplt
|
||||
durationValue: 1
|
||||
targetValue: 5
|
||||
- stepId: 4
|
||||
wkt_step_name: Cooldown
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Cooldown
|
||||
description: ""
|
||||
sport: ""
|
||||
description: ""
|
||||
duration: 7
|
||||
description: ""
|
||||
"""
|
||||
|
||||
file_data = {'yaml': SimpleUploadedFile('britishrowing.yml', s)}
|
||||
|
||||
form = InstantPlanForm(form_data,file_data)
|
||||
form = InstantPlanForm(form_data,self.file_data)
|
||||
if not form.is_valid():
|
||||
print(form.errors)
|
||||
self.assertTrue(form.is_valid())
|
||||
|
||||
# look at a instant plan
|
||||
url = reverse('rower_view_instantplan',kwargs={'id':self.instantplan.uuid})
|
||||
response = self.c.get(url)
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
form_data = {
|
||||
'name':faker.word(),
|
||||
'target': '',
|
||||
'startdate':datetime.datetime.now().strftime('%Y-%m-%d'),
|
||||
'enddate':(datetime.datetime.now()+datetime.timedelta(days=self.instantplan.duration)).strftime('%Y-%m-%d'),
|
||||
'notes': faker.word(),
|
||||
'datechoice':'startdate',
|
||||
}
|
||||
|
||||
form = InstantPlanSelectForm(form_data)
|
||||
self.assertTrue(form.is_valid())
|
||||
|
||||
response = self.c.post(url,form_data,follow=True)
|
||||
|
||||
self.assertEqual(response.status_code,200)
|
||||
|
||||
75
rowers/tests/testdata/temp.yml
vendored
Normal file
75
rowers/tests/testdata/temp.yml
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
filename: britishrowing.json
|
||||
name: British Rowing Training Plan Beginner Week 1
|
||||
trainingDays:
|
||||
- order: 1
|
||||
workouts:
|
||||
- workoutName: Week 1 Session 1
|
||||
steps:
|
||||
- stepId: 0
|
||||
wkt_step_name: Warmup
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Warmup
|
||||
description: ""
|
||||
- stepId: 1
|
||||
wkt_step_name: Intervals
|
||||
durationType: Time
|
||||
durationValue: 60000
|
||||
intensity: Active
|
||||
description: ""
|
||||
- stepId: 2
|
||||
wkt_step_name: Interval Rest
|
||||
durationType: Time
|
||||
durationValue: 60000
|
||||
intensity: Rest
|
||||
description: ""
|
||||
- stepId: 3
|
||||
wkt_step_name: Rep
|
||||
durationType: RepeatUntilStepsCmplt
|
||||
durationValue: 1
|
||||
targetValue: 5
|
||||
- stepId: 4
|
||||
wkt_step_name: Cooldown
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Cooldown
|
||||
description: ""
|
||||
sport: ""
|
||||
description: ""
|
||||
- order: 4
|
||||
workouts:
|
||||
- workoutName: Week 1 Session 2
|
||||
steps:
|
||||
- stepId: 0
|
||||
wkt_step_name: Warmup
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Warmup
|
||||
description: ""
|
||||
- stepId: 1
|
||||
wkt_step_name: Interval
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Active
|
||||
description: ""
|
||||
- stepId: 2
|
||||
wkt_step_name: Interval Rest
|
||||
durationType: Time
|
||||
durationValue: 180000
|
||||
intensity: Rest
|
||||
description: ""
|
||||
- stepId: 3
|
||||
wkt_step_name: Rep
|
||||
durationType: RepeatUntilStepsCmplt
|
||||
durationValue: 1
|
||||
targetValue: 5
|
||||
- stepId: 4
|
||||
wkt_step_name: Cooldown
|
||||
durationType: Time
|
||||
durationValue: 300000
|
||||
intensity: Cooldown
|
||||
description: ""
|
||||
sport: ""
|
||||
description: ""
|
||||
duration: 7
|
||||
description: ""
|
||||
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
Binary file not shown.
@@ -7,7 +7,7 @@ from rowers.views.statements import *
|
||||
|
||||
import numpy
|
||||
|
||||
def default(o):
|
||||
def default(o): # pragma: no cover
|
||||
if isinstance(o, numpy.int64): return int(o)
|
||||
raise TypeError
|
||||
|
||||
@@ -21,7 +21,7 @@ def workout_tp_upload_view(request,id=0):
|
||||
res = -1
|
||||
try:
|
||||
thetoken = tp_open(r.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/tpauthorize/")
|
||||
|
||||
# ready to upload. Hurray
|
||||
@@ -35,7 +35,7 @@ def workout_tp_upload_view(request,id=0):
|
||||
r.tptoken,tcxfile,
|
||||
name=w.name
|
||||
)
|
||||
if res == 0:
|
||||
if res == 0: # pragma: no cover
|
||||
message = "Upload to TrainingPeaks failed with status code "+str(status_code)+": "+reason
|
||||
try:
|
||||
os.remove(tcxfile)
|
||||
@@ -50,7 +50,7 @@ def workout_tp_upload_view(request,id=0):
|
||||
os.remove(tcxfile)
|
||||
messages.info(request,'Uploaded to TrainingPeaks')
|
||||
|
||||
else: # no tcxfile
|
||||
else: # pragma: no cover # no tcxfile
|
||||
message = "Upload to TrainingPeaks failed"
|
||||
w.uploadedtotp = -1
|
||||
w.save()
|
||||
@@ -74,10 +74,10 @@ def workout_strava_upload_view(request,id=0):
|
||||
|
||||
try:
|
||||
thetoken = strava_open(request.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/stravaauthorize/")
|
||||
|
||||
if (r.stravatoken == '') or (r.stravatoken is None):
|
||||
if (r.stravatoken == '') or (r.stravatoken is None): # pragma: no cover
|
||||
s = "Token doesn't exist. Need to authorize"
|
||||
return HttpResponseRedirect("/rowers/me/stravaauthorize/")
|
||||
else:
|
||||
@@ -99,9 +99,9 @@ def workout_strava_upload_view(request,id=0):
|
||||
if activity_type == 'match':
|
||||
try:
|
||||
activity_type = mytypes.stravamapping[w.workouttype]
|
||||
except KeyError:
|
||||
except KeyError: # pragma: no cover
|
||||
activity_type = 'Ride'
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
try:
|
||||
activity_type = mytypes.stravamapping[w.workouttype]
|
||||
except KeyError:
|
||||
@@ -112,7 +112,7 @@ def workout_strava_upload_view(request,id=0):
|
||||
r.stravatoken,
|
||||
description=newnotes,
|
||||
activity_type=activity_type,quick=False)
|
||||
if res==0:
|
||||
if res==0: # pragma: no cover
|
||||
messages.error(request,mes)
|
||||
w.uploadedtostrava = -1
|
||||
w.save()
|
||||
@@ -132,13 +132,13 @@ def workout_strava_upload_view(request,id=0):
|
||||
w.save()
|
||||
try:
|
||||
os.remove(tcxfile)
|
||||
except WindowsError:
|
||||
except WindowsError: # pragma: no cover
|
||||
pass
|
||||
url = reverse('workout_edit_view',kwargs={'id':w.id})
|
||||
|
||||
|
||||
messages.info(request,mes)
|
||||
except:
|
||||
except: # pragma: no cover
|
||||
with open("media/stravaerrors.log","a") as errorlog:
|
||||
errorstring = str(sys.exc_info()[0])
|
||||
timestr = strftime("%Y%m%d-%H%M%S")
|
||||
@@ -146,7 +146,7 @@ def workout_strava_upload_view(request,id=0):
|
||||
errorlog.write("views.py line 826\r\n")
|
||||
message = 'Error: '+errorstring
|
||||
messages.error(request,message)
|
||||
else: # No tcxfile
|
||||
else: # pragma: no cover # No tcxfile
|
||||
message = "Strava Data error "+tcxmessg
|
||||
messages.error(request,message)
|
||||
w.uploadedtostrava = -1
|
||||
@@ -164,7 +164,7 @@ def workout_strava_upload_view(request,id=0):
|
||||
}
|
||||
)
|
||||
response = HttpResponseRedirect(url)
|
||||
except ActivityUploadFailed as e:
|
||||
except ActivityUploadFailed as e: # pragma: no cover
|
||||
message = "Strava Upload error: %s" % e
|
||||
messages.error(request,message)
|
||||
w.uploadedtostrava = -1
|
||||
@@ -188,10 +188,10 @@ def workout_c2_upload_view(request,id=0):
|
||||
|
||||
try:
|
||||
message,c2id = c2stuff.workout_c2_upload(request.user,w)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/c2authorize/")
|
||||
|
||||
if message and c2id <=0:
|
||||
if message and c2id <=0: # pragma: no cover
|
||||
messages.error(request,message)
|
||||
elif message:
|
||||
messages.info(request,message)
|
||||
@@ -216,14 +216,14 @@ def workout_runkeeper_upload_view(request,id=0):
|
||||
|
||||
try:
|
||||
thetoken = runkeeper_open(r.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/runkeeperauthorize/")
|
||||
|
||||
# ready to upload. Hurray
|
||||
|
||||
|
||||
data = runkeeperstuff.createrunkeeperworkoutdata(w)
|
||||
if not data:
|
||||
if not data: # pragma: no cover
|
||||
message = "Data error"
|
||||
messages.error(request,message)
|
||||
url = reverse(r.defaultlandingpage,
|
||||
@@ -242,7 +242,7 @@ def workout_runkeeper_upload_view(request,id=0):
|
||||
response = requests.post(url,headers=headers,data=json.dumps(data,default=default))
|
||||
|
||||
# check for duplicate error first
|
||||
if (response.status_code == 409 ):
|
||||
if (response.status_code == 409 ): # pragma: no cover # pragma: no cover
|
||||
message = "Duplicate error"
|
||||
messages.error(request,message)
|
||||
w.uploadedtorunkeeper = -1
|
||||
@@ -255,7 +255,7 @@ def workout_runkeeper_upload_view(request,id=0):
|
||||
kwargs={'id':encoder.encode_hex(w.id)})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
s = response
|
||||
message = "Something went wrong in workout_runkeeper_upload_view: %s - %s" % (s.reason,s.text)
|
||||
messages.error(request,message)
|
||||
@@ -264,9 +264,9 @@ def workout_runkeeper_upload_view(request,id=0):
|
||||
url = reverse(r.defaultlandingpage,
|
||||
kwargs = {
|
||||
'id':encoder.encode_hex(w.id),
|
||||
})
|
||||
}) # pragma: no cover
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
return HttpResponseRedirect(url) # pragma: no cover
|
||||
|
||||
# Upload workout to Underarmour
|
||||
@permission_required('workout.change_workout',fn=get_workout_by_opaqueid,raise_exception=True)
|
||||
@@ -277,14 +277,14 @@ def workout_underarmour_upload_view(request,id=0):
|
||||
|
||||
try:
|
||||
thetoken = underarmour_open(r.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/underarmourauthorize/")
|
||||
|
||||
# ready to upload. Hurray
|
||||
|
||||
|
||||
data = underarmourstuff.createunderarmourworkoutdata(w)
|
||||
if not data:
|
||||
if not data: # pragma: no cover
|
||||
message = "Data error"
|
||||
messages.error(request,message)
|
||||
url = reverse(r.defaultlandingpage,
|
||||
@@ -305,7 +305,7 @@ def workout_underarmour_upload_view(request,id=0):
|
||||
|
||||
|
||||
# check for duplicate error first
|
||||
if (response.status_code == 409 ):
|
||||
if (response.status_code == 409 ): # pragma: no cover # pragma: no cover
|
||||
message = "Duplicate error"
|
||||
messages.error(request,message)
|
||||
w.uploadedtounderarmour = -1
|
||||
@@ -317,7 +317,7 @@ def workout_underarmour_upload_view(request,id=0):
|
||||
url = reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(w.id)})
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
s = response
|
||||
message = "Something went wrong in workout_underarmour_upload_view: %s " % s.reason
|
||||
messages.error(request,message)
|
||||
@@ -325,9 +325,9 @@ def workout_underarmour_upload_view(request,id=0):
|
||||
url = reverse(r.defaultlandingpage,
|
||||
kwargs = {
|
||||
'id':encoder.encode_hex(w.id),
|
||||
})
|
||||
}) # pragma: no cover
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
return HttpResponseRedirect(url) # pragma: no cover
|
||||
|
||||
# Upload workout to SportTracks
|
||||
@permission_required('workout.change_workout',fn=get_workout_by_opaqueid)
|
||||
@@ -339,14 +339,14 @@ def workout_sporttracks_upload_view(request,id=0):
|
||||
|
||||
try:
|
||||
thetoken = sporttracks_open(r.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/sporttracksauthorize/")
|
||||
|
||||
|
||||
|
||||
data = sporttracksstuff.createsporttracksworkoutdata(w)
|
||||
|
||||
if not data:
|
||||
if not data: # pragma: no cover
|
||||
message = "Data error"
|
||||
messages.error(request,message)
|
||||
url = reverse(r.defaultlandingpage,
|
||||
@@ -365,7 +365,7 @@ def workout_sporttracks_upload_view(request,id=0):
|
||||
|
||||
|
||||
# check for duplicate error first
|
||||
if (response.status_code == 409 ):
|
||||
if (response.status_code == 409 ): # pragma: no cover
|
||||
message = "Duplicate error"
|
||||
messages.error(request,message)
|
||||
w.uploadedtosporttracks = -1
|
||||
@@ -380,7 +380,7 @@ def workout_sporttracks_upload_view(request,id=0):
|
||||
|
||||
url = reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(w.id)})
|
||||
return HttpResponseRedirect(url)
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
s = response
|
||||
message = "Something went wrong in workout_sporttracks_upload_view: %s" % s.reason
|
||||
messages.error(request,message)
|
||||
@@ -388,14 +388,14 @@ def workout_sporttracks_upload_view(request,id=0):
|
||||
url = reverse(r.defaultlandingpage,
|
||||
kwargs = {
|
||||
'id':encoder.encode_hex(w.id),
|
||||
})
|
||||
}) # pragma: no cover
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
return HttpResponseRedirect(url) # pragma: no cover
|
||||
|
||||
|
||||
# NK LiNK authorization
|
||||
@login_required()
|
||||
def rower_nk_authorize(request):
|
||||
def rower_nk_authorize(request): # pragma: no cover
|
||||
state = str(uuid4())
|
||||
scope = "read"
|
||||
params = {
|
||||
@@ -415,7 +415,7 @@ def rower_nk_authorize(request):
|
||||
|
||||
# Concept2 authorization
|
||||
@login_required()
|
||||
def rower_c2_authorize(request):
|
||||
def rower_c2_authorize(request): # pragma: no cover
|
||||
# Generate a random string for the state parameter
|
||||
# Save it for use later to prevent xsrf attacks
|
||||
|
||||
@@ -430,7 +430,7 @@ def rower_c2_authorize(request):
|
||||
|
||||
# Garmin authorization
|
||||
@login_required()
|
||||
def rower_garmin_authorize(request):
|
||||
def rower_garmin_authorize(request): # pragma: no cover
|
||||
authorization_url,token,secret = garmin_stuff.garmin_authorize()
|
||||
request.session['garmin_owner_key'] = token
|
||||
request.session['garmin_owner_secret'] = secret
|
||||
@@ -438,7 +438,7 @@ def rower_garmin_authorize(request):
|
||||
|
||||
# Strava Authorization
|
||||
@login_required()
|
||||
def rower_strava_authorize(request):
|
||||
def rower_strava_authorize(request): # pragma: no cover
|
||||
# Generate a random string for the state parameter
|
||||
# Save it for use later to prevent xsrf attacks
|
||||
|
||||
@@ -455,7 +455,7 @@ def rower_strava_authorize(request):
|
||||
|
||||
# Polar Authorization
|
||||
@login_required()
|
||||
def rower_polar_authorize(request):
|
||||
def rower_polar_authorize(request): # pragma: no cover
|
||||
|
||||
state = str(uuid4())
|
||||
|
||||
@@ -473,7 +473,7 @@ def rower_polar_authorize(request):
|
||||
|
||||
# Runkeeper authorization
|
||||
@login_required()
|
||||
def rower_runkeeper_authorize(request):
|
||||
def rower_runkeeper_authorize(request): # pragma: no cover
|
||||
# Generate a random string for the state parameter
|
||||
# Save it for use later to prevent xsrf attacks
|
||||
|
||||
@@ -491,7 +491,7 @@ def rower_runkeeper_authorize(request):
|
||||
|
||||
# SportTracks Authorization
|
||||
@login_required()
|
||||
def rower_sporttracks_authorize(request):
|
||||
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
|
||||
|
||||
@@ -509,7 +509,7 @@ def rower_sporttracks_authorize(request):
|
||||
|
||||
# Underarmour Authorization
|
||||
@login_required()
|
||||
def rower_underarmour_authorize(request):
|
||||
def rower_underarmour_authorize(request): # pragma: no cover
|
||||
# Generate a random string for the state parameter
|
||||
# Save it for use later to prevent xsrf attacks
|
||||
|
||||
@@ -526,7 +526,7 @@ def rower_underarmour_authorize(request):
|
||||
|
||||
# Underarmour Authorization
|
||||
@login_required()
|
||||
def rower_rp3_authorize(request):
|
||||
def rower_rp3_authorize(request): # pragma: no cover
|
||||
# Generate a random string for the state parameter
|
||||
# Save it for use later to prevent xsrf attacks
|
||||
|
||||
@@ -541,7 +541,7 @@ def rower_rp3_authorize(request):
|
||||
|
||||
# Underarmour Authorization
|
||||
@login_required()
|
||||
def rower_tp_authorize(request):
|
||||
def rower_tp_authorize(request): # pragma: no cover
|
||||
# Generate a random string for the state parameter
|
||||
# Save it for use later to prevent xsrf attacks
|
||||
|
||||
@@ -576,7 +576,7 @@ def rower_c2_token_refresh(request):
|
||||
|
||||
successmessage = "Tokens refreshed. Good to go"
|
||||
messages.info(request,successmessage)
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
message = "Something went wrong (refreshing tokens). Please reauthorize:"
|
||||
messages.error(request,message)
|
||||
|
||||
@@ -677,7 +677,7 @@ def rower_process_callback(request):
|
||||
try:
|
||||
code = request.GET['code']
|
||||
res = c2stuff.get_token(code)
|
||||
except MultiValueDictKeyError:
|
||||
except MultiValueDictKeyError: # pragma: no cover
|
||||
message = "The resource owner or authorization server denied the request"
|
||||
messages.error(request,message)
|
||||
|
||||
@@ -686,7 +686,7 @@ def rower_process_callback(request):
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
access_token = res[0]
|
||||
if access_token == 0:
|
||||
if access_token == 0: # pragma: no cover
|
||||
message = res[1]
|
||||
message += ' Contact info@rowsandall.com if this behavior persists.'
|
||||
messages.error(request,message)
|
||||
@@ -716,12 +716,12 @@ def rower_process_callback(request):
|
||||
|
||||
# dummy
|
||||
@login_required()
|
||||
def rower_process_twittercallback(request):
|
||||
def rower_process_twittercallback(request): # pragma: no cover
|
||||
return "dummy"
|
||||
|
||||
# Process Polar Callback
|
||||
@login_required()
|
||||
def rower_process_polarcallback(request):
|
||||
def rower_process_polarcallback(request): # pragma: no cover
|
||||
try:
|
||||
code = request.GET['code']
|
||||
except MultiValueDictKeyError:
|
||||
@@ -754,7 +754,7 @@ def rower_process_polarcallback(request):
|
||||
|
||||
# process Garmin callback
|
||||
@login_required()
|
||||
def rower_process_garmincallback(request):
|
||||
def rower_process_garmincallback(request): # pragma: no cover
|
||||
r = getrower(request.user)
|
||||
absoluteurl = request.build_absolute_uri()
|
||||
|
||||
@@ -775,7 +775,7 @@ def rower_process_garmincallback(request):
|
||||
|
||||
# Process NK Callback
|
||||
@login_required()
|
||||
def rower_process_nkcallback(request):
|
||||
def rower_process_nkcallback(request): # pragma: no cover
|
||||
# do stuff
|
||||
try:
|
||||
code = request.GET.get('code',None)
|
||||
@@ -819,7 +819,7 @@ def rower_process_nkcallback(request):
|
||||
def workout_getnkworkout_all(request):
|
||||
try:
|
||||
thetoken = nk_open(request.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("rower_nk_authorize")
|
||||
|
||||
r = getrequestrower(request)
|
||||
@@ -828,7 +828,7 @@ def workout_getnkworkout_all(request):
|
||||
|
||||
if result:
|
||||
messages.info(request,"Your NK workouts will be imported in the coming few minutes")
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
messages.error(request,"Your NK workouts import failed")
|
||||
|
||||
url = reverse('workouts_view')
|
||||
@@ -840,12 +840,12 @@ def workout_nkimport_view(request,userid=0,after=0,before=0):
|
||||
r = getrequestrower(request,userid=userid)
|
||||
try:
|
||||
thetoken = nk_open(request.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/nkauthorize/")
|
||||
|
||||
res = nkstuff.get_nk_workout_list(request.user,before=before,after=after)
|
||||
|
||||
if (res.status_code != 200):
|
||||
if (res.status_code != 200): # pragma: no cover
|
||||
if (res.status_code == 401):
|
||||
r = getrower(request.user)
|
||||
if (r.stravatoken == '') or (r.stravatoken is None):
|
||||
@@ -869,7 +869,7 @@ def workout_nkimport_view(request,userid=0,after=0,before=0):
|
||||
with open('nkblocked.json','r') as nkblocked:
|
||||
jsondata = json.load(nkblocked)
|
||||
parkedids = jsondata['ids']
|
||||
except FileNotFoundError:
|
||||
except FileNotFoundError: # pragma: no cover
|
||||
pass
|
||||
|
||||
knownnkids = uniqify(knownnkids+tombstones+parkedids)
|
||||
@@ -893,7 +893,7 @@ def workout_nkimport_view(request,userid=0,after=0,before=0):
|
||||
n = item['name']
|
||||
if i in knownnkids:
|
||||
nnn = ''
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
nnn = 'NEW'
|
||||
ttot = str(datetime.timedelta(seconds=int(float(item['elapsedTime'])/1000.)))
|
||||
s = arrow.get(item['startTime'],tzinfo=r.defaulttimezone).format(arrow.FORMAT_RFC850)
|
||||
@@ -931,10 +931,10 @@ def rower_process_stravacallback(request):
|
||||
try:
|
||||
code = request.GET['code']
|
||||
scope = request.GET['scope']
|
||||
except MultiValueDictKeyError:
|
||||
except MultiValueDictKeyError:# pragma: no cover
|
||||
try:
|
||||
message = request.GET['error']
|
||||
except MultiValueDictKeyError:
|
||||
except MultiValueDictKeyError:# pragma: no cover
|
||||
message = "access error"
|
||||
|
||||
messages.error(request,message)
|
||||
@@ -964,7 +964,7 @@ def rower_process_stravacallback(request):
|
||||
messages.info(request,successmessage)
|
||||
url = reverse('rower_exportsettings_view')
|
||||
return HttpResponseRedirect(url)
|
||||
else:
|
||||
else:# pragma: no cover
|
||||
message = "Something went wrong with the Strava authorization"
|
||||
messages.error(request,message)
|
||||
url = reverse('rower_exportsettings_view')
|
||||
@@ -979,7 +979,7 @@ def rower_process_runkeepercallback(request):
|
||||
res = runkeeperstuff.get_token(code)
|
||||
access_token = res[0]
|
||||
|
||||
if access_token == 0:
|
||||
if access_token == 0:# pragma: no cover
|
||||
messages.error(request,"Something went wrong importing the token")
|
||||
url = reverse('workouts_view')
|
||||
|
||||
@@ -1004,7 +1004,7 @@ def rower_process_runkeepercallback(request):
|
||||
def rower_process_sporttrackscallback(request):
|
||||
try:
|
||||
code = request.GET['code']
|
||||
except:
|
||||
except:# pragma: no cover
|
||||
messages.error(request,"Sorry, something went wrong.")
|
||||
url = reverse('rower_exportsettings_view')
|
||||
return HttpResponseRedirect(url)
|
||||
@@ -1058,7 +1058,7 @@ def rower_process_underarmourcallback(request):
|
||||
|
||||
# Process RP3 callback
|
||||
@login_required()
|
||||
def rower_process_rp3callback(request):
|
||||
def rower_process_rp3callback(request): # pragma: no cover
|
||||
try:
|
||||
code = request.GET['code']
|
||||
except MultiValueDictKeyError:
|
||||
@@ -1095,7 +1095,7 @@ def rower_process_rp3callback(request):
|
||||
def rower_process_tpcallback(request):
|
||||
try:
|
||||
code = request.GET['code']
|
||||
except MultiValueDictKeyError:
|
||||
except MultiValueDictKeyError: # pragma: no cover
|
||||
messages.error(request,"There was an error with the callback")
|
||||
try:
|
||||
errormessage = request.GET['error']
|
||||
@@ -1128,7 +1128,7 @@ def rower_process_tpcallback(request):
|
||||
|
||||
# Process Own API callback - for API testing purposes
|
||||
@login_required()
|
||||
def rower_process_testcallback(request):
|
||||
def rower_process_testcallback(request): # pragma: no cover
|
||||
code = request.GET['code']
|
||||
res = ownapistuff.get_token(code)
|
||||
|
||||
@@ -1153,13 +1153,13 @@ def workout_rp3import_view(request,userid=0):
|
||||
|
||||
try:
|
||||
thetoken = rp3stuff.rp3_open(request.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
url = reverse('rower_rp3_authorize')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
res = rp3stuff.get_rp3_workout_list(request.user)
|
||||
|
||||
if (res.status_code != 200):
|
||||
if (res.status_code != 200): # pragma: no cover
|
||||
if (res.status_code == 401):
|
||||
r = getrower(request.user)
|
||||
if (r.stravatoken == '') or (r.stravatoken is None):
|
||||
@@ -1185,7 +1185,7 @@ def workout_rp3import_view(request,userid=0):
|
||||
|
||||
for key,data in workouts_list.iterrows():
|
||||
i = data['id']
|
||||
if i in knownrp3ids:
|
||||
if i in knownrp3ids: # pragma: no cover
|
||||
nnn = ''
|
||||
else:
|
||||
nnn = 'NEW'
|
||||
@@ -1229,14 +1229,14 @@ def workout_stravaimport_view(request,message="",userid=0):
|
||||
# messages.info(request,"You cannot import other people's workouts from Strava")
|
||||
try:
|
||||
thetoken = strava_open(request.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/stravaauthorize/")
|
||||
|
||||
|
||||
res = stravastuff.get_strava_workout_list(request.user)
|
||||
|
||||
|
||||
if (res.status_code != 200):
|
||||
if (res.status_code != 200): # pragma: no cover
|
||||
if (res.status_code == 401):
|
||||
r = getrower(request.user)
|
||||
if (r.stravatoken == '') or (r.stravatoken is None):
|
||||
@@ -1258,7 +1258,7 @@ def workout_stravaimport_view(request,message="",userid=0):
|
||||
|
||||
wfailed = Workout.objects.filter(user=r,uploadedtostrava=-1)
|
||||
|
||||
for w in wfailed:
|
||||
for w in wfailed: # pragma: no cover
|
||||
for item in stravadata:
|
||||
elapsed_time = item['elapsed_time']
|
||||
start_date = item['start_date']
|
||||
@@ -1282,7 +1282,7 @@ def workout_stravaimport_view(request,message="",userid=0):
|
||||
for item in res.json():
|
||||
d = int(float(item['distance']))
|
||||
i = item['id']
|
||||
if i in knownstravaids:
|
||||
if i in knownstravaids: # pragma: no cover
|
||||
nnn = ''
|
||||
else:
|
||||
nnn = 'NEW'
|
||||
@@ -1317,7 +1317,7 @@ def workout_stravaimport_view(request,message="",userid=0):
|
||||
'teams':get_my_teams(request.user),
|
||||
})
|
||||
|
||||
return HttpResponse(res)
|
||||
return HttpResponse(res) # pragma: no cover
|
||||
|
||||
# for Strava webhook request validation
|
||||
@csrf_exempt
|
||||
@@ -1481,7 +1481,7 @@ def strava_webhook_view(request):
|
||||
|
||||
# For push notifications from Garmin
|
||||
@csrf_exempt
|
||||
def garmin_summaries_view(request):
|
||||
def garmin_summaries_view(request): # pragma: no cover
|
||||
if request.method != 'POST':
|
||||
return HttpResponse(status=200)
|
||||
|
||||
@@ -1504,7 +1504,7 @@ def garmin_summaries_view(request):
|
||||
return HttpResponse(status=200)
|
||||
|
||||
@csrf_exempt
|
||||
def garmin_newfiles_ping(request):
|
||||
def garmin_newfiles_ping(request): # pragma: no cover
|
||||
t = time.localtime()
|
||||
timestamp = time.strftime('%b-%d-%Y_%H%M', t)
|
||||
|
||||
@@ -1528,7 +1528,7 @@ def garmin_newfiles_ping(request):
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
return HttpResponse(status=200)
|
||||
return HttpResponse(status=200) # pragma: no cover
|
||||
|
||||
@csrf_exempt
|
||||
def garmin_deregistration_view(request):
|
||||
@@ -1544,16 +1544,16 @@ def garmin_deregistration_view(request):
|
||||
r = Rower.objects.get(garmintoken=garmintoken)
|
||||
r.garmintoken = ''
|
||||
r.save()
|
||||
except Rower.DoesNotExist:
|
||||
except Rower.DoesNotExist: # pragma: no cover
|
||||
pass
|
||||
except KeyError:
|
||||
except KeyError: # pragma: no cover
|
||||
pass
|
||||
|
||||
return HttpResponse(status=200)
|
||||
|
||||
@csrf_exempt
|
||||
def garmin_details_view(request):
|
||||
if request.method != 'POST':
|
||||
if request.method != 'POST': # pragma: no cover
|
||||
return HttpResponse(status=200)
|
||||
|
||||
t = time.localtime()
|
||||
@@ -1577,12 +1577,12 @@ def workout_runkeeperimport_view(request,message="",userid=0):
|
||||
if (r.runkeepertoken == '') or (r.runkeepertoken is None):
|
||||
s = "Token doesn't exist. Need to authorize"
|
||||
return HttpResponseRedirect("/rowers/me/runkeeperauthorize/")
|
||||
message = "Something went wrong in workout_runkeeperimport_view"
|
||||
messages.error(request,message)
|
||||
message = "Something went wrong in workout_runkeeperimport_view" # pragma: no cover
|
||||
messages.error(request,message) # pragma: no cover
|
||||
|
||||
if settings.DEBUG:
|
||||
if settings.DEBUG: # pragma: no cover
|
||||
return HttpResponse(res)
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
url = reverse('workouts_view')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@@ -1620,7 +1620,7 @@ def workout_runkeeperimport_view(request,message="",userid=0):
|
||||
'teams':get_my_teams(request.user),
|
||||
})
|
||||
|
||||
return HttpResponse(res)
|
||||
return HttpResponse(res) # pragma: no cover
|
||||
|
||||
# The page where you select which RunKeeper workout to import
|
||||
@login_required()
|
||||
@@ -1638,7 +1638,7 @@ def workout_underarmourimport_view(request,message="",userid=0):
|
||||
n = item['name']
|
||||
try:
|
||||
d = item['aggregates']['distance_total']
|
||||
except KeyError:
|
||||
except KeyError: # pragma: no cover
|
||||
d = 0
|
||||
try:
|
||||
ttot = item['aggregates']['active_time_total']
|
||||
@@ -1671,12 +1671,12 @@ def workout_underarmourimport_view(request,message="",userid=0):
|
||||
'teams':get_my_teams(request.user),
|
||||
})
|
||||
|
||||
return HttpResponse(res)
|
||||
return HttpResponse(res) # pragma: no cover
|
||||
|
||||
# the page where you select which Polar workout to Import
|
||||
@login_required()
|
||||
@permission_required('rower.is_coach',fn=get_user_by_userid,raise_exception=True)
|
||||
def workout_polarimport_view(request,userid=0):
|
||||
def workout_polarimport_view(request,userid=0): # pragma: no cover
|
||||
exercises = polarstuff.get_polar_workouts(request.user)
|
||||
workouts = []
|
||||
|
||||
@@ -1686,7 +1686,7 @@ def workout_polarimport_view(request,userid=0):
|
||||
messages.error(request,'Not authorized. You need to connect to Polar first')
|
||||
url = reverse('workouts_view')
|
||||
return HttpResponseRedirect(url)
|
||||
except:
|
||||
except: # pragma: no cover
|
||||
pass
|
||||
|
||||
for exercise in exercises:
|
||||
@@ -1744,11 +1744,11 @@ def workout_sporttracksimport_view(request,message="",userid=0):
|
||||
if (r.sporttrackstoken == '') or (r.sporttrackstoken is None):
|
||||
s = "Token doesn't exist. Need to authorize"
|
||||
return HttpResponseRedirect("/rowers/me/sporttracksauthorize/")
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/sporttracksrefresh/")
|
||||
message = "Something went wrong in workout_sporttracksimport_view"
|
||||
messages.error(request,message)
|
||||
if settings.DEBUG:
|
||||
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:
|
||||
url = reverse('workouts_view')
|
||||
@@ -1764,7 +1764,7 @@ def workout_sporttracksimport_view(request,message="",userid=0):
|
||||
for item in res.json()['items']:
|
||||
d = int(float(item['total_distance']))
|
||||
i = int(getidfromuri(item['uri']))
|
||||
if i in knownstids:
|
||||
if i in knownstids: # pragma: no cover
|
||||
nnn = ''
|
||||
else:
|
||||
nnn = 'NEW'
|
||||
@@ -1802,10 +1802,10 @@ def workout_sporttracksimport_view(request,message="",userid=0):
|
||||
|
||||
# List of workouts on Concept2 logbook. This view only used for debugging
|
||||
@login_required()
|
||||
def c2listdebug_view(request,page=1,message=""):
|
||||
def c2listdebug_view(request,page=1,message=""): # pragma: no cover
|
||||
try:
|
||||
thetoken = c2_open(request.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/c2authorize/")
|
||||
|
||||
r = getrower(request.user)
|
||||
@@ -1845,10 +1845,10 @@ def c2listdebug_view(request,page=1,message=""):
|
||||
|
||||
# Import all unknown workouts available on Concept2 logbook
|
||||
@login_required()
|
||||
def workout_getc2workout_all(request,page=1,message=""):
|
||||
def workout_getc2workout_all(request,page=1,message=""): # pragma: no cover
|
||||
try:
|
||||
thetoken = c2_open(request.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/c2authorize/")
|
||||
|
||||
r = getrequestrower(request)
|
||||
@@ -1864,10 +1864,10 @@ def workout_getc2workout_all(request,page=1,message=""):
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@login_required()
|
||||
def workout_getrp3workout_all(request):
|
||||
def workout_getrp3workout_all(request): # pragma: no cover
|
||||
try:
|
||||
thetoken = rp3_open(request.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/rp3authorize/")
|
||||
|
||||
r = getrequestrower(request)
|
||||
@@ -1891,12 +1891,12 @@ def workout_c2import_view(request,page=1,userid=0,message=""):
|
||||
|
||||
try:
|
||||
thetoken = c2_open(request.user)
|
||||
except NoTokenError:
|
||||
except NoTokenError: # pragma: no cover
|
||||
return HttpResponseRedirect("/rowers/me/c2authorize/")
|
||||
|
||||
res = c2stuff.get_c2_workout_list(request.user,page=page)
|
||||
|
||||
if (res.status_code != 200):
|
||||
if (res.status_code != 200): # pragma: no cover
|
||||
message = "Something went wrong in workout_c2import_view (C2 token refresh)"
|
||||
messages.error(request,message)
|
||||
url = reverse('workouts_view')
|
||||
@@ -1915,7 +1915,7 @@ def workout_c2import_view(request,page=1,userid=0,message=""):
|
||||
with open('c2blocked.json','r') as c2blocked:
|
||||
jsondata = json.load(c2blocked)
|
||||
parkedids = jsondata['ids']
|
||||
except FileNotFoundError:
|
||||
except FileNotFoundError: # pragma: no cover
|
||||
pass
|
||||
|
||||
knownc2ids = uniqify(knownc2ids+tombstones+parkedids)
|
||||
@@ -1931,7 +1931,7 @@ def workout_c2import_view(request,page=1,userid=0,message=""):
|
||||
c = item['comments']
|
||||
if i in knownc2ids:
|
||||
nnn = ''
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
nnn = 'NEW'
|
||||
keys = ['id','distance','duration','starttime','rowtype','source','comment','new']
|
||||
values = [i,d,ttot,s,r,s2,c,nnn]
|
||||
@@ -2005,12 +2005,12 @@ def workout_getimportview(request,externalid,source = 'c2',do_async=False):
|
||||
data,strokedata = importsources[source].get_workout(request.user,externalid,
|
||||
do_async=do_async)
|
||||
|
||||
if do_async:
|
||||
if do_async: # pragma: no cover
|
||||
messages.info(request,"Your workout will be imported in the background")
|
||||
url = reverse('workouts_view')
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
if not data:
|
||||
if not data: # pragma: no cover
|
||||
messages.error(request,"No strokedata received")
|
||||
url = reverse('workouts_view')
|
||||
|
||||
@@ -2033,7 +2033,7 @@ def workout_getimportview(request,externalid,source = 'c2',do_async=False):
|
||||
pass
|
||||
|
||||
|
||||
if strokedata.empty:
|
||||
if strokedata.empty: # pragma: no cover
|
||||
distance = data['distance']
|
||||
c2id = data['id']
|
||||
workouttype = mytypes.c2mappinginv[data['type']]
|
||||
@@ -2106,7 +2106,7 @@ def workout_getimportview(request,externalid,source = 'c2',do_async=False):
|
||||
|
||||
w = get_workout(encoder.encode_hex(id))
|
||||
|
||||
if 'workout' in data:
|
||||
if 'workout' in data: # pragma: no cover
|
||||
if 'splits' in data['workout']:
|
||||
splitdata = data['workout']['splits']
|
||||
elif 'intervals' in data['workout']:
|
||||
@@ -2117,7 +2117,7 @@ def workout_getimportview(request,externalid,source = 'c2',do_async=False):
|
||||
splitdata = False
|
||||
|
||||
# splitdata (only for C2)
|
||||
if splitdata:
|
||||
if splitdata: # pragma: no cover
|
||||
w.summary,sa,results = c2stuff.summaryfromsplitdata(splitdata,data,w.csvfilename,workouttype=workouttype)
|
||||
w.save()
|
||||
|
||||
@@ -2142,20 +2142,20 @@ def workout_getimportview(request,externalid,source = 'c2',do_async=False):
|
||||
w.uploadedtostrava = externalid
|
||||
elif source == 'c2':
|
||||
w.uploadedtoc2 = externalid
|
||||
elif source == 'polar':
|
||||
elif source == 'polar': # pragma: no cover
|
||||
w.uploadedtopolar = externalid
|
||||
elif source == 'runkeeper':
|
||||
w.uploadedtorunkeeper = externalid
|
||||
elif source == 'sporttracks':
|
||||
w.uploadedtosporttracks = externalid
|
||||
elif source == 'trainingpeaks':
|
||||
elif source == 'trainingpeaks': # pragma: no cover
|
||||
w.uploadedtotp = externalid
|
||||
elif source == 'underarmour':
|
||||
w.uploadedtounderarmour = externalid
|
||||
|
||||
w.save()
|
||||
|
||||
if message:
|
||||
if message: # pragma: no cover
|
||||
messages.error(request,message)
|
||||
|
||||
r = getrower(request.user)
|
||||
@@ -2206,7 +2206,7 @@ def workout_getsporttracksworkout_all(request):
|
||||
def workout_getstravaworkout_all(request):
|
||||
r = getrower(request.user)
|
||||
res = stravastuff.get_strava_workouts(r)
|
||||
if res == 1:
|
||||
if res == 1: # pragma: no cover
|
||||
messages.info(request,"Your workouts are being imported and should appear on the site in the next 15 minutes")
|
||||
else:
|
||||
messages.error(request,"Couldn't import Strava workouts ")
|
||||
@@ -2217,7 +2217,7 @@ def workout_getstravaworkout_all(request):
|
||||
|
||||
# Imports all new workouts from SportTracks
|
||||
@login_required()
|
||||
def workout_getstravaworkout_next(request):
|
||||
def workout_getstravaworkout_next(request): # pragma: no cover
|
||||
|
||||
r = Rower.objects.get(user=request.user)
|
||||
|
||||
|
||||
@@ -1192,7 +1192,7 @@ def plannedsession_teamedit_view(request,
|
||||
url = reverse('plannedsessions_view')
|
||||
|
||||
|
||||
if "_continue" in request.POST:
|
||||
if "_continue" in request.POST: # pragma: no cover
|
||||
url = reverse(plannedsession_edit_view,
|
||||
kwargs={
|
||||
'id':int(ps.id),
|
||||
@@ -1648,10 +1648,10 @@ def plannedsessions_manage_view(request,userid=0,
|
||||
ps = PlannedSession.objects.get(id=ps_form.cleaned_data['plannedsession'])
|
||||
if w_form.is_valid():
|
||||
selectedworkouts = w_form.cleaned_data['workouts']
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
selectedworkouts = []
|
||||
|
||||
if len(selectedworkouts)==0:
|
||||
if len(selectedworkouts)==0: # pragma: no cover
|
||||
for w in ws:
|
||||
remove_workout_plannedsession(w,ps)
|
||||
|
||||
@@ -1664,7 +1664,7 @@ def plannedsessions_manage_view(request,userid=0,
|
||||
result,comments,errors = add_workouts_plannedsession(workouts,ps,r)
|
||||
for c in comments:
|
||||
messages.info(request,c)
|
||||
for er in errors:
|
||||
for er in errors: # pragma: no cover
|
||||
messages.error(request,er)
|
||||
|
||||
|
||||
@@ -2477,7 +2477,7 @@ class PlannedSessionDelete(DeleteView):
|
||||
|
||||
def rower_view_instantplan(request,id='',userid=0):
|
||||
r = getrequestrower(request,userid=userid)
|
||||
if not id:
|
||||
if not id: # pragma: no cover
|
||||
raise Http404("Plan does not exist")
|
||||
|
||||
plan = InstantPlan.objects.get(uuid=id)
|
||||
@@ -2488,7 +2488,7 @@ def rower_view_instantplan(request,id='',userid=0):
|
||||
headers = {'Authorization':authorizationstring}
|
||||
|
||||
response = requests.get(url=url,headers=headers)
|
||||
if response.status_code != 200:
|
||||
if response.status_code != 200: # pragma: no cover
|
||||
messages.error(request,"Could not connect to the training plan server")
|
||||
return HttpResponseRedirect(reverse('rower_select_instantplan'))
|
||||
|
||||
@@ -2520,7 +2520,7 @@ def rower_view_instantplan(request,id='',userid=0):
|
||||
).order_by("-date")
|
||||
|
||||
if request.method == 'POST' and not request.user.is_anonymous:
|
||||
if not can_plan(request.user):
|
||||
if not can_plan(request.user): # pragma: no cover
|
||||
messages.error(request,'You must be on a <a href="/rowers/paidplans">paid plan</a> to use this functionality')
|
||||
url = reverse('rower_view_instantplan',kwargs={
|
||||
'id':id,
|
||||
@@ -2534,11 +2534,11 @@ def rower_view_instantplan(request,id='',userid=0):
|
||||
name = form.cleaned_data['name']
|
||||
try:
|
||||
targetid = form.cleaned_data['target']
|
||||
if targetid != '':
|
||||
if targetid != '': # pragma: no cover
|
||||
target = TrainingTarget.objects.get(id=int(targetid))
|
||||
else:
|
||||
target = None
|
||||
except KeyError:
|
||||
except KeyError: # pragma: no cover
|
||||
try:
|
||||
targetid = request.POST['target']
|
||||
if targetid != '':
|
||||
@@ -2553,12 +2553,12 @@ def rower_view_instantplan(request,id='',userid=0):
|
||||
datechoice = form.cleaned_data['datechoice']
|
||||
status = True
|
||||
|
||||
if target and datechoice == 'target':
|
||||
if target and datechoice == 'target': # pragma: no cover
|
||||
enddate = target.date
|
||||
startdate = enddate-datetime.timedelta(days=plan.duration)
|
||||
elif datechoice == 'startdate':
|
||||
enddate = startdate+datetime.timedelta(days=plan.duration)
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
startdate = enddate-datetime.timedelta(days=plan.duration)
|
||||
|
||||
|
||||
@@ -2585,7 +2585,7 @@ def rower_view_instantplan(request,id='',userid=0):
|
||||
|
||||
elif not request.user.is_anonymous:
|
||||
form = InstantPlanSelectForm(targets=targets,instantplan=plan,initial={'datechoice':'startdate'})
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
form = None
|
||||
|
||||
breadcrumbs = [
|
||||
@@ -2632,7 +2632,7 @@ def remove_groupsession_view(request,id=0):
|
||||
|
||||
if res:
|
||||
messages.info(request,"We have removed you from this group session")
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
messages.error(request,"For some reason we could not remove you from this group session")
|
||||
|
||||
url = reverse('plannedsessions_view')
|
||||
@@ -2641,12 +2641,12 @@ def remove_groupsession_view(request,id=0):
|
||||
|
||||
@login_required()
|
||||
def add_instantplan_view(request):
|
||||
if not request.user.is_staff:
|
||||
if not request.user.is_staff: # pragma: no cover
|
||||
raise PermissionDenied("Not Allowed")
|
||||
|
||||
r = getrequestrower(request)
|
||||
|
||||
if request.method == 'POST':
|
||||
if request.method == 'POST': # pragma: no cover
|
||||
form = InstantPlanForm(request.POST,request.FILES)
|
||||
if form.is_valid():
|
||||
ip = form.save(commit=False)
|
||||
@@ -2764,9 +2764,9 @@ def rower_create_trainingplan(request,id=0):
|
||||
targetid = request.POST['target']
|
||||
if targetid != '':
|
||||
target = TrainingTarget.objects.get(id=int(targetid))
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
target = None
|
||||
except KeyError:
|
||||
except KeyError: # pragma: no cover
|
||||
target = None
|
||||
startdate = form.cleaned_data['startdate']
|
||||
status = form.cleaned_data['status']
|
||||
@@ -2814,7 +2814,7 @@ def rower_create_trainingplan(request,id=0):
|
||||
status=True,
|
||||
).order_by("-startdate")
|
||||
|
||||
for p in plans_to_deactivate:
|
||||
for p in plans_to_deactivate: # pragma: no cover
|
||||
p.status = False
|
||||
p.save()
|
||||
|
||||
@@ -2863,18 +2863,6 @@ def rower_delete_trainingtarget(request,id=0):
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
@user_passes_test(can_plan,login_url="/rowers/paidplans",
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
@permission_required('target.delete_plan',fn=get_plan_by_pk,raise_exception=True)
|
||||
def rower_delete_trainingplan(request,id=0):
|
||||
plan = get_object_or_404(TrainingPlan,pk=id)
|
||||
plan.delete()
|
||||
|
||||
url = reverse(rower_create_trainingplan)
|
||||
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
class TrainingPlanDelete(DeleteView):
|
||||
model = TrainingPlan
|
||||
template_name = 'trainingplan_delete.html'
|
||||
@@ -2882,12 +2870,12 @@ class TrainingPlanDelete(DeleteView):
|
||||
|
||||
def get_object(self, *args, **kwargs):
|
||||
obj = super(TrainingPlanDelete, self).get_object(*args, **kwargs)
|
||||
if not can_delete_plan(self.request.user,obj):
|
||||
if not can_delete_plan(self.request.user,obj): # pragma: no cover
|
||||
raise PermissionDenied('You are not allowed to delete this training plan')
|
||||
|
||||
return obj
|
||||
|
||||
class MicroCycleDelete(DeleteView):
|
||||
class MicroCycleDelete(DeleteView): # pragma: no cover
|
||||
model = TrainingMicroCycle
|
||||
template_name = 'trainingplan_delete.html'
|
||||
|
||||
@@ -2953,7 +2941,7 @@ class MicroCycleDelete(DeleteView):
|
||||
return obj
|
||||
|
||||
|
||||
class MesoCycleDelete(DeleteView):
|
||||
class MesoCycleDelete(DeleteView): # pragma: no cover
|
||||
model = TrainingMesoCycle
|
||||
template_name = 'trainingplan_delete.html'
|
||||
|
||||
@@ -3016,7 +3004,7 @@ class MesoCycleDelete(DeleteView):
|
||||
return obj
|
||||
|
||||
|
||||
class MacroCycleDelete(DeleteView):
|
||||
class MacroCycleDelete(DeleteView): # pragma: no cover
|
||||
model = TrainingMacroCycle
|
||||
template_name = 'trainingplan_delete.html'
|
||||
|
||||
@@ -3085,13 +3073,13 @@ def rower_trainingplan_execution_view(request,
|
||||
if int(id)>0:
|
||||
try:
|
||||
plan = TrainingPlan.objects.get(id=id)
|
||||
except TrainingPlan.DoesNotExist:
|
||||
except TrainingPlan.DoesNotExist: # pragma: no cover
|
||||
raise Http404("Training Plan Does Not Exist")
|
||||
if not is_coach_user(request.user,plan.manager.user):
|
||||
if not is_coach_user(request.user,plan.manager.user): # pragma: no cover
|
||||
if request.user.rower not in plan.rowers.all():
|
||||
raise PermissionDenied("Access denied")
|
||||
|
||||
if not startdate or not enddate:
|
||||
if not startdate or not enddate: # pragma: no cover
|
||||
if int(id)>0:
|
||||
startdate = plan.startdate
|
||||
enddate = plan.enddate
|
||||
@@ -3103,12 +3091,12 @@ def rower_trainingplan_execution_view(request,
|
||||
|
||||
if int(id)>0:
|
||||
data,message = get_execution_report(r,startdate,enddate,plan=plan)
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
data,message = get_execution_report(r,startdate,enddate)
|
||||
|
||||
if not data.empty:
|
||||
script, div = interactive_planchart(data,startdate,enddate)
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
script = ''
|
||||
div = ''
|
||||
messages.error(request,'The plan does not cover this time range')
|
||||
@@ -3133,7 +3121,7 @@ def rower_trainingplan_execution_view(request,
|
||||
'name': 'Execution'
|
||||
}
|
||||
]
|
||||
else:
|
||||
else: # pragma: no cover
|
||||
breadcrumbs = [
|
||||
{
|
||||
'url':reverse(plannedsessions_view,
|
||||
@@ -3224,7 +3212,7 @@ def rower_trainingplan_view(request,
|
||||
try:
|
||||
thismicro = get_todays_micro(plan,thedate=startdate)
|
||||
thismicroid = thismicro.pk
|
||||
except AttributeError:
|
||||
except AttributeError: # pragma: no cover
|
||||
thismicroid = None
|
||||
|
||||
|
||||
@@ -3242,7 +3230,7 @@ def rower_trainingplan_view(request,
|
||||
}
|
||||
)
|
||||
|
||||
class TrainingMacroCycleUpdate(UpdateView):
|
||||
class TrainingMacroCycleUpdate(UpdateView): # pragma: no cover
|
||||
model = TrainingMacroCycle
|
||||
template_name = 'trainingplan_edit.html'
|
||||
form_class = TrainingMacroCycleForm
|
||||
@@ -3307,7 +3295,7 @@ class TrainingMacroCycleUpdate(UpdateView):
|
||||
obj.save()
|
||||
return obj
|
||||
|
||||
class TrainingMesoCycleUpdate(UpdateView):
|
||||
class TrainingMesoCycleUpdate(UpdateView): # pragma: no cover
|
||||
model = TrainingMesoCycle
|
||||
template_name = 'trainingplan_edit.html'
|
||||
form_class = TrainingMesoCycleForm
|
||||
@@ -3381,7 +3369,7 @@ class TrainingMesoCycleUpdate(UpdateView):
|
||||
obj.plan.save()
|
||||
return obj
|
||||
|
||||
class TrainingMicroCycleUpdate(UpdateView):
|
||||
class TrainingMicroCycleUpdate(UpdateView): # pragma: no cover
|
||||
model = TrainingMicroCycle
|
||||
template_name = 'trainingplan_edit.html'
|
||||
form_class = TrainingMicroCycleForm
|
||||
@@ -3460,7 +3448,7 @@ class TrainingMicroCycleUpdate(UpdateView):
|
||||
obj.plan.save()
|
||||
return obj
|
||||
|
||||
class TrainingPlanUpdate(UpdateView):
|
||||
class TrainingPlanUpdate(UpdateView): # pragma: no cover
|
||||
model = TrainingPlan
|
||||
template_name = 'trainingplan_edit.html'
|
||||
form_class = TrainingPlanForm
|
||||
@@ -3519,7 +3507,7 @@ class TrainingPlanUpdate(UpdateView):
|
||||
|
||||
return obj
|
||||
|
||||
class TrainingTargetUpdate(UpdateView):
|
||||
class TrainingTargetUpdate(UpdateView): # pragma: no cover
|
||||
model = TrainingTarget
|
||||
template_name = 'trainingplan_edit.html'
|
||||
form_class = TrainingTargetForm
|
||||
@@ -3575,7 +3563,7 @@ from rowers.utils import allsundays
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
@permission_required('cycle.change_cycle',fn=get_meso_by_pk,raise_exception=True)
|
||||
def planmesocyclebyweek(request,id=0,userid=0):
|
||||
def planmesocyclebyweek(request,id=0,userid=0): # pragma: no cover
|
||||
cycle = get_object_or_404(TrainingMesoCycle,pk=id)
|
||||
|
||||
micros = TrainingMicroCycle.objects.filter(plan=cycle)
|
||||
@@ -3625,7 +3613,7 @@ from rowers.utils import allmonths
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
@permission_required('cycle.change_cycle',fn=get_macro_by_pk,raise_exception=True)
|
||||
def planmacrocyclebymonth(request,id=0,userid=0):
|
||||
def planmacrocyclebymonth(request,id=0,userid=0): # pragma: no cover
|
||||
cycle = get_object_or_404(TrainingMacroCycle,pk=id)
|
||||
|
||||
mesos = TrainingMesoCycle.objects.filter(plan=cycle)
|
||||
|
||||
Reference in New Issue
Block a user