diff --git a/rowers/models.py b/rowers/models.py index 4433bd5c..4c9318cb 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -3778,9 +3778,12 @@ def update_duplicates_on_delete(sender, instance, **kwargs): t = ww.duration delta = datetime.timedelta( hours=t.hour, minutes=t.minute, seconds=t.second) - enddatetime = ww.startdatetime+delta - if enddatetime > d.startdatetime: - ws2.append(ww) + try: + enddatetime = ww.startdatetime+delta + if enddatetime > d.startdatetime: + ws2.append(ww) + except TypeError: + pass if len(ws2) == 0: d.duplicate = False diff --git a/rowers/tests/test_api.py b/rowers/tests/test_api.py index f0f8eab6..69279f53 100644 --- a/rowers/tests/test_api.py +++ b/rowers/tests/test_api.py @@ -181,6 +181,30 @@ class OwnApi(TestCase): self.assertEqual(response.status_code,200) + def test_strokedataform_tcx(self): + login = self.c.login(username=self.u.username, password=self.password) + self.assertTrue(login) + + w = self.user_workouts[1] + + url = reverse('strokedata_tcx') + + with open('rowers/tests/testdata/crewnerddata.tcx') as f: + tcxdata_str = f.read() + + result = get_random_file(filename='rowers/tests/testdata/thyro.csv') + + request = self.factory.post(url, data = tcxdata_str, content_type='application/xml') + request.user = self.u + request.content_type = 'application/xml' + + force_authenticate(request, user=self.u) + with patch('rowers.dataprep.getrowdata_db') as mock_getrowdata: + mock_getrowdata.return_value = (pd.DataFrame(),None) + response = strokedata_tcx(request) + self.assertEqual(response.status_code,200) + + def test_strokedataform_v3(self): login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 57d35b56..3dcc1ddf 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/views/apiviews.py b/rowers/views/apiviews.py index 99bd7227..360f0f0e 100644 --- a/rowers/views/apiviews.py +++ b/rowers/views/apiviews.py @@ -11,9 +11,11 @@ from rowers.dataroutines import get_workouttype_from_tcx, get_startdate_time_zon from rest_framework.decorators import parser_classes from rest_framework.parsers import BaseParser +from datetime import datetime as dt + import rowingdata.tcxtools as tcxtools from rowingdata import TCXParser, rowingdata -from datetime import timedelta, datetime + class XMLParser(BaseParser): media_type = "application/xml" @@ -264,7 +266,8 @@ def strokedata_tcx(request): lap_duration_seconds = float(lap_duration_node.text) total_duration += lap_duration_seconds - except: + except Exception as e: + dologging('apilog.log',e) return HttpResponseNotAllowed("Could not parse TCX data") @@ -276,7 +279,7 @@ def strokedata_tcx(request): duration = totaltime_sec_to_string(total_duration) - startdatetime = datetime.strptime(start_time_str, "%Y-%m-%dT%H:%M:%S%z") + startdatetime = dt.strptime(start_time_str, "%Y-%m-%dT%H:%M:%S%z") startdate = startdatetime.date() partofday = part_of_day(startdatetime.hour) title = '{partofday} water'.format(partofday=partofday)