diff --git a/rowers/c2stuff.py b/rowers/c2stuff.py index 691f121b..97507c7f 100644 --- a/rowers/c2stuff.py +++ b/rowers/c2stuff.py @@ -415,9 +415,9 @@ def createc2workoutdata(w): p = np.clip(p,0,3600) if w.workouttype == 'bike': p = 2.0*p - t = t.astype(int) - d = d.astype(int) - p = p.astype(int) + # t = t.astype(int) + # d = d.astype(int) + # p = p.astype(int) spm = row.df[' Cadence (stokes/min)'].astype(int) spm[0] = spm[1] try: @@ -425,12 +425,19 @@ def createc2workoutdata(w): except ValueError: hr = 0*d stroke_data = [] + + t = t.tolist() + d = d.tolist() + p = p.tolist() + spm = spm.tolist() + hr = hr.tolist() + for i in range(len(t)): - thisrecord = {"t":t[i].astype(int), - "d":d[i].astype(int), - "p":p[i].astype(int), - "spm":spm[i].astype(int), - "hr":hr[i].astype(int)} + thisrecord = {"t":t[i], + "d":d[i], + "p":p[i], + "spm":spm[i], + "hr":hr[i]} stroke_data.append(thisrecord) try: diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 501154be..6ecbb890 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -736,7 +736,11 @@ def fetchcp(rower,theworkouts,table='cpdata'): avgpower2[id] = 0 return pd.Series([]),pd.Series([]),avgpower2 - dfgrouped = df.groupby(['workoutid']) + try: + dfgrouped = df.groupby(['workoutid']) + except KeyError: + avgpower2 = {} + return pd.Series([]),pd.Series([]),avgpower2 try: avgpower2 = dict(dfgrouped.mean()['power'].astype(int)) except KeyError: @@ -756,10 +760,10 @@ def fetchcp(rower,theworkouts,table='cpdata'): theids, table=table) - return [],[],avgpower2 + return pd.Series([]),pd.Series([]),avgpower2 - return [],[],avgpower2 + return pd.Series([]),pd.Series([]),avgpower2 # create a new workout from manually entered data diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index a1245f93..d62b50eb 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -463,10 +463,18 @@ def add_team_session(t,ps): return 1 def add_rower_session(r,ps): - ps.rower.add(r) - ps.save() + teams = Team.objects.filter(manager=ps.manager) + members = Rower.objects.filter(team__in=teams).distinct() + if r in members: + ps.rower.add(r) + ps.save() - return 1 + return 1 + elif ps.manager.rower == r: + ps.rower.add(r) + ps.save() + + return 0 def remove_team_session(t,ps): ps.team.remove(t) diff --git a/rowers/sporttracksstuff.py b/rowers/sporttracksstuff.py index 80279f57..48a61fdf 100644 --- a/rowers/sporttracksstuff.py +++ b/rowers/sporttracksstuff.py @@ -172,6 +172,15 @@ def createsporttracksworkoutdata(w): distancedata = [] powerdata = [] + t = t.tolist() + hr = hr.tolist() + d = d.tolist() + spm = spm.tolist() + if haslatlon: + lat = lat.tolist() + lon = lon.tolist() + power = power.tolist() + for i in range(len(t)): hrdata.append(t[i]) hrdata.append(hr[i]) diff --git a/rowers/templates/otwrankings.html b/rowers/templates/otwrankings.html index 7a9443db..a4b2cdd6 100644 --- a/rowers/templates/otwrankings.html +++ b/rowers/templates/otwrankings.html @@ -91,7 +91,7 @@ {{ workout.distance }} m {{ workout.duration |durationprint:"%H:%M:%S.%f" }} - {{ avgpower|lookup:workout.id|encode }} W + {{ avgpower|lookup:workout.id }} W {{ workout.date }} {{ workout.averagehr }} {{ workout.maxhr }} diff --git a/rowers/tests/test_staticcharts.py b/rowers/tests/test_staticcharts.py index 3e5e33e5..552c048c 100644 --- a/rowers/tests/test_staticcharts.py +++ b/rowers/tests/test_staticcharts.py @@ -8,6 +8,7 @@ from .statements import * nu = datetime.datetime.now() + #@pytest.mark.django_db class PlotTests(TestCase): def setUp(self): @@ -15,7 +16,10 @@ class PlotTests(TestCase): u = User.objects.create_user('john', 'sander@ds.ds', 'koeinsloot') - r = Rower.objects.create(user=u) + r = Rower.objects.create(user=u, + gdproptin=True, + gdproptindate=timezone.now(), + rowerplan='basic') self.nu = datetime.datetime.now() filename = 'rowers/tests/testdata/testdata.csv' self.wotw = Workout.objects.create(name='testworkout', @@ -53,6 +57,8 @@ class PlotTests(TestCase): 'powerzones':serialize_list(r.powerzones), } + self.c = Client() + @patch('rowers.tasks.rdata') @patch('rowers.tasks.FigureCanvas') def test_ote_plots(self, mocked_rowingdata, mocked_canvas): @@ -192,6 +198,54 @@ class PlotTests(TestCase): except (FileNotFoundError,OSError): pass + @patch('rowers.tasks.rdata') + @patch('rowers.tasks.FigureCanvas') + def test_chartrequests(self, mocked_rowingdata, mocked_canvas): + opid = encoder.encode_hex(self.wotw.id) + + url = reverse('workout_add_chart_view', + kwargs={'id':opid, + 'plotnr':13 + }) + + workout_edit_url = reverse('workout_edit_view', + kwargs={'id':opid}) + + + + login = self.c.login(username='john', password='koeinsloot') + self.assertTrue(login) + + response = self.c.get(workout_edit_url,follow=True) + self.assertEqual(response.status_code,200) + + response = self.c.get(url,follow=True) + self.assertEqual(response.status_code,200) + self.assertRedirects(response, + expected_url = workout_edit_url, + status_code=302,target_status_code=200) + + i = GraphImage.objects.filter(workout=self.wotw) + self.assertEqual(len(i),1) + + graphid = i[0].id + + url = reverse('graph_delete',kwargs={'pk':graphid}) + + response = self.c.get(url) + self.assertEqual(response.status_code,200) + + response = self.c.post(url,{},follow=True) + self.assertEqual(response.status_code,200) + self.assertRedirects(response, + expected_url = workout_edit_url, + status_code=302,target_status_code=200) + + i = GraphImage.objects.filter(workout=self.wotw) + self.assertEqual(len(i),0) + + + @patch('rowers.tasks.rdata') @patch('rowers.tasks.FigureCanvas') def test_otw_plots(self, mocked_rowingdata, mocked_canvas): diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 0867ac4b..7d8b5367 100644 Binary files a/rowers/tests/testdata/testdata.csv.gz and b/rowers/tests/testdata/testdata.csv.gz differ diff --git a/rowers/underarmourstuff.py b/rowers/underarmourstuff.py index 41d98263..e0034bda 100644 --- a/rowers/underarmourstuff.py +++ b/rowers/underarmourstuff.py @@ -105,7 +105,11 @@ def createunderarmourworkoutdata(w): start_time = st.isoformat() averagehr = int(row.df[' HRCur (bpm)'].mean()) + minhr = int(row.df[' HRCur (bpm)'].min()) + maxhr = int(row.df[' HRCur (bpm)'].max()) averagespm = int(row.df[' Cadence (stokes/min)'].mean()/2.) + minspm = int(row.df[' Cadence (stokes/min)'].min()/2.) + maxspm = int(row.df[' Cadence (stokes/min)'].max()/2.) maxhr = int(row.df[' HRCur (bpm)'].max()) duration = w.duration.hour*3600 duration += w.duration.minute*60 @@ -127,30 +131,34 @@ def createunderarmourworkoutdata(w): d = row.df.loc[:,'cum_dist'].values d[0] = d[1] - t = t.astype(float) + t = t.astype(float).tolist() - d = d.astype(int) - spm = row.df[' Cadence (stokes/min)'].astype(int) + d = d.astype(int).tolist() + spm = row.df[' Cadence (stokes/min)'].astype(int).tolist() spm[0] = spm[1] - hr = row.df[' HRCur (bpm)'].astype(int) + hr = row.df[' HRCur (bpm)'].astype(int).tolist() speed = row.df[' AverageBoatSpeed (m/s)'] - speed = speed.replace(np.inf,0) + speedmin = float(row.df[' AverageBoatSpeed (m/s)'].min()) + speedmax = float(row.df[' AverageBoatSpeed (m/s)'].max()) + speedmean = float(row.df[' AverageBoatSpeed (m/s)'].mean()) + speed = speed.replace(np.inf,0).tolist() + + haslatlon=1 try: - lat = row.df[' latitude'] - lon = row.df[' longitude'] + lat = row.df[' latitude'].tolist() + lon = row.df[' longitude'].tolist() if not lat.std() and not lon.std(): haslatlon = 0 except KeyError: haslatlon = 0 - # path data if haslatlon: locdata = [] @@ -187,19 +195,20 @@ def createunderarmourworkoutdata(w): "cadence": spmdata, } - + + aggregates = { "elapsed_time_total": int(duration), "active_time_total": int(duration), "distance_total": int(max(d)), "heartrate_avg": averagehr, - "heart_rate_min": int(min(hr)), - "heart_rate_max": int(max(hr)), - "speed_min": speed.min().astype(float), - "speed_max": speed.max().astype(float), - "speed_avg": speed.mean(), - "cadence_min": int(min(spm)/2.), - "cadence_max": int(max(spm)/2.), + "heart_rate_min": minhr, + "heart_rate_max": maxhr, + "speed_min": speedmin, + "speed_max": speedmax, + "speed_avg": speedmean, + "cadence_min": minspm, + "cadence_max": maxspm, "cadence_avg": averagespm, } diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 5c234b30..4a5328d4 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -5170,7 +5170,12 @@ class GraphDelete(DeleteView): def get_success_url(self): w = self.object.workout - return reverse('workout_edit_view',kwargs={'id':str(w.id)}) + try: + w = Workout.objects.get(id=w.id) + except Workout.DoesNotExist: + return reverse('workouts_view') + + return reverse('workout_edit_view',kwargs={'id':encoder.encode_hex(w.id)}) def get_object(self, *args, **kwargs): obj = super(GraphDelete, self).get_object(*args, **kwargs) diff --git a/rowsandall_app/settings.py b/rowsandall_app/settings.py index 140383d8..031f3afb 100644 --- a/rowsandall_app/settings.py +++ b/rowsandall_app/settings.py @@ -86,7 +86,7 @@ MIDDLEWARE_CLASSES = [ 'django.middleware.common.BrokenLinkEmailsMiddleware', 'django.middleware.gzip.GZipMiddleware', # 'htmlmin.middleware.HtmlMinifyMiddleware', - 'htmlmin.middleware.MarkRequestMiddleware', +# 'htmlmin.middleware.MarkRequestMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/rowsandall_app/settings_dev.py b/rowsandall_app/settings_dev.py index 77d59932..738307bd 100644 --- a/rowsandall_app/settings_dev.py +++ b/rowsandall_app/settings_dev.py @@ -51,9 +51,9 @@ TEMPLATES[0]['OPTIONS']['debug'] = DEBUG ALLOWED_HOSTS = ['localhost'] -INSTALLED_APPS += ['debug_toolbar',] +# INSTALLED_APPS += ['debug_toolbar',] -MIDDLEWARE_CLASSES += ['debug_toolbar.middleware.DebugToolbarMiddleware',] +# MIDDLEWARE_CLASSES += ['debug_toolbar.middleware.DebugToolbarMiddleware',] CACHES = { 'default': {