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)
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:

View File

@@ -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

View File

@@ -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)

View File

@@ -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])

View File

@@ -91,7 +91,7 @@
<tr>
<td> {{ workout.distance }} m</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.averagehr }} </td>
<td> {{ workout.maxhr }} </td>

View File

@@ -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):

Binary file not shown.

View File

@@ -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,
}

View File

@@ -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)

View File

@@ -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',

View File

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