Private
Public Access
1
0

Merge branch 'release/v9.43'

This commit is contained in:
Sander Roosendaal
2019-03-07 19:35:30 +01:00
11 changed files with 132 additions and 36 deletions

View File

@@ -415,9 +415,9 @@ def createc2workoutdata(w):
p = np.clip(p,0,3600) p = np.clip(p,0,3600)
if w.workouttype == 'bike': if w.workouttype == 'bike':
p = 2.0*p p = 2.0*p
t = t.astype(int) # t = t.astype(int)
d = d.astype(int) # d = d.astype(int)
p = p.astype(int) # p = p.astype(int)
spm = row.df[' Cadence (stokes/min)'].astype(int) spm = row.df[' Cadence (stokes/min)'].astype(int)
spm[0] = spm[1] spm[0] = spm[1]
try: try:
@@ -425,12 +425,19 @@ def createc2workoutdata(w):
except ValueError: except ValueError:
hr = 0*d hr = 0*d
stroke_data = [] stroke_data = []
t = t.tolist()
d = d.tolist()
p = p.tolist()
spm = spm.tolist()
hr = hr.tolist()
for i in range(len(t)): for i in range(len(t)):
thisrecord = {"t":t[i].astype(int), thisrecord = {"t":t[i],
"d":d[i].astype(int), "d":d[i],
"p":p[i].astype(int), "p":p[i],
"spm":spm[i].astype(int), "spm":spm[i],
"hr":hr[i].astype(int)} "hr":hr[i]}
stroke_data.append(thisrecord) stroke_data.append(thisrecord)
try: try:

View File

@@ -736,7 +736,11 @@ def fetchcp(rower,theworkouts,table='cpdata'):
avgpower2[id] = 0 avgpower2[id] = 0
return pd.Series([]),pd.Series([]),avgpower2 return pd.Series([]),pd.Series([]),avgpower2
try:
dfgrouped = df.groupby(['workoutid']) dfgrouped = df.groupby(['workoutid'])
except KeyError:
avgpower2 = {}
return pd.Series([]),pd.Series([]),avgpower2
try: try:
avgpower2 = dict(dfgrouped.mean()['power'].astype(int)) avgpower2 = dict(dfgrouped.mean()['power'].astype(int))
except KeyError: except KeyError:
@@ -756,10 +760,10 @@ def fetchcp(rower,theworkouts,table='cpdata'):
theids, theids,
table=table) 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 # create a new workout from manually entered data

View File

@@ -463,10 +463,18 @@ def add_team_session(t,ps):
return 1 return 1
def add_rower_session(r,ps): def add_rower_session(r,ps):
teams = Team.objects.filter(manager=ps.manager)
members = Rower.objects.filter(team__in=teams).distinct()
if r in members:
ps.rower.add(r) ps.rower.add(r)
ps.save() 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): def remove_team_session(t,ps):
ps.team.remove(t) ps.team.remove(t)

View File

@@ -172,6 +172,15 @@ def createsporttracksworkoutdata(w):
distancedata = [] distancedata = []
powerdata = [] 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)): for i in range(len(t)):
hrdata.append(t[i]) hrdata.append(t[i])
hrdata.append(hr[i]) hrdata.append(hr[i])

View File

@@ -91,7 +91,7 @@
<tr> <tr>
<td> {{ workout.distance }} m</td> <td> {{ workout.distance }} m</td>
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td> <td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
<td> {{ avgpower|lookup:workout.id|encode }} W</td> <td> {{ avgpower|lookup:workout.id }} W</td>
<td> {{ workout.date }} </td> <td> {{ workout.date }} </td>
<td> {{ workout.averagehr }} </td> <td> {{ workout.averagehr }} </td>
<td> {{ workout.maxhr }} </td> <td> {{ workout.maxhr }} </td>

View File

@@ -8,6 +8,7 @@ from .statements import *
nu = datetime.datetime.now() nu = datetime.datetime.now()
#@pytest.mark.django_db #@pytest.mark.django_db
class PlotTests(TestCase): class PlotTests(TestCase):
def setUp(self): def setUp(self):
@@ -15,7 +16,10 @@ class PlotTests(TestCase):
u = User.objects.create_user('john', u = User.objects.create_user('john',
'sander@ds.ds', 'sander@ds.ds',
'koeinsloot') '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() self.nu = datetime.datetime.now()
filename = 'rowers/tests/testdata/testdata.csv' filename = 'rowers/tests/testdata/testdata.csv'
self.wotw = Workout.objects.create(name='testworkout', self.wotw = Workout.objects.create(name='testworkout',
@@ -53,6 +57,8 @@ class PlotTests(TestCase):
'powerzones':serialize_list(r.powerzones), 'powerzones':serialize_list(r.powerzones),
} }
self.c = Client()
@patch('rowers.tasks.rdata') @patch('rowers.tasks.rdata')
@patch('rowers.tasks.FigureCanvas') @patch('rowers.tasks.FigureCanvas')
def test_ote_plots(self, mocked_rowingdata, mocked_canvas): def test_ote_plots(self, mocked_rowingdata, mocked_canvas):
@@ -192,6 +198,54 @@ class PlotTests(TestCase):
except (FileNotFoundError,OSError): except (FileNotFoundError,OSError):
pass 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.rdata')
@patch('rowers.tasks.FigureCanvas') @patch('rowers.tasks.FigureCanvas')
def test_otw_plots(self, mocked_rowingdata, mocked_canvas): def test_otw_plots(self, mocked_rowingdata, mocked_canvas):

Binary file not shown.

View File

@@ -105,7 +105,11 @@ def createunderarmourworkoutdata(w):
start_time = st.isoformat() start_time = st.isoformat()
averagehr = int(row.df[' HRCur (bpm)'].mean()) 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.) 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()) maxhr = int(row.df[' HRCur (bpm)'].max())
duration = w.duration.hour*3600 duration = w.duration.hour*3600
duration += w.duration.minute*60 duration += w.duration.minute*60
@@ -127,30 +131,34 @@ def createunderarmourworkoutdata(w):
d = row.df.loc[:,'cum_dist'].values d = row.df.loc[:,'cum_dist'].values
d[0] = d[1] d[0] = d[1]
t = t.astype(float) t = t.astype(float).tolist()
d = d.astype(int) d = d.astype(int).tolist()
spm = row.df[' Cadence (stokes/min)'].astype(int) spm = row.df[' Cadence (stokes/min)'].astype(int).tolist()
spm[0] = spm[1] 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 = 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 haslatlon=1
try: try:
lat = row.df[' latitude'] lat = row.df[' latitude'].tolist()
lon = row.df[' longitude'] lon = row.df[' longitude'].tolist()
if not lat.std() and not lon.std(): if not lat.std() and not lon.std():
haslatlon = 0 haslatlon = 0
except KeyError: except KeyError:
haslatlon = 0 haslatlon = 0
# path data # path data
if haslatlon: if haslatlon:
locdata = [] locdata = []
@@ -188,18 +196,19 @@ def createunderarmourworkoutdata(w):
} }
aggregates = { aggregates = {
"elapsed_time_total": int(duration), "elapsed_time_total": int(duration),
"active_time_total": int(duration), "active_time_total": int(duration),
"distance_total": int(max(d)), "distance_total": int(max(d)),
"heartrate_avg": averagehr, "heartrate_avg": averagehr,
"heart_rate_min": int(min(hr)), "heart_rate_min": minhr,
"heart_rate_max": int(max(hr)), "heart_rate_max": maxhr,
"speed_min": speed.min().astype(float), "speed_min": speedmin,
"speed_max": speed.max().astype(float), "speed_max": speedmax,
"speed_avg": speed.mean(), "speed_avg": speedmean,
"cadence_min": int(min(spm)/2.), "cadence_min": minspm,
"cadence_max": int(max(spm)/2.), "cadence_max": maxspm,
"cadence_avg": averagespm, "cadence_avg": averagespm,
} }

View File

@@ -5170,7 +5170,12 @@ class GraphDelete(DeleteView):
def get_success_url(self): def get_success_url(self):
w = self.object.workout 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): def get_object(self, *args, **kwargs):
obj = super(GraphDelete, self).get_object(*args, **kwargs) obj = super(GraphDelete, self).get_object(*args, **kwargs)

View File

@@ -86,7 +86,7 @@ MIDDLEWARE_CLASSES = [
'django.middleware.common.BrokenLinkEmailsMiddleware', 'django.middleware.common.BrokenLinkEmailsMiddleware',
'django.middleware.gzip.GZipMiddleware', 'django.middleware.gzip.GZipMiddleware',
# 'htmlmin.middleware.HtmlMinifyMiddleware', # 'htmlmin.middleware.HtmlMinifyMiddleware',
'htmlmin.middleware.MarkRequestMiddleware', # 'htmlmin.middleware.MarkRequestMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.security.SecurityMiddleware', 'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',

View File

@@ -51,9 +51,9 @@ TEMPLATES[0]['OPTIONS']['debug'] = DEBUG
ALLOWED_HOSTS = ['localhost'] ALLOWED_HOSTS = ['localhost']
INSTALLED_APPS += ['debug_toolbar',] # INSTALLED_APPS += ['debug_toolbar',]
MIDDLEWARE_CLASSES += ['debug_toolbar.middleware.DebugToolbarMiddleware',] # MIDDLEWARE_CLASSES += ['debug_toolbar.middleware.DebugToolbarMiddleware',]
CACHES = { CACHES = {
'default': { 'default': {