Private
Public Access
1
0

Merge branch 'develop' into feature/gauges

This commit is contained in:
Sander Roosendaal
2019-12-22 20:20:58 +01:00
20 changed files with 104 additions and 65 deletions

View File

@@ -1388,7 +1388,7 @@ def parsenonpainsled(fileformat,f2,summary):
try: try:
row = parsers[fileformat](f2) row = parsers[fileformat](f2)
hasrecognized = True hasrecognized = True
except KeyError: except (KeyError,IndexError):
hasrecognized = False hasrecognized = False
return None, hasrecognized, '', 'unknown' return None, hasrecognized, '', 'unknown'

View File

@@ -715,6 +715,8 @@ def getsmallrowdata_db(columns,ids=[],debug=False):
data = [] data = []
columns = [c for c in columns if c != 'None'] columns = [c for c in columns if c != 'None']
df = pd.DataFrame()
if len(ids)>1: if len(ids)>1:
for id, f in zip(ids,csvfilenames): for id, f in zip(ids,csvfilenames):
try: try:
@@ -728,11 +730,13 @@ def getsmallrowdata_db(columns,ids=[],debug=False):
df = pd.concat(data,axis=0) df = pd.concat(data,axis=0)
except ValueError: except ValueError:
df = pd.DataFrame() df = pd.DataFrame()
else: elif len(ids)==1:
try: try:
df = pd.read_parquet(csvfilenames[0],columns=columns,engine='pyarrow') df = pd.read_parquet(csvfilenames[0],columns=columns,engine='pyarrow')
except (OSError,IndexError): except (OSError,IndexError):
df = pd.DataFrame() df = pd.DataFrame()
else:
df = pd.DataFrame()
return df return df

View File

@@ -1398,6 +1398,7 @@ class TrainingPlan(models.Model):
status = models.BooleanField(default=True,verbose_name='Active') status = models.BooleanField(default=True,verbose_name='Active')
target = models.ForeignKey(TrainingTarget,blank=True,null=True,on_delete=models.SET_NULL) target = models.ForeignKey(TrainingTarget,blank=True,null=True,on_delete=models.SET_NULL)
startdate = models.DateField(default=current_day) startdate = models.DateField(default=current_day)
notes = models.CharField(blank=True,null=True,max_length=200,verbose_name='Plan Notes')
enddate = models.DateField( enddate = models.DateField(
default=half_year_from_now) default=half_year_from_now)
@@ -1476,11 +1477,12 @@ class TrainingPlan(models.Model):
class TrainingPlanForm(ModelForm): class TrainingPlanForm(ModelForm):
class Meta: class Meta:
model = TrainingPlan model = TrainingPlan
fields = ['name','target','startdate','enddate','status','rowers'] fields = ['name','target','startdate','enddate','status','notes','rowers']
widgets = { widgets = {
'startdate': AdminDateWidget(), 'startdate': AdminDateWidget(),
'enddate': AdminDateWidget() 'enddate': AdminDateWidget(),
'notes': forms.Textarea()
} }
def __init__(self,*args, **kwargs): def __init__(self,*args, **kwargs):

View File

@@ -1754,15 +1754,15 @@ def handle_updatefitnessmetric(user_id,mode,workoutids,debug=False,
def handle_updatecp(rower_id,workoutids,debug=False,table='cpdata',**kwargs): def handle_updatecp(rower_id,workoutids,debug=False,table='cpdata',**kwargs):
columns = ['power','workoutid','time'] columns = ['power','workoutid','time']
df = getsmallrowdata_db(columns,ids=workoutids,debug=debug) df = getsmallrowdata_db(columns,ids=workoutids,debug=debug)
dfgrouped = df.groupby(['workoutid'])
if not df.empty: if df.empty:
return 0
maxt = 1.05*df['time'].max()/1000. maxt = 1.05*df['time'].max()/1000.
else:
maxt = 1000.
logarr = datautils.getlogarr(maxt) logarr = datautils.getlogarr(maxt)
dfgrouped = df.groupby(['workoutid'])
delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr) delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr)

View File

@@ -46,7 +46,7 @@
function copyText() { function copyText() {
var tempInput = document.createElement("input"); var tempInput = document.createElement("input");
tempInput.style = "position: absolute; left: -1000px; top: -1000px"; tempInput.style = "position: absolute; left: -1000px; top: -1000px";
tempInput.value = "https://rowsandall.com/rowers/video/{{ analysis.id|encode }}/"; tempInput.value = "{{ siteurl }}/rowers/video/{{ analysis.id|encode }}/";
document.body.appendChild(tempInput); document.body.appendChild(tempInput);
tempInput.select(); tempInput.select();
document.execCommand("copy"); document.execCommand("copy");
@@ -125,7 +125,7 @@ function copyText() {
{% if analysis %} {% if analysis %}
<li class="grid_2"> <li class="grid_2">
<span class="fb-share-button" style="height:20px; vertical-align: top;" <span class="fb-share-button" style="height:20px; vertical-align: top;"
data-href="https://rowsandall.com/rowers/video/{{ analysis.id|encode }}" data-href="{{ siteurl }}/rowers/video/{{ analysis.id|encode }}"
data-layout="button" data-size="small" data-mobile-iframe="false"> data-layout="button" data-size="small" data-mobile-iframe="false">
<a class="fb-xfbml-parse-ignore" target="_blank" <a class="fb-xfbml-parse-ignore" target="_blank"
href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/video/{{ analysis.id|encode }}/"> href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/video/{{ analysis.id|encode }}/">
@@ -134,7 +134,7 @@ function copyText() {
<span> <span>
<a class="twitter-share-button" <a class="twitter-share-button"
href="https://twitter.com/intent/tweet" href="https://twitter.com/intent/tweet"
data-url="https://rowsandall.com/rowers/video/{{ analysis.id|encode }}/" data-url="{{ siteurl }}/rowers/video/{{ analysis.id|encode }}/"
data-text="@rowsandall #rowingdata">Tweet</a> data-text="@rowsandall #rowingdata">Tweet</a>
</span> </span>
<span> <span>
@@ -310,7 +310,7 @@ function copyText() {
} }
</script> </script>
</li> </li>
{% if user.is_authenticated and user == workout.user.user %} {% if user.is_authenticated and workout|may_edit:request %}
<li class="grid_4"> <li class="grid_4">
<input type="checkbox" name="lock" id="lock" value="Lock">Lock Data and Video <input type="checkbox" name="lock" id="lock" value="Lock">Lock Data and Video
</li> </li>
@@ -326,7 +326,7 @@ function copyText() {
<li class="grid_2"> <li class="grid_2">
{% if form and user.is_authenticated and user == workout.user.user %} {% if form and user.is_authenticated and workout|may_edit:request %}
<table> <table>
{{ form.as_table }} {{ form.as_table }}

View File

@@ -23,10 +23,10 @@
</p> </p>
</li> </li>
<li class="grid_2"> <li class="grid_2">
<p><a href="/rowers/sessions/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by <p><a href="/rowers/sessions/coach/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
<p><a href="/rowers/sessions/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by <p><a href="/rowers/sessions/coach/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
</li> </li>

View File

@@ -19,10 +19,10 @@
</p> </p>
</li> </li>
<li class="grid_2"> <li class="grid_2">
<p><a href="/rowers/sessions/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by <p><a href="/rowers/sessions/teamcreate/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
<p><a href="/rowers/sessions/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by <p><a href="/rowers/sessions/teamcreate/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
</li> </li>
@@ -93,6 +93,9 @@
<td> <td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm/">Delete</a> <a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm/">Delete</a>
</td>
<td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/maketemplate/">Save</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@@ -19,10 +19,10 @@
</p> </p>
</li> </li>
<li class="grid_2"> <li class="grid_2">
<p><a href="/rowers/sessions/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by <p><a href="/rowers/sessions/coach/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
<p><a href="/rowers/sessions/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by <p><a href="/rowers/sessions/coach/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
</li> </li>
@@ -116,6 +116,9 @@
<td> <td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm">Delete</a> <a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm">Delete</a>
</td> </td>
<td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/maketemplate/">Save</a>
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

View File

@@ -19,6 +19,9 @@
&nbsp; &nbsp;
{% endif %} {% endif %}
</p> </p>
<p>
Login <em>{{ rower.user }}</em>
</p>
{% if userform.errors %} {% if userform.errors %}
<p style="color: red;"> <p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below. Please correct the error{{ form.errors|pluralize }} below.

View File

@@ -24,6 +24,11 @@
The training plan target is: {{ plan.target.name }} on {{ plan.target.date }}. The training plan target is: {{ plan.target.name }} on {{ plan.target.date }}.
{% endif %} {% endif %}
</p> </p>
<h2>Notes</h2>
<p>
{{ plan.notes }}
</p>
{% if plan|mayeditplan:request %} {% if plan|mayeditplan:request %}
<p><a href="/rowers/editplan/{{ plan.id }}">Edit the plan</a></p> <p><a href="/rowers/editplan/{{ plan.id }}">Edit the plan</a></p>
{% endif %} {% endif %}

View File

@@ -1557,7 +1557,7 @@ def plannedsession_totemplate_view(request,id=0):
ps.enddate = datetime.date(1970,1,1) ps.enddate = datetime.date(1970,1,1)
ps.save() ps.save()
url = reverse(plannedsession_create_view,kwargs={'userid':request.user.id}) url = reverse(plannedsession_create_view,kwargs={'userid':r.user.id})
startdatestring = startdate.strftime('%Y-%m-%d') startdatestring = startdate.strftime('%Y-%m-%d')
enddatestring = enddate.strftime('%Y-%m-%d') enddatestring = enddate.strftime('%Y-%m-%d')
@@ -2021,6 +2021,7 @@ def rower_create_trainingplan(request,userid=0):
startdate = form.cleaned_data['startdate'] startdate = form.cleaned_data['startdate']
status = form.cleaned_data['status'] status = form.cleaned_data['status']
enddate = form.cleaned_data['enddate'] enddate = form.cleaned_data['enddate']
notes = form.cleaned_data['notes']
try: try:
athletes = form.cleaned_data['rowers'] athletes = form.cleaned_data['rowers']
@@ -2033,6 +2034,7 @@ def rower_create_trainingplan(request,userid=0):
manager=themanager, manager=themanager,
startdate=startdate, startdate=startdate,
enddate=enddate,status=status, enddate=enddate,status=status,
notes=notes,
) )
p.save() p.save()

View File

@@ -156,6 +156,7 @@ def workout_video_view(request,id=''):
'locked': True, 'locked': True,
'metricsform':metricsform, 'metricsform':metricsform,
'metricsgroups': metricsgroups, 'metricsgroups': metricsgroups,
'siteurl': settings.SITE_URL,
}) })
@@ -171,6 +172,9 @@ def workout_video_create_view(request,id=0):
else: else:
mode = 'erg' mode = 'erg'
mayedit = checkworkoutuser(request.user,w) and isprorower(request.user.rower)
# get video ID and offset # get video ID and offset
if request.method == 'POST': if request.method == 'POST':
form = VideoAnalysisCreateForm(request.POST) form = VideoAnalysisCreateForm(request.POST)
@@ -265,6 +269,7 @@ def workout_video_create_view(request,id=0):
'metrics':metrics, 'metrics':metrics,
'metricsgroups': metricsgroups, 'metricsgroups': metricsgroups,
'locked': False, 'locked': False,
'siteurl': settings.SITE_URL,
}) })
# Show the EMpower Oarlock generated Stroke Profile # Show the EMpower Oarlock generated Stroke Profile

1
static/rigging/1x.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":0.9,"Mb":14,"BladeLength":0.46,"Lscull":2.425,"Nrowers":1,"RowOrScull":"scull","Span":1.6,"CatchAngle":-0.93,"DragForm":0.98}

1
static/rigging/2-.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":1.14,"Mb":27,"BladeLength":0.46,"Lscull":2.975,"Nrowers":2,"RowOrScull":"row","Span":1.6,"CatchAngle":-0.93,"DragForm":1.05}

1
static/rigging/2x.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":0.9,"Mb":27,"BladeLength":0.46,"Lscull":2.425,"Nrowers":2,"RowOrScull":"scull","Span":1.6,"CatchAngle":-0.93,"DragForm":1.05}

1
static/rigging/4-.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":1.14,"Mb":50,"BladeLength":0.545,"Lscull":2.9325,"Nrowers":4,"RowOrScull":"row","Span":1.6,"CatchAngle":-0.93,"DragForm":1}

1
static/rigging/4x.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":0.9,"Mb":52,"BladeLength":0.46,"Lscull":2.425,"Nrowers":4,"RowOrScull":"scull","Span":1.6,"CatchAngle":-0.93,"DragForm":1.11}

1
static/rigging/8+.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":1.14,"Mb":151,"BladeLength":0.545,"Lscull":2.9325,"Nrowers":8,"RowOrScull":"row","Span":1.6,"CatchAngle":-0.93,"DragForm":1}

View File

@@ -56,6 +56,12 @@
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.10&appId=694685920739849"; js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.10&appId=694685920739849";
fjs.parentNode.insertBefore(js, fjs); fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script> }(document, 'script', 'facebook-jssdk'));</script>
<script>
$(document).ready(function (){
FB.XFBML.parse();
})
</script>
<link rel="stylesheet" href="https://webapiv2.navionics.com/dist/webapi/webapi.min.css" > <link rel="stylesheet" href="https://webapiv2.navionics.com/dist/webapi/webapi.min.css" >
<script type="text/javascript" src="https://webapiv2.navionics.com/dist/webapi/webapi.min.no-dep.js"></script> <script type="text/javascript" src="https://webapiv2.navionics.com/dist/webapi/webapi.min.no-dep.js"></script>
<script>window.twttr = (function(d, s, id) { <script>window.twttr = (function(d, s, id) {