Private
Public Access
1
0

Merge branch 'release/v21.1.0'

This commit is contained in:
2024-05-21 09:06:20 +02:00
13 changed files with 131 additions and 26 deletions
+14
View File
@@ -1126,6 +1126,9 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
summary='', summary='',
makeprivate=False, makeprivate=False,
oarlength=2.89, inboard=0.88, oarlength=2.89, inboard=0.88,
boatname='',
empowerside='port',
seatnumber=1,
forceunit='lbs', forceunit='lbs',
consistencychecks=False, consistencychecks=False,
startdatetime='', startdatetime='',
@@ -1343,6 +1346,9 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
w.startdatetime = workoutstartdatetime w.startdatetime = workoutstartdatetime
w.inboard = inboard w.inboard = inboard
w.oarlength = oarlength w.oarlength = oarlength
w.seatnumber = seatnumber
w.boatname = boatname
w.empowerside = empowerside
w.timezone = timezone_str w.timezone = timezone_str
w.privacy = privacy w.privacy = privacy
w.impeller = impeller w.impeller = impeller
@@ -1367,6 +1373,9 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
maxhr=maxhr, averagehr=averagehr, maxhr=maxhr, averagehr=averagehr,
startdatetime=workoutstartdatetime, startdatetime=workoutstartdatetime,
inboard=inboard, oarlength=oarlength, inboard=inboard, oarlength=oarlength,
boatname=boatname,
empowerside=empowerside,
seatnumber=seatnumber,
timezone=timezone_str, timezone=timezone_str,
privacy=privacy, privacy=privacy,
impeller=impeller) impeller=impeller)
@@ -1418,6 +1427,9 @@ def new_workout_from_file(r, f2,
oarlockfirmware='', oarlockfirmware='',
inboard=None, inboard=None,
oarlength=None, oarlength=None,
boatname='',
seatnumber=1,
empowerside='port',
impeller=False, impeller=False,
uploadoptions={'boattype': '1x', 'workouttype': 'rower'}): uploadoptions={'boattype': '1x', 'workouttype': 'rower'}):
message = "" message = ""
@@ -1583,6 +1595,8 @@ def new_workout_from_file(r, f2,
startdatetime=startdatetime, startdatetime=startdatetime,
rpe=rpe, rpe=rpe,
inboard=inboard, oarlength=oarlength, inboard=inboard, oarlength=oarlength,
seatnumber=seatnumber, boatname=boatname,
empowerside=empowerside,
title=title, title=title,
forceunit='N', forceunit='N',
impeller=impeller, impeller=impeller,
+7 -2
View File
@@ -1554,6 +1554,7 @@ def read_data(columns, ids=[], doclean=True, workstrokesonly=True, debug=False,
_ = dataplep(rowdata.df, id=id, _ = dataplep(rowdata.df, id=id,
bands=True, otwpower=True, barchart=True, bands=True, otwpower=True, barchart=True,
polars=True) polars=True)
try:
df = pl.scan_parquet(f) df = pl.scan_parquet(f)
if startenddict: if startenddict:
try: try:
@@ -1567,6 +1568,8 @@ def read_data(columns, ids=[], doclean=True, workstrokesonly=True, debug=False,
except KeyError: except KeyError:
pass pass
data.append(df) data.append(df)
except ComputeError:
pass
try: try:
data = pl.collect_all(data) data = pl.collect_all(data)
@@ -2169,14 +2172,16 @@ def dataplep(rowdatadf, id=0, inboard=0.88, forceunit='lbs', bands=True, barchar
df = df.with_columns((pl.col(" AverageDriveForce (lbs)")/pl.col(" PeakDriveForce (lbs)")).alias("forceratio")) df = df.with_columns((pl.col(" AverageDriveForce (lbs)")/pl.col(" PeakDriveForce (lbs)")).alias("forceratio"))
else: else:
df = df.with_columns((pl.lit(0)).alias("forceratio")) df = df.with_columns((pl.lit(0)).alias("forceratio"))
try:
f = df['TimeStamp (sec)'].diff().mean() f = df['TimeStamp (sec)'].diff().mean()
except TypeError:
f = 0
windowsize = 1
if f != 0 and not np.isinf(f): if f != 0 and not np.isinf(f):
try: try:
windowsize = 2 * (int(10. / (f))) + 1 windowsize = 2 * (int(10. / (f))) + 1
except ValueError: except ValueError:
windowsize = 1 windowsize = 1
else:
windowsize = 1
if windowsize <= 3: if windowsize <= 3:
windowsize = 5 windowsize = 5
+13 -1
View File
@@ -22,7 +22,7 @@ import polars as pl
import pytz import pytz
from rowers.rower_rules import ispromember from rowers.rower_rules import ispromember
from polars.exceptions import ColumnNotFoundError from polars.exceptions import ColumnNotFoundError, ComputeError
from scipy.interpolate import griddata from scipy.interpolate import griddata
from scipy.signal import savgol_filter from scipy.signal import savgol_filter
@@ -758,6 +758,7 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue=
df = df.filter(pl.col("date") > startdate) df = df.filter(pl.col("date") > startdate)
try:
df2 = pl.DataFrame({ df2 = pl.DataFrame({
"testpower" :df['testpower'], "testpower" :df['testpower'],
"testduration":df['testduration'].apply( "testduration":df['testduration'].apply(
@@ -768,6 +769,17 @@ def performance_chart(user, startdate=None, enddate=None, kfitness=42, kfatigue=
"impulse":df['impulse'], "impulse":df['impulse'],
"date": df['date'].dt.strftime('%Y-%m-%d'), "date": df['date'].dt.strftime('%Y-%m-%d'),
}) })
except ComputeError:
df2 = pl.DataFrame({
"testpower" :df['testpower'],
"fitness":df['fitness'],
"fatigue":df['fatigue'],
"form":df['form'],
"impulse":df['impulse'],
"date": df['date'].dt.strftime('%Y-%m-%d'),
})
df2 = df2.with_columns((pl.lit("--")).alias("testduration"))
df2 = df2.fill_nan(0) df2 = df2.fill_nan(0)
+6
View File
@@ -3626,6 +3626,9 @@ class Workout(models.Model):
# empower stuff # empower stuff
inboard = models.FloatField(default=0.88) inboard = models.FloatField(default=0.88)
oarlength = models.FloatField(default=2.89) oarlength = models.FloatField(default=2.89)
seatnumber = models.IntegerField(default=1, verbose_name='Seat Number')
boatname = models.CharField(default='', blank=True, null=True, max_length=150, verbose_name='Boat Name')
empowerside = models.CharField(default='starboard', blank=True, null=True, max_length=150, verbose_name='Empower Oarlock side')
notes = models.CharField(blank=True, null=True, max_length=1000) notes = models.CharField(blank=True, null=True, max_length=1000)
summary = models.TextField(blank=True) summary = models.TextField(blank=True)
@@ -4360,6 +4363,9 @@ class WorkoutForm(ModelForm):
'distance', 'distance',
'workouttype', 'workouttype',
'boattype', 'boattype',
'boatname',
'seatnumber',
'empowerside',
'dragfactor', 'dragfactor',
'weightcategory', 'weightcategory',
'adaptiveclass', 'adaptiveclass',
+10
View File
@@ -82,6 +82,14 @@ def add_workout_from_data(userid, nkid, data, strokedata, source='nk', splitdata
oarlockfirmware = oarlocksession["firmwareVersion"] oarlockfirmware = oarlocksession["firmwareVersion"]
except KeyError: except KeyError:
oarlockfirmware = '' oarlockfirmware = ''
try:
boatName = oarlocksession["boatName"]
except:
boatName = ''
try:
portStarboard = oarlocksession["portStarboard"]
except:
portStarboard = 1
else: # pragma: no cover else: # pragma: no cover
# boatName = '' # boatName = ''
oarLength = 289 oarLength = 289
@@ -108,6 +116,8 @@ def add_workout_from_data(userid, nkid, data, strokedata, source='nk', splitdata
'totalDistance': totalDistance, 'totalDistance': totalDistance,
'useImpeller': useImpeller, 'useImpeller': useImpeller,
'seatNumber': seatNumber, 'seatNumber': seatNumber,
'boatName': boatName,
'portStarboard': portStarboard,
} }
dologging('nklog.log',json.dumps(uploadoptions)) dologging('nklog.log',json.dumps(uploadoptions))
+22
View File
@@ -0,0 +1,22 @@
{% load rowerfilters %}
{% load tz %}
<ul class="main-content">
<li class="grid_2">
<table width=100%>
<tr>
{% localtime on %}
<th>Seat Number:</th><td>{{ workout.seatnumber}}</td>
{% endlocaltime %}
</tr><tr>
<th>Empower side:</th><td>{{ workout.empowerside }}</td>
</tr><tr>
<th>Boat name:</th><td>{{ workout.boatname }}</td>
</tr><tr>
<th>Oar length:</th><td>{{ workout.oarlength }}</td>
</tr><tr>
<th>Oar inboard:</th><td>{{ workout.inboard }}</td>
</tr>
</table>
</li>
</ul>
+3
View File
@@ -95,6 +95,9 @@ class CPChartTest(TestCase):
'distance': 500, 'distance': 500,
'workouttype': 'rower', 'workouttype': 'rower',
'boattype': '1x', 'boattype': '1x',
'boatname': 'CatchUp',
'empowerside': 'starboard',
'seatnumber': 1,
'weightcategory': 'hwt', 'weightcategory': 'hwt',
'adaptiveclass': 'None', 'adaptiveclass': 'None',
'notes': faker.text(), 'notes': faker.text(),
+3
View File
@@ -1121,6 +1121,9 @@ class IndoorChallengesTest(TestCase):
'adaptiveclass': 'None', 'adaptiveclass': 'None',
'notes': faker.text(), 'notes': faker.text(),
'rankingpiece': True, 'rankingpiece': True,
'empowerside': 'port',
'boatname': 'Dolfijn',
'seatnumber': 1,
'duplicate': False, 'duplicate': False,
'avghr': '160', 'avghr': '160',
'avgpwr': 0, 'avgpwr': 0,
+3
View File
@@ -34,6 +34,9 @@ class DataTest(TestCase):
'workouttype':'water', 'workouttype':'water',
'rpe':1, 'rpe':1,
'boattype':'1x', 'boattype':'1x',
'boatname': 'BOAT1',
'empowerside': 'port',
'seatnumber': 4,
'private':False, 'private':False,
} }
form = WorkoutForm(data=form_data) form = WorkoutForm(data=form_data)
+3
View File
@@ -101,6 +101,9 @@ class ViewTest(TestCase):
'rpe':4, 'rpe':4,
'dragfactor':'112', 'dragfactor':'112',
'raceid':0, 'raceid':0,
'seatnumber': 1,
'boatname': '',
'empowerside': 'port',
'landingpage':'workout_edit_view', 'landingpage':'workout_edit_view',
'private':True, 'private':True,
'notes':'noot mies', 'notes':'noot mies',
Binary file not shown.
+1
View File
@@ -64,6 +64,7 @@ workflowmiddlepanel = (
('panel_summary.html', 'Summary'), ('panel_summary.html', 'Summary'),
('panel_map.html', 'Map'), ('panel_map.html', 'Map'),
('panel_comments.html', 'Basic Info and Links'), ('panel_comments.html', 'Basic Info and Links'),
('panel_empower.html', 'Empower Oarlock Info'),
('panel_notes.html', 'Workout Notes'), ('panel_notes.html', 'Workout Notes'),
('panel_shortcomment.html', 'Comment Link'), ('panel_shortcomment.html', 'Comment Link'),
('panel_middlesocial.html', 'Social Media Share Buttons'), ('panel_middlesocial.html', 'Social Media Share Buttons'),
+23
View File
@@ -680,6 +680,9 @@ def addmanual_view(request, raceid=0):
privacy = form.cleaned_data.get('privacy', 'visible') privacy = form.cleaned_data.get('privacy', 'visible')
rankingpiece = form.cleaned_data.get('rankingpiece', False) rankingpiece = form.cleaned_data.get('rankingpiece', False)
duplicate = form.cleaned_data.get('duplicate', False) duplicate = form.cleaned_data.get('duplicate', False)
seatnumber = form.cleaned_data.get('seatnumber', 1)
boatname = form.cleaned_data.get('boatname', '')
empowerside = form.cleaned_data.get('empowerside','port')
if private: # pragma: no cover if private: # pragma: no cover
privacy = 'private' privacy = 'private'
@@ -723,6 +726,9 @@ def addmanual_view(request, raceid=0):
w.rpe = rpe w.rpe = rpe
w.workouttype = workouttype w.workouttype = workouttype
w.boattype = boattype w.boattype = boattype
w.boatname = boatname
w.empowerside = empowerside
w.seatnumber = seatnumber
w.distance = distance w.distance = distance
w.duration = duration w.duration = duration
w.save() w.save()
@@ -4385,6 +4391,10 @@ def workout_edit_view(request, id=0, message="", successmessage=""):
'rankingpiece', Workout.objects.get(id=row.id).rankingpiece) 'rankingpiece', Workout.objects.get(id=row.id).rankingpiece)
duplicate = form.cleaned_data.get( duplicate = form.cleaned_data.get(
'duplicate', Workout.objects.get(id=row.id).duplicate) 'duplicate', Workout.objects.get(id=row.id).duplicate)
seatnumber = form.cleaned_data.get('seatnumber', 1)
boatname = form.cleaned_data.get('boatname', '')
empowerside = form.cleaned_data.get('empowerside','port')
if private: if private:
privacy = 'private' privacy = 'private'
@@ -4438,6 +4448,9 @@ def workout_edit_view(request, id=0, message="", successmessage=""):
row.rankingpiece = rankingpiece row.rankingpiece = rankingpiece
row.timezone = thetimezone row.timezone = thetimezone
row.plannedsession = ps row.plannedsession = ps
row.boatname = boatname
row.empowerside = empowerside
row.seatnumber = seatnumber
dragchanged = False dragchanged = False
if newdragfactor != row.dragfactor: # pragma: no cover if newdragfactor != row.dragfactor: # pragma: no cover
@@ -4855,6 +4868,13 @@ def workout_upload_api(request):
inboard = post_data.get('inboard', None) inboard = post_data.get('inboard', None)
oarlength = post_data.get('oarlength', None) oarlength = post_data.get('oarlength', None)
useImpeller = post_data.get('useImpeller', False) useImpeller = post_data.get('useImpeller', False)
seatnumber = post_data.get('seatNumber', 1)
boatname = post_data.get('boatName','')
portStarboard = post_data.get('portStarboard', 1)
empowerside = 'port'
if portStarboard == 1:
empowerside = 'starboard'
totalDistance = post_data.get('totalDistance', None) totalDistance = post_data.get('totalDistance', None)
elapsedTime = post_data.get('elapsedTime', None) elapsedTime = post_data.get('elapsedTime', None)
@@ -4946,6 +4966,9 @@ def workout_upload_api(request):
oarlength=oarlength, oarlength=oarlength,
impeller=useImpeller, impeller=useImpeller,
workoutid=workoutid, workoutid=workoutid,
empowerside=empowerside,
boatname=boatname,
seatnumber=seatnumber,
) )
if id == 0: # pragma: no cover if id == 0: # pragma: no cover