diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 76572c25..fb58aee3 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1521,7 +1521,10 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', cntr = Workout.objects.filter(user=r, workouttype__in=otwtypes, startdatetime__gt=tz.now()-tz.timedelta(days=42), duplicate=False).count() - new_value = (cntr*r.running_wps_erg + row.df['driveenergy'].mean())/(cntr+1.0) + try: + new_value = (cntr*r.running_wps_erg + row.df['driveenergy'].mean())/(cntr+1.0) + except TypeError: + new_value = r.running_wps if not (math.isnan(new_value) or math.isinf(new_value) or new_value == 0): r.running_wps = new_value elif not (math.isnan(r.running_wps) or math.isinf(r.running_wps) or r.running_wps == 0): diff --git a/rowers/tasks.py b/rowers/tasks.py index 39484538..4e469477 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -3759,11 +3759,19 @@ def handle_intervals_getworkout(rower, intervalstoken, workoutid, debug=False, * data = response.json() + try: + workoutsource = data['device_name'] + except KeyError: + workoutsource = 'intervals.icu' + try: title = data['name'] except KeyError: title = 'Intervals workout' + if 'garmin' in workoutsource.lower(): + title = 'Garmin: '+ title + try: workouttype = intervalsmappinginv[data['type']] except KeyError: @@ -3825,6 +3833,7 @@ def handle_intervals_getworkout(rower, intervalstoken, workoutid, debug=False, * 'user': rower.user.id, 'boattype': '1x', 'workouttype': workouttype, + 'workoutsource': workoutsource, 'file': fit_filename, 'intervalsid': workoutid, 'title': title, diff --git a/rowers/tests/mocks.py b/rowers/tests/mocks.py index 0db2ae33..63e4440b 100644 --- a/rowers/tests/mocks.py +++ b/rowers/tests/mocks.py @@ -955,6 +955,9 @@ def mocked_requests(*args, **kwargs): with open('rowers/tests/testdata/tpuploadresponse.txt','r') as f: tpuploadresponse = json.load(f) + with open('rowers/tests/testdata/intervals.json','r') as f: + intervalsjson = json.load(f) + stravastreamjson = { 'time':stravatimejson, 'velocity_smooth':stravavelojson, @@ -1136,6 +1139,7 @@ def mocked_requests(*args, **kwargs): garmintester = re.compile(r'.*?garmin\.com') fakturoidtester = re.compile(r'.*?fakturoid\.cz') idokladtester = re.compile(r'.*?idoklad\.cz') + intervalstester = re.compile(r'.*?intervals\.icu') polarlistregex = r'.*?polaraccesslink\.com\/.*\/(\d+)$' polarlisttester = re.compile(polarlistregex) @@ -1441,10 +1445,6 @@ def mocked_requests(*args, **kwargs): pass json_data = rp3workoutlist return MockResponse(json_data,200) - - - - if stravatester.match(args[0]): if stravaworkoutlisttester.match(args[0]): @@ -1559,6 +1559,10 @@ def mocked_requests(*args, **kwargs): ] return MockResponse(response,200) + if intervalstester.match(args[0]): + return MockResponse(intervalsjson,200) + + return MockResponse(None,404) class MockEmailMessage: diff --git a/rowers/tests/test_imports.py b/rowers/tests/test_imports.py index a50042d0..e20fa911 100644 --- a/rowers/tests/test_imports.py +++ b/rowers/tests/test_imports.py @@ -27,6 +27,82 @@ import rowers.garmin_stuff as gs import rowers.integrations.strava as strava from rowers.nkimportutils import * +@pytest.mark.django_db +@override_settings(TESTING=True) +class IntervalsObjects(DjangoTestCase): + def setUp(self): + self.c = Client() + self.u = User.objects.create_user('john', + 'sander@ds.ds', + 'koeinsloot') + + self.u.first_name = 'John' + self.u.last_name = 'Sander' + self.u.save() + self.r = Rower.objects.create(user=self.u,gdproptin=True, ftpset=True,surveydone=True, + gdproptindate=timezone.now() + ) + self.r.save() + self.c.login(username='john',password='koeinsloot') + self.nu = datetime.datetime.now() + + filename = 'rowers/tests/testdata/testdata.csv' + + rr = rrower(hrmax=self.r.max,hrut2=self.r.ut2, + hrut1=self.r.ut1,hrat=self.r.at, + hrtr=self.r.tr,hran=self.r.an,ftp=self.r.ftp) + row = rdata(csvfile=filename,rower=rr) + totaldist = row.df['cum_dist'].max() + totaltime = row.df['TimeStamp (sec)'].max()-row.df['TimeStamp (sec)'].min() + totaltime = totaltime+row.df.loc[:,' ElapsedTime (sec)'].iloc[0] + + + hours = int(totaltime/3600.) + minutes = int((totaltime - 3600.*hours)/60.) + seconds = int(totaltime - 3600.*hours - 60.*minutes) + tenths = int(10*(totaltime - 3600.*hours - 60.*minutes - seconds)) + + duration = "%s:%s:%s.%s" % (hours,minutes,seconds,tenths) + + + workoutdate = row.rowdatetime.strftime('%Y-%m-%d') + workoutstarttime = row.rowdatetime.strftime('%H:%M:%S') + + self.w = Workout.objects.create( + name='testworkout',workouttype='water', + user=self.r,date=self.nu.strftime('%Y-%m-%d'), + starttime=workoutstarttime, + startdatetime=row.rowdatetime, + duration=duration,distance=totaldist, + csvfilename=filename + ) + self.u2 = User.objects.create_user('john2', + 'ba@ds.ds', + 'koeinsloot2') + self.u2.first_name = 'John' + self.u2.last_name = 'Sander2' + self.u2.save() + self.r2 = Rower.objects.create(user=self.u2,gdproptin=True, ftpset=True,surveydone=True, + gdproptindate=timezone.now() + ) + + self.w2 = Workout.objects.create( + name='testworkout',workouttype='water', + user=self.r2,date=self.nu.strftime('%Y-%m-%d'), + starttime=workoutstarttime, + startdatetime=row.rowdatetime, + duration=duration,distance=totaldist, + csvfilename=filename + ) + + @patch('rowers.tasks.requests.get', side_effect=mocked_requests) + @patch('rowers.tasks.requests.post', side_effect=mocked_requests) + def test_intervals_import(self, mock_get, mock_post): + res = tasks.handle_intervals_getworkout(self.r, + '12345', + 'i101042071') + self.assertEqual(res,1) + @pytest.mark.django_db @override_settings(TESTING=True) class RojaboObjects(DjangoTestCase): diff --git a/rowers/tests/test_unit_tests.py b/rowers/tests/test_unit_tests.py index bdd23a6f..86305de9 100644 --- a/rowers/tests/test_unit_tests.py +++ b/rowers/tests/test_unit_tests.py @@ -120,7 +120,7 @@ class OtherUnitTests(TestCase): def test_summaryfromsplitdata(self): - with open('rowers/tests/testdata/c2splits.json','r') as f: + with open('rowers/tests/c2jsonintervaldata.txt','r') as f: s = f.read() data = json.loads(s) splitdata = data['workout']['intervals'] diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 4b65b85a..322910d9 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/utils.py b/rowers/utils.py index f6aa06bd..8a2ed490 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -833,6 +833,7 @@ def step_to_time_dist(step, avgspeed=3.2, ftp=200, ftspm=25, ftv=3.7, powerzones avgpower = targetpower if valuelow != 0 and valuehigh != 0: # pragma: no cover avgpower = (valuelow+valuehigh)/2. + targetpower = ftp*0.6 if avgpower < 10 and avgpower > 0: targetpower = ftp*0.6 elif avgpower > 10 and avgpower < 1000: