Merge branch 'release/v9.43'
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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):
|
||||
|
||||
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()
|
||||
|
||||
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,
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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': {
|
||||
|
||||
Reference in New Issue
Block a user