Merge branch 'release/v9.43'
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
dfgrouped = df.groupby(['workoutid'])
|
try:
|
||||||
|
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
|
||||||
|
|||||||
@@ -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):
|
||||||
ps.rower.add(r)
|
teams = Team.objects.filter(manager=ps.manager)
|
||||||
ps.save()
|
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):
|
def remove_team_session(t,ps):
|
||||||
ps.team.remove(t)
|
ps.team.remove(t)
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
BIN
rowers/tests/testdata/testdata.csv.gz
vendored
BIN
rowers/tests/testdata/testdata.csv.gz
vendored
Binary file not shown.
@@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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': {
|
||||||
|
|||||||
Reference in New Issue
Block a user