diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py index ce2463a4..db61bd37 100644 --- a/rowers/tests/test_imports.py +++ b/rowers/tests/test_imports.py @@ -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) diff --git a/rowers/tests/test_misc.py b/rowers/tests/test_misc.py index e2174bdf..253f7abf 100644 --- a/rowers/tests/test_misc.py +++ b/rowers/tests/test_misc.py @@ -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): diff --git a/rowers/tests/test_plans.py b/rowers/tests/test_plans.py index 4f7a60b9..b5d75e5e 100644 --- a/rowers/tests/test_plans.py +++ b/rowers/tests/test_plans.py @@ -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) diff --git a/rowers/tests/testdata/temp.yml b/rowers/tests/testdata/temp.yml new file mode 100644 index 00000000..b88da031 --- /dev/null +++ b/rowers/tests/testdata/temp.yml @@ -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: "" diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz deleted file mode 100644 index 2d9b5194..00000000 Binary files a/rowers/tests/testdata/testdata.tcx.gz and /dev/null differ diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index fe8d9d00..b46000bd 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -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) diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index d791b587..957b6d35 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -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 paid plan 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)