diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 562ded65..af49c155 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -17,6 +17,7 @@ import rowers.c2stuff as c2stuff import rowers.metrics as metrics import rowers.dataprep as dataprep from rowers.dataprep import rdata +from rowers.dataroutines import remove_nulls_pl import rowers.utils as utils import polars as pl import pytz @@ -1205,6 +1206,7 @@ def forcecurve_multi_interactive_chart(selected): # pragma: no cover rowdata = dataprep.read_data(columns, ids=workoutids, workstrokesonly=False) + rowdata = remove_nulls_pl(rowdata) rowdata = rowdata.fill_nan(None).drop_nulls() if rowdata.is_empty(): @@ -1225,7 +1227,7 @@ def forcecurve_multi_interactive_chart(selected): # pragma: no cover 'forcecurve_analyses': selected_dict, } - script, div = get_chart("/forcecurve_compare", chart_data) + script, div = get_chart("/forcecurve_compare", chart_data, debug=False) return script, div @@ -2224,11 +2226,11 @@ def get_zones_report_pl(rower, startdate, enddate, trainingzones='hr', date_agg= pw_tr = rower.pw_tr pw_an = rower.pw_an if iswater: - pw_ut2 = pw_ut2*rower.otwslack/100. - pw_ut1 = pw_ut1*rower.otwslack/100. - pw_at = pw_at*rower.otwslack/100. - pw_tr = pw_tr*rower.otwslack/100. - pw_an = pw_an*rower.otwslack/100. + pw_ut2 = pw_ut2*(100.-rower.otwslack)/100. + pw_ut1 = pw_ut1*(100.-rower.otwslack)/100. + pw_at = pw_at*(100.-rower.otwslack)/100. + pw_tr = pw_tr*(100.-rower.otwslack)/100. + pw_an = pw_an*(100.-rower.otwslack)/100. # 1 time_ut2 = df.filter( diff --git a/rowers/tasks.py b/rowers/tasks.py index e2d872fa..d8e7716c 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -3996,7 +3996,11 @@ def fetch_strava_workout(stravatoken, oauth_data, stravaid, csvfilename, userid, df.sort('TimeStamp (sec)') row = rowingdata.rowingdata_pl(df=df) - row.write_csv(csvfilename, compressed=False) + try: + row.write_csv(csvfilename, compressed=False) + except ComputeError: + row = rowingdata.rowingdata(df=df) + row.write_csv(csvfilename, compressed=False) # summary = row.allstats() # maxdist = df['cum_dist'].max() diff --git a/rowers/templates/user_analysis_select.html b/rowers/templates/user_analysis_select.html index 840f799b..853039d7 100644 --- a/rowers/templates/user_analysis_select.html +++ b/rowers/templates/user_analysis_select.html @@ -389,14 +389,14 @@ -
You can use the date and search forms to search through all diff --git a/rowers/tests/statements.py b/rowers/tests/statements.py index 47f64ae6..d2b1f440 100644 --- a/rowers/tests/statements.py +++ b/rowers/tests/statements.py @@ -109,6 +109,20 @@ from rowers.opaque import encoder import inspect + + +class MyTestCase(TestCase): + def setUp(self): + self.osm_mock = patch('something') + self.osm_mock.return_value = "" + super(MyTestCase, self).setUp() + self.osm_mock.start() + + def tearDown(self): + super(MyTestCase, self).tearDown() + self.osm_mock.stop() + + def get_random_file(filename='rowers/tests/testdata/testdata.csv',name=''): frm = inspect.stack()[3] diff --git a/rowers/tests/test_aavirtualevents.py b/rowers/tests/test_aavirtualevents.py index c1cbc2f6..e58e5861 100644 --- a/rowers/tests/test_aavirtualevents.py +++ b/rowers/tests/test_aavirtualevents.py @@ -13,7 +13,7 @@ import rowers.courses as courses import rowers.plannedsessions as plannedsessions @override_settings(TESTING=True) -class VirtualEventViewTest(TestCase): +class VirtualEventViewTest(MyTestCase): def setUp(self): # Main User self.u = UserFactory() diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index c24ee12d..9aad9188 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index fb58590f..5fa3fa82 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -1594,7 +1594,6 @@ class SavedAnalysisView(UserPassesTestMixin, View): def post(self, request, *args, **kwargs): # pragma: no cover form = self.form_class(request.POST) - if form.is_valid(): cd = form.cleaned_data self.selected = cd['analyses'] diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index 93ba604e..95019ab1 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -652,7 +652,7 @@ def rower_process_testcallback(request): # pragma: no cover @user_passes_test(ispromember, login_url="/rowers/paidplans/", message="This functionality requires a Pro plan or higher", redirect_field_name=None) -@permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True) +@permission_required('rower.is_planmember', fn=get_user_by_userid, raise_exception=True) def workout_rojaboimport_view(request, message="", userid=0): # pragma: no cover r = getrequestrower(request, userid=userid) if r.user != request.user: @@ -753,10 +753,12 @@ def workout_rojaboimport_view(request, message="", userid=0): # pragma: no cover 'steps': steps, } ps.save() - messages.info(request,'Saved planned session {id}'.format(id=ps.id)) + except KeyError: # pragma: no cover pass + except ValidationError: + messages.error(request,"You cannot import sessions") except KeyError: pass