Merge branch 'feature/nkseatnumber' into develop
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
BIN
Binary file not shown.
@@ -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'),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user