Merge branch 'develop' into feature/gauges
This commit is contained in:
@@ -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'
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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 }}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -19,6 +19,9 @@
|
|||||||
|
|
||||||
{% 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.
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
1
static/rigging/1x.json
Normal 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
1
static/rigging/2-.json
Normal 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
1
static/rigging/2x.json
Normal 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
1
static/rigging/4-.json
Normal 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
1
static/rigging/4x.json
Normal 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
1
static/rigging/8+.json
Normal 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}
|
||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user