diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index dd2ce2e3..3da01562 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -1971,7 +1971,7 @@ def interactive_flex_chart2(id, r, promember=0, 'plottype': plottype, } - script, div = get_chart("/flex", chart_data, debug=False) + script, div = get_chart("/flex2", chart_data, debug=False) return script, div, workstrokesonly diff --git a/rowers/models.py b/rowers/models.py index e5da3360..08b45b26 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -3697,13 +3697,22 @@ class Workout(models.Model): def __str__(self): + try: + dates = self.date.strftime('%Y-%m-%d') + except AttributeError: + dates = '' + try: + durations = self.duration.strftime("%H:%M:%S"), + except AttributeError: + durations = '' + elements = dict( - date = self.date.strftime('%Y-%m-%d'), + date = dates, name = self.name, distance = str(self.distance)+'m', ownerfirst = self.user.user.first_name, ownerlast = self.user.user.last_name, - duration = self.duration.strftime("%H:%M:%S"), + duration = durations, boattype = self.boattype, workouttype = self.workouttype, seatnumber = 'seat '+str(self.seatnumber), diff --git a/rowers/nkimportutils.py b/rowers/nkimportutils.py index 67d65f85..2ea5b0eb 100644 --- a/rowers/nkimportutils.py +++ b/rowers/nkimportutils.py @@ -96,6 +96,8 @@ def add_workout_from_data(userid, nkid, data, strokedata, source='nk', splitdata oarInboardLength = 88 seatNumber = 1 oarlockfirmware = '' + boatName = '' + portStarboard = 'port' workouttype = "water" boattype = "1x" diff --git a/rowers/tasks.py b/rowers/tasks.py index 8c46ca9f..dbf562d4 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -2069,7 +2069,10 @@ def handle_sendemail_breakthrough(workoutid, useremail, **kwargs): btvalues = pd.read_json(btvalues) - btvalues.sort_values('delta', axis=0, inplace=True) + try: + btvalues.sort_values('delta', axis=0, inplace=True) + except KeyError: + return 0 lastname = '' @@ -3188,6 +3191,10 @@ def handle_update_wps(rid, types, ids, mode, debug=False, **kwargs): wps_median = 0 except ColumnNotFoundError: wps_median = 0 + except TypeError: + wps_median = 0 + except ComputeError: + wps_median = 0 return wps_median diff --git a/rowers/tests/test_simplefunctions.py b/rowers/tests/test_simplefunctions.py index 155efefb..59753174 100644 --- a/rowers/tests/test_simplefunctions.py +++ b/rowers/tests/test_simplefunctions.py @@ -6,6 +6,7 @@ from __future__ import unicode_literals from .statements import * from django.http import Http404 +from django_recaptcha.client import RecaptchaResponse from rowers.views import get_workout @@ -69,7 +70,10 @@ class SimpleViewTest(TestCase): response = self.c.get(url) self.assertIn(response.status_code, [403, 404]) - def test_sendmail(self): + @patch("django_recaptcha.fields.client.submit") + def test_sendmail(self, mocked_submit): + mocked_submit.return_value = RecaptchaResponse(is_valid=True, extra_data={"score":0.95}) + login = self.c.login(username=self.u.username, password=self.password) self.assertTrue(login) @@ -80,18 +84,20 @@ class SimpleViewTest(TestCase): 'lastname': 'Doe', 'email': 'roosendaalsander@gmail.com', 'subject': 'testing', - 'botcheck': True, + 'captcha': 'sdsdsdsdsdsdss', + 'g-recaptcha-response': 'PASSED', 'message': faker.text()} form = EmailForm(form_data) + self.assertTrue(form.is_valid()) response = self.c.post(url, form_data, follow=True) self.assertEqual(response.status_code, 200) self.assertRedirects(response, - expected_url='/rowers/email/', + expected_url='/rowers/email/thankyou/', status_code=302, target_status_code=200) def test_getworkout(self): diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index f698047b..8f7a4540 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/tests/viewnames.csv b/rowers/tests/viewnames.csv index 245dbb17..0c19b5c5 100644 --- a/rowers/tests/viewnames.csv +++ b/rowers/tests/viewnames.csv @@ -134,7 +134,7 @@ 175,220,rower_favoritecharts_view,See favorite charts,TRUE,302,pro,200,302,pro,403,403,coach,200,403,FALSE,TRUE,FALSE,TRUE,TRUE, 176,222,workout_workflow_config2_view,configure workflow,TRUE,302,basic,200,302,basic,403,403,coach,200,403,FALSE,TRUE,FALSE,FALSE,FALSE, 177,224,workflow_default_view,resets workflow to default,TRUE,302,basic,302,302,FALSE,403,403,FALSE,302,403,FALSE,FALSE,FALSE,TRUE,TRUE, -178,225,sendmail,feedback form,TRUE,302,basic,302,302,FALSE,200,302,FALSE,200,302,FALSE,FALSE,FALSE,TRUE,TRUE, +178,225,sendmail,feedback form,TRUE,200,basic,200,302,FALSE,200,302,FALSE,200,302,FALSE,FALSE,FALSE,TRUE,TRUE, 180,232,laboratory_view,lab,TRUE,302,basic,200,302,basic,403,403,coach,200,403,FALSE,TRUE,FALSE,TRUE,TRUE, 181,233,errormessage_view,not used,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, 182,237,payment_confirm_view,confirm payment,TRUE,200,basic,200,302,basic,200,302,coach,200,302,FALSE,FALSE,FALSE,FALSE,FALSE, diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 587db08d..327cce0b 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -2229,7 +2229,8 @@ def history_view_data(request, userid=0): df = df.with_columns(pl.col('time').diff().clip(lower_bound=0).alias("deltat")) except KeyError: # pragma: no cover pass - + except ColumnNotFoundError: + pass totalmeters, totalhours, totalminutes, totalseconds = get_totals( g_workouts)