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': {