Merge branch 'release/v8.00'
This commit is contained in:
+4
-1
@@ -266,7 +266,10 @@ def summaryfromsplitdata(splitdata,data,filename,sep='|'):
|
||||
idist = interval['distance']
|
||||
itime = interval['time']/10.
|
||||
ipace = 500.*itime/idist
|
||||
ispm = interval['stroke_rate']
|
||||
try:
|
||||
ispm = interval['stroke_rate']
|
||||
except KeyError:
|
||||
ispm = 0
|
||||
try:
|
||||
irest_time = interval['rest_time']/10.
|
||||
except KeyError:
|
||||
|
||||
@@ -241,6 +241,7 @@ def add_c2_stroke_data_db(strokedata,workoutid,starttimeunix,csvfilename,
|
||||
hr = strokedata.ix[:,'hr']
|
||||
except KeyError:
|
||||
hr = 0*spm
|
||||
|
||||
pace = strokedata.ix[:,'p']/10.
|
||||
pace = np.clip(pace,0,1e4)
|
||||
pace = pace.replace(0,300)
|
||||
@@ -1241,7 +1242,7 @@ def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True,
|
||||
with engine.connect() as conn, conn.begin():
|
||||
try:
|
||||
data.to_sql('strokedata',engine,if_exists='append',index=False)
|
||||
except OperationalError:
|
||||
except:
|
||||
data.drop(columns=['rhythm'],inplace=True)
|
||||
data.to_sql('strokedata',engine,if_exists='append',index=False)
|
||||
|
||||
|
||||
+71
-1
@@ -7,12 +7,14 @@ from django.contrib.auth.models import User
|
||||
from django.contrib.admin.widgets import AdminDateWidget
|
||||
from django.forms.extras.widgets import SelectDateWidget
|
||||
from django.utils import timezone,translation
|
||||
from django.forms import ModelForm
|
||||
from django.forms import ModelForm, Select
|
||||
import dataprep
|
||||
import types
|
||||
import datetime
|
||||
from django.forms import formset_factory
|
||||
from utils import landingpages
|
||||
from metrics import axes
|
||||
|
||||
|
||||
# login form
|
||||
class LoginForm(forms.Form):
|
||||
@@ -29,6 +31,7 @@ class EmailForm(forms.Form):
|
||||
message = forms.CharField()
|
||||
|
||||
|
||||
|
||||
# Upload the CrewNerd Summary CSV
|
||||
class CNsummaryForm(forms.Form):
|
||||
file = forms.FileField(required=True,validators=[must_be_csv])
|
||||
@@ -919,3 +922,70 @@ class VirtualRaceSelectForm(forms.Form):
|
||||
self.fields['country'] = forms.ChoiceField(
|
||||
choices = get_countries(),initial='All'
|
||||
)
|
||||
|
||||
class FlexOptionsForm(forms.Form):
|
||||
includereststrokes = forms.BooleanField(initial=True, required = False,
|
||||
label='Include Rest Strokes')
|
||||
plotchoices = (
|
||||
('line','Line Plot'),
|
||||
('scatter','Scatter Plot'),
|
||||
)
|
||||
plottype = forms.ChoiceField(choices=plotchoices,initial='scatter',
|
||||
label='Chart Type')
|
||||
|
||||
|
||||
class FlexAxesForm(forms.Form):
|
||||
axchoices = (
|
||||
(ax[0],ax[1]) for ax in axes if ax[0] not in ['cumdist','None']
|
||||
)
|
||||
|
||||
|
||||
yaxchoices = (
|
||||
(ax[0], ax[1]) for ax in axes if ax[0] not in ['cumdist','distance','time']
|
||||
)
|
||||
|
||||
yaxchoices2 = (
|
||||
(ax[0], ax[1]) for ax in axes if ax[0] not in ['cumdist','distance','time']
|
||||
)
|
||||
|
||||
|
||||
xaxis = forms.ChoiceField(
|
||||
choices=axchoices,label='X-Axis',required=True)
|
||||
yaxis1 = forms.ChoiceField(
|
||||
choices=yaxchoices,label='Left Axis',required=True)
|
||||
yaxis2 = forms.ChoiceField(
|
||||
choices=yaxchoices2,label='Right Axis',required=True)
|
||||
|
||||
def __init__(self,request,*args,**kwargs):
|
||||
super(FlexAxesForm, self).__init__(*args, **kwargs)
|
||||
|
||||
rower = Rower.objects.get(user=request.user)
|
||||
|
||||
axchoicespro = (
|
||||
('',ax[1]) if ax[4] == 'pro' and ax[0] else (ax[0],ax[1]) for ax in axes
|
||||
)
|
||||
|
||||
axchoicesbasicx = []
|
||||
axchoicesbasicy = []
|
||||
|
||||
for ax in axes:
|
||||
if ax[4] != 'pro' and ax[0] != 'cumdist':
|
||||
if ax[0] != 'None':
|
||||
axchoicesbasicx.insert(0,(ax[0],ax[1]))
|
||||
if ax[0] not in ['cumdist','distance','time']:
|
||||
axchoicesbasicy.insert(0,(ax[0],ax[1]))
|
||||
else:
|
||||
if ax[0] != 'None':
|
||||
axchoicesbasicx.insert(0,('None',ax[1]+' (PRO)'))
|
||||
if ax[0] not in ['cumdist','distance','time']:
|
||||
axchoicesbasicy.insert(0,('None',ax[1]+' (PRO)'))
|
||||
|
||||
|
||||
if rower.rowerplan == 'basic':
|
||||
self.fields['xaxis'].choices = axchoicesbasicx
|
||||
self.fields['yaxis1'].choices = axchoicesbasicy
|
||||
self.fields['yaxis2'].choices = axchoicesbasicy
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+43
-10
@@ -181,10 +181,11 @@ def interactive_boxchart(datadf,fieldname,extratitle=''):
|
||||
tools=TOOLS,
|
||||
toolbar_location="above",
|
||||
toolbar_sticky=False,
|
||||
x_mapper_type='datetime')
|
||||
x_mapper_type='datetime',plot_width=920)
|
||||
|
||||
yrange1 = Range1d(start=yaxminima[fieldname],end=yaxmaxima[fieldname])
|
||||
plot.y_range = yrange1
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.xaxis.axis_label = 'Date'
|
||||
plot.yaxis.axis_label = axlabels[fieldname]
|
||||
@@ -299,6 +300,7 @@ def interactive_activitychart(workouts,startdate,enddate,stack='type'):
|
||||
toolbar_location = None,
|
||||
)
|
||||
|
||||
|
||||
for legend in p.legend:
|
||||
new_items = []
|
||||
for legend_item in legend.items:
|
||||
@@ -311,6 +313,7 @@ def interactive_activitychart(workouts,startdate,enddate,stack='type'):
|
||||
|
||||
p.legend.location = "top_left"
|
||||
p.legend.background_fill_alpha = 0.7
|
||||
p.sizing_mode = 'scale_width'
|
||||
|
||||
p.yaxis.axis_label = 'Minutes'
|
||||
|
||||
@@ -411,6 +414,7 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False):
|
||||
# add watermark
|
||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
||||
plot.extra_x_ranges = {"watermark": watermarkrange}
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.image_url([watermarkurl],watermarkx,watermarky,
|
||||
watermarkw,watermarkh,
|
||||
@@ -625,6 +629,8 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False):
|
||||
),
|
||||
plot])
|
||||
|
||||
layout.sizing_mode = 'scale_width'
|
||||
|
||||
script, div = components(layout)
|
||||
js_resources = INLINE.render_js()
|
||||
css_resources = INLINE.render_css()
|
||||
@@ -748,9 +754,10 @@ def fitnessmetric_chart(fitnessmetrics,user,workoutmode='rower'):
|
||||
)
|
||||
|
||||
plot.xaxis.major_label_orientation = pi/4
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.y_range = Range1d(0,1.5*max(power4min))
|
||||
plot.title.text = 'Power levels from workouts '+user.first_name
|
||||
plot.title.text = 'Power levels ('+workoutmode+') from workouts '+user.first_name
|
||||
|
||||
hover = plot.select(dict(type=HoverTool))
|
||||
|
||||
@@ -833,6 +840,7 @@ def interactive_histoall(theworkouts):
|
||||
plot.xaxis.axis_label = "Power (W)"
|
||||
plot.yaxis.axis_label = "% of strokes"
|
||||
plot.y_range = Range1d(0,1.05*max(hist_norm))
|
||||
|
||||
|
||||
hover = plot.select(dict(type=HoverTool))
|
||||
|
||||
@@ -850,6 +858,7 @@ def interactive_histoall(theworkouts):
|
||||
plot.add_layout(LinearAxis(y_range_name="fraction",
|
||||
axis_label="Cumulative % of strokes"),'right')
|
||||
|
||||
plot.sizing_mode = 'scale_width'
|
||||
script, div = components(plot)
|
||||
return [script,div]
|
||||
|
||||
@@ -985,7 +994,7 @@ def course_map(course):
|
||||
)
|
||||
|
||||
div = """
|
||||
<div id="map_canvas" style="width: 100%; height: 400px;"><p> </p></div>
|
||||
<div id="map_canvas" style="width: 100%; height: 400px; margin:0; padding:0;grid-gap:0;"></div>
|
||||
"""
|
||||
|
||||
return script,div
|
||||
@@ -1483,8 +1492,12 @@ def interactive_agegroupcpchart(age,normalized=False):
|
||||
x_axis_type = 'log'
|
||||
y_axis_type = 'linear'
|
||||
|
||||
plot = Figure(plot_width=900,x_axis_type=x_axis_type)
|
||||
TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,resize,crosshair'
|
||||
|
||||
plot = Figure(plot_width=900,x_axis_type=x_axis_type,
|
||||
tools=TOOLS)
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.line('duration','fitpowerfh',source=source,
|
||||
legend='Female HW',color='blue')
|
||||
plot.line('duration','fitpowerfl',source=source,
|
||||
@@ -1574,6 +1587,7 @@ def interactive_otwcpchart(powerdf,promember=0,rowername=""):
|
||||
|
||||
# add watermark
|
||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.image_url([watermarkurl],1.8*max(thesecs),watermarky,
|
||||
watermarkw,watermarkh,
|
||||
@@ -1664,6 +1678,7 @@ def interactive_agegroup_plot(df,distance=2000,duration=None,
|
||||
TOOLS = 'save,pan,box_zoom,wheel_zoom,reset,tap,hover,resize,crosshair'
|
||||
|
||||
plot = Figure(tools=TOOLS,plot_width=900)
|
||||
plot.sizing_mode='scale_width'
|
||||
plot.circle('age','power',source=source,fill_color='red',size=15,
|
||||
legend='World Record')
|
||||
|
||||
@@ -1861,6 +1876,7 @@ def interactive_cpchart(rower,thedistances,thesecs,theavpower,
|
||||
|
||||
# add watermark
|
||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.image_url([watermarkurl],1.8*max(thesecs),watermarky,
|
||||
watermarkw,watermarkh,
|
||||
@@ -2043,6 +2059,7 @@ def interactive_windchart(id=0,promember=0):
|
||||
plot.xaxis.axis_label = "Distance (m)"
|
||||
plot.yaxis.axis_label = "Wind Speed (m/s)"
|
||||
plot.y_range = Range1d(-7,7)
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
|
||||
plot.extra_y_ranges = {"winddirection": Range1d(start=0,end=360)}
|
||||
@@ -2110,6 +2127,7 @@ def interactive_streamchart(id=0,promember=0):
|
||||
plot.xaxis.axis_label = "Distance (m)"
|
||||
plot.yaxis.axis_label = "River Current (m/s)"
|
||||
plot.y_range = Range1d(-2,2)
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
|
||||
script, div = components(plot)
|
||||
@@ -2179,6 +2197,7 @@ def interactive_chart(id=0,promember=0,intervaldata = {}):
|
||||
plot.line('time','pace',source=source,legend="Pace",name="pace")
|
||||
plot.title.text = row.name
|
||||
plot.title.text_font_size=value("1.0em")
|
||||
plot.sizing_mode = 'scale_width'
|
||||
plot.xaxis.axis_label = "Time"
|
||||
plot.yaxis.axis_label = "Pace (/500m)"
|
||||
plot.xaxis[0].formatter = DatetimeTickFormatter(
|
||||
@@ -2348,7 +2367,7 @@ def interactive_multiflex(datadf,xparam,yparam,groupby,extratitle='',
|
||||
plot = Figure(x_axis_type=x_axis_type,y_axis_type=y_axis_type,
|
||||
tools=TOOLS,
|
||||
toolbar_location="above",
|
||||
toolbar_sticky=False) #,plot_width=500,plot_height=500)
|
||||
toolbar_sticky=False,plot_width=920)
|
||||
|
||||
# add watermark
|
||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
||||
@@ -2356,6 +2375,7 @@ def interactive_multiflex(datadf,xparam,yparam,groupby,extratitle='',
|
||||
|
||||
plot.title.text = title
|
||||
plot.title.text_font_size=value("1.0em")
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.image_url([watermarkurl],watermarkx,watermarky,
|
||||
watermarkw,watermarkh,
|
||||
@@ -2581,6 +2601,7 @@ def interactive_cum_flex_chart2(theworkouts,promember=0,
|
||||
# add watermark
|
||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
||||
plot.extra_x_ranges = {"watermark": watermarkrange}
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.image_url([watermarkurl],watermarkx,watermarky,
|
||||
watermarkw,watermarkh,
|
||||
@@ -2764,8 +2785,11 @@ def interactive_cum_flex_chart2(theworkouts,promember=0,
|
||||
title="Max Work per Stroke",callback=callback)
|
||||
callback.args["maxwork"] = slider_work_max
|
||||
|
||||
distmax = 100+100*int(datadf['distance'].max()/100.)
|
||||
|
||||
try:
|
||||
distmax = 100+100*int(datadf['distance'].max()/100.)
|
||||
except KeyError:
|
||||
distmax = 1000.
|
||||
|
||||
slider_dist_min = Slider(start=0,end=distmax,value=0,step=1,
|
||||
title="Min Distance",callback=callback)
|
||||
callback.args["mindist"] = slider_dist_min
|
||||
@@ -2785,6 +2809,8 @@ def interactive_cum_flex_chart2(theworkouts,promember=0,
|
||||
),
|
||||
plot])
|
||||
|
||||
layout.sizing_mode = 'scale_width'
|
||||
|
||||
script, div = components(layout)
|
||||
js_resources = INLINE.render_js()
|
||||
css_resources = INLINE.render_css()
|
||||
@@ -2984,8 +3010,6 @@ def interactive_flex_chart2(id=0,promember=0,
|
||||
|
||||
|
||||
|
||||
sizing_mode = 'fixed' # 'scale_width' also looks nice with this example
|
||||
|
||||
plot = Figure(x_axis_type=x_axis_type,y_axis_type=y_axis_type,
|
||||
tools=TOOLS,
|
||||
toolbar_sticky=False
|
||||
@@ -2996,6 +3020,7 @@ def interactive_flex_chart2(id=0,promember=0,
|
||||
# add watermark
|
||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
||||
plot.extra_x_ranges = {"watermark": watermarkrange}
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.image_url([watermarkurl],watermarkx,watermarky,
|
||||
watermarkw,watermarkh,
|
||||
@@ -3322,7 +3347,9 @@ def interactive_flex_chart2(id=0,promember=0,
|
||||
slider_work_max,
|
||||
],
|
||||
),
|
||||
plot])
|
||||
plot])
|
||||
|
||||
layout.sizing_mode = 'scale_width'
|
||||
|
||||
script, div = components(layout)
|
||||
js_resources = INLINE.render_js()
|
||||
@@ -3489,6 +3516,8 @@ def thumbnail_flex_chart(rowdata,id=0,promember=0,
|
||||
|
||||
|
||||
|
||||
# plot.sizing_mode = 'scale_width'
|
||||
plot.sizing_mode = 'fixed'
|
||||
plot.toolbar.logo = None
|
||||
plot.toolbar_location = None
|
||||
#plot.yaxis.visible = False
|
||||
@@ -3598,6 +3627,7 @@ def interactive_bar_chart(id=0,promember=0):
|
||||
# add watermark
|
||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
||||
plot.extra_x_ranges = {"watermark": watermarkrange}
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.image_url([watermarkurl],0.01,0.99,
|
||||
watermarkw,watermarkh,
|
||||
@@ -3765,6 +3795,7 @@ def interactive_multiple_compare_chart(ids,xparam,yparam,plottype='line',
|
||||
# add watermark
|
||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
||||
plot.extra_x_ranges = {"watermark": watermarkrange}
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.image_url([watermarkurl],0.05,0.9,
|
||||
watermarkw,watermarkh,
|
||||
@@ -4009,6 +4040,7 @@ def interactive_comparison_chart(id1=0,id2=0,xparam='distance',yparam='spm',
|
||||
# add watermark
|
||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
||||
plot.extra_x_ranges = {"watermark": watermarkrange}
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.image_url([watermarkurl],0.05,watermarky,
|
||||
watermarkw,watermarkh,
|
||||
@@ -4139,6 +4171,7 @@ def interactive_otw_advanced_pace_chart(id=0,promember=0):
|
||||
# add watermark
|
||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
||||
plot.extra_x_ranges = {"watermark": watermarkrange}
|
||||
plot.sizing_mode = 'scale_width'
|
||||
|
||||
plot.image_url([watermarkurl],watermarkx,watermarky,
|
||||
watermarkw,watermarkh,
|
||||
|
||||
@@ -32,6 +32,34 @@ import courses
|
||||
|
||||
from rowers.tasks import handle_check_race_course
|
||||
|
||||
def get_todays_micro(plan,thedate=date.today()):
|
||||
thismicro = None
|
||||
|
||||
thismacro = TrainingMacroCycle.objects.filter(
|
||||
plan=plan,
|
||||
startdate__lte = thedate,
|
||||
enddate__gte = thedate
|
||||
)
|
||||
|
||||
if thismacro:
|
||||
thismeso = TrainingMesoCycle.objects.filter(
|
||||
plan=thismacro[0],
|
||||
startdate__lte = thedate,
|
||||
enddate__gte = thedate
|
||||
)
|
||||
|
||||
if thismeso:
|
||||
thismicro = TrainingMicroCycle.objects.filter(
|
||||
plan=thismeso[0],
|
||||
startdate__lte = thedate,
|
||||
enddate__gte = thedate
|
||||
)
|
||||
|
||||
if thismicro:
|
||||
thismicro = thismicro[0]
|
||||
|
||||
return thismicro
|
||||
|
||||
# Low Level functions - to be called by higher level methods
|
||||
def add_workouts_plannedsession(ws,ps,r):
|
||||
result = 0
|
||||
|
||||
+10
-10
@@ -1382,7 +1382,7 @@ def handle_makeplot(f1, f2, t, hrdata, plotnr, imagename,
|
||||
@app.task
|
||||
def handle_sendemail_invite(email, name, code, teamname, manager,
|
||||
debug=False,**kwargs):
|
||||
fullemail = name + ' <' + email + '>'
|
||||
fullemail = email
|
||||
subject = 'Invitation to join team ' + teamname
|
||||
|
||||
siteurl = SITE_URL
|
||||
@@ -1414,7 +1414,7 @@ def handle_sendemailnewresponse(first_name, last_name,
|
||||
comment,
|
||||
workoutname, workoutid, commentid,
|
||||
debug=False,**kwargs):
|
||||
fullemail = first_name + ' ' + last_name + ' <' + email + '>'
|
||||
fullemail = email
|
||||
from_email = 'Rowsandall <info@rowsandall.com>'
|
||||
subject = 'New comment on workout ' + workoutname
|
||||
|
||||
@@ -1451,7 +1451,7 @@ def handle_sendemailnewcomment(first_name,
|
||||
|
||||
|
||||
|
||||
fullemail = first_name + ' ' + last_name + ' <' + email + '>'
|
||||
fullemail = email
|
||||
from_email = 'Rowsandall <info@rowsandall.com>'
|
||||
subject = 'New comment on workout ' + workoutname
|
||||
|
||||
@@ -1480,7 +1480,7 @@ def handle_sendemailnewcomment(first_name,
|
||||
@app.task
|
||||
def handle_sendemail_request(email, name, code, teamname, requestor, id,
|
||||
debug=False,**kwargs):
|
||||
fullemail = name + ' <' + email + '>'
|
||||
fullemail = email
|
||||
subject = 'Request to join team ' + teamname
|
||||
from_email = 'Rowsandall <info@rowsandall.com>'
|
||||
|
||||
@@ -1506,7 +1506,7 @@ def handle_sendemail_request(email, name, code, teamname, requestor, id,
|
||||
@app.task
|
||||
def handle_sendemail_request_accept(email, name, teamname, managername,
|
||||
debug=False,**kwargs):
|
||||
fullemail = name + ' <' + email + '>'
|
||||
fullemail = email
|
||||
subject = 'Welcome to ' + teamname
|
||||
from_email = 'Rowsandall <info@rowsandall.com>'
|
||||
|
||||
@@ -1530,7 +1530,7 @@ def handle_sendemail_request_accept(email, name, teamname, managername,
|
||||
@app.task
|
||||
def handle_sendemail_request_reject(email, name, teamname, managername,
|
||||
debug=False,**kwargs):
|
||||
fullemail = name + ' <' + email + '>'
|
||||
fullemail = email
|
||||
subject = 'Your application to ' + teamname + ' was rejected'
|
||||
from_email = 'Rowsandall <info@rowsandall.com>'
|
||||
|
||||
@@ -1553,7 +1553,7 @@ def handle_sendemail_request_reject(email, name, teamname, managername,
|
||||
@app.task
|
||||
def handle_sendemail_member_dropped(email, name, teamname, managername,
|
||||
debug=False,**kwargs):
|
||||
fullemail = name + ' <' + email + '>'
|
||||
fullemail = email
|
||||
subject = 'You were removed from ' + teamname
|
||||
from_email = 'Rowsandall <info@rowsandall.com>'
|
||||
|
||||
@@ -1578,7 +1578,7 @@ def handle_sendemail_member_dropped(email, name, teamname, managername,
|
||||
def handle_sendemail_team_removed(email, name, teamname, managername,
|
||||
debug=False,**kwargs):
|
||||
|
||||
fullemail = name + ' <' + email + '>'
|
||||
fullemail = email
|
||||
subject = 'You were removed from ' + teamname
|
||||
from_email = 'Rowsandall <info@rowsandall.com>'
|
||||
|
||||
@@ -1602,7 +1602,7 @@ def handle_sendemail_team_removed(email, name, teamname, managername,
|
||||
@app.task
|
||||
def handle_sendemail_invite_reject(email, name, teamname, managername,
|
||||
debug=False,**kwargs):
|
||||
fullemail = managername + ' <' + email + '>'
|
||||
fullemail = email
|
||||
subject = 'Your invitation to ' + name + ' was rejected'
|
||||
|
||||
from_email = 'Rowsandall <info@rowsandall.com>'
|
||||
@@ -1626,7 +1626,7 @@ def handle_sendemail_invite_reject(email, name, teamname, managername,
|
||||
@app.task
|
||||
def handle_sendemail_invite_accept(email, name, teamname, managername,
|
||||
debug=False,**kwargs):
|
||||
fullemail = managername + ' <' + email + '>'
|
||||
fullemail = email
|
||||
subject = 'Your invitation to ' + name + ' was accepted'
|
||||
|
||||
from_email = 'Rowsandall <info@rowsandall.com>'
|
||||
|
||||
@@ -15,7 +15,7 @@ from django.contrib.auth.models import User
|
||||
|
||||
|
||||
@app.task
|
||||
def addcomment2(userid,id):
|
||||
def addcomment2(userid,id,debug=False):
|
||||
|
||||
time.sleep(5)
|
||||
# w = Workout.objects.get(id=id)
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
{% extends "basenofilters.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Rowsandall - Bad Request {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="grid_12">
|
||||
<h1>Bad Request</h1>
|
||||
<p>
|
||||
HTTP Error 400 Bad Request.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,18 +0,0 @@
|
||||
{% extends "basenofilters.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Rowsandall - forbidden {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="grid_12">
|
||||
<h1>Forbidden</h1>
|
||||
<p>
|
||||
Access forbidden. You probably tried to access functionality on a workout,
|
||||
planned session
|
||||
or chart that is not owned by you.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,15 +0,0 @@
|
||||
{% extends "basenofilters.html" %}
|
||||
{% load staticfiles %}
|
||||
|
||||
{% block title %}Rowsandall - not found {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="grid_12">
|
||||
<h1>Error 404 Page not found</h1>
|
||||
<p>
|
||||
We could not find the page on our server.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,21 +0,0 @@
|
||||
{% extends "basenofilters.html" %}
|
||||
{% load staticfiles %}
|
||||
|
||||
{% block title %}Rowsandall - error {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="grid_12">
|
||||
<h1>Error 500 Internal Server Error</h1>
|
||||
<p>
|
||||
The site reported an internal server error. The site developer has been
|
||||
notified automatically with a full error report. You can help the developer
|
||||
by reporting an issue on Bitbucket using the button below.
|
||||
</p>
|
||||
|
||||
<div class="grid_2 alpha">
|
||||
<a class="button red small" href="https://bitbucket.org/sanderroosendaal/rowsandall/issues/new">Report an issue</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,578 +0,0 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<script src="/static/cookielaw/js/cookielaw.js"></script>
|
||||
|
||||
|
||||
<link rel="stylesheet" href="/static/css/bokeh-0.12.3.min.css" type="text/css" />
|
||||
<link rel="stylesheet" href="/static/css/bokeh-widgets-0.12.3.min.css" type="text/css" />
|
||||
|
||||
<link rel="shortcut icon" href="/static/img/favicon.ico" type="image/x-icon" />
|
||||
<link rel="icon" sizes="32x32" href="/static/img/favicon-32x32.png" type="image/png"/>
|
||||
<link rel="icon" sizes="64x64" href="/static/img/favicon-64x64.png" type="image/png"/>
|
||||
<link rel="icon" sizes="192x192" href="/static/img/favicon-192x192.png" type="image/png"/>
|
||||
<link rel="icon" sizes="16x16" href="/static/img/favicon-16x16.png" type="image/png"/>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="initial-scale=0.67">
|
||||
<title>Rowsandall</title>
|
||||
<link rel="stylesheet" href="/static/css/reset.css" />
|
||||
<link rel="stylesheet" href="/static/css/text.css" />
|
||||
<link rel="stylesheet" href="/static/css/960_12_col.css" />
|
||||
<link rel="stylesheet" href="/static/css/rowsandall.css" />
|
||||
|
||||
<!-- Google Analytics disabled on internal IP address
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-96318020-1']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
|
||||
-->
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
<div class="container_12">
|
||||
<div class="grid_12">
|
||||
|
||||
</div>
|
||||
<div class="grid_12">
|
||||
<div id="logo" class="grid_6 alpha">
|
||||
|
||||
<p><a href="/"><img src="/static/img/logo7.png"
|
||||
alt="Rowsandall logo" height="80"></a></p>
|
||||
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
<div class="grid_4 alpha">
|
||||
<div class="grid_1 alpha">
|
||||
<p id="header">
|
||||
<a class="button gray small" href="/rowers/videos">Videos</a></p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p id="header">
|
||||
<a class="button gray small" href="http://analytics.rowsandall.com/">Rowing Analytics BLOG</a></p>
|
||||
</div>
|
||||
<div class="grid_1 omega">
|
||||
<p id="header">
|
||||
<a class="button gray small" href="/rowers/email">Contact</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_4 alpha">
|
||||
<p>Free Data and Analysis. For Rowers. By Rowers.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid_1">
|
||||
<div class="grid_1 tooltip">
|
||||
|
||||
<p><a class="button gray small" href="/login/">login</a> </p>
|
||||
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
|
||||
<p> </p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_1 omega">
|
||||
|
||||
<div class="grid_1"><a class="button green small" href="/rowers/promembership">Upgrade to Pro</a></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="grid_12">
|
||||
<div class="grid_1 alpha tooltip">
|
||||
|
||||
<p><a class="button green small" href="/rowers/register">Register (free)</a></p>
|
||||
|
||||
</div>
|
||||
<div class="grid_1 tooltip">
|
||||
|
||||
<p> </p>
|
||||
|
||||
</div>
|
||||
<div class="grid_2 tooltip">
|
||||
|
||||
<p> </p>
|
||||
|
||||
</div>
|
||||
<div class="grid_1 tooltip">
|
||||
|
||||
<p> </p>
|
||||
|
||||
</div>
|
||||
<div class="grid_2 tooltip">
|
||||
|
||||
<p> </p>
|
||||
|
||||
</div>
|
||||
<div class="grid_1 tooltip">
|
||||
|
||||
|
||||
<p> </p>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="clear"></div>
|
||||
<div class="grid_12">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div class="grid_12">
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="grid_12">
|
||||
<h1>Error 502 Bad Gateway</h1>
|
||||
<p>
|
||||
No valid server response received. This can have multiple reasons,
|
||||
including time-outs or reaching the capacity limit.
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
|
||||
<div class="grid_12 omega" >
|
||||
|
||||
<p id="footer"></p>
|
||||
<div class="grid_2 alpha">
|
||||
<p id="footer"><a href="/rowers/email/">© Sander Roosendaal</a></p>
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
<p id="footer">
|
||||
<a href="/rowers/about">About</a></p>
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
<p id="footer">
|
||||
<a href="/rowers/brochure">Brochure</a></p>
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
<p id="footer">
|
||||
<a href="/rowers/developers">Develop</a></p>
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
<p id="footer">
|
||||
<a href="/rowers/legal">Legal</a></p>
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
<p id="footer">
|
||||
<a href="/rowers/partners">Partners</a></p>
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
<p id="footer">
|
||||
<a href="/rowers/physics">Physics</a></p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p id="footer">
|
||||
<a href="http://analytics.rowsandall.com/">Rowing Analytics BLOG</a></p>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p id="footer">
|
||||
<a href="https://www.facebook.com/groups/rowsandall/">Facebook group</a></p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- end container -->
|
||||
|
||||
|
||||
<link rel="stylesheet" href="/static/debug_toolbar/css/print.css" type="text/css" media="print" />
|
||||
<link rel="stylesheet" href="/static/debug_toolbar/css/toolbar.css" type="text/css" />
|
||||
|
||||
<!-- Prevent our copy of jQuery from registering as an AMD module on sites that use RequireJS. -->
|
||||
<script src="/static/debug_toolbar/js/jquery_pre.js"></script>
|
||||
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
|
||||
<script src="/static/debug_toolbar/js/jquery_post.js"></script>
|
||||
|
||||
<script src="/static/debug_toolbar/js/toolbar.js"></script>
|
||||
<div id="djDebug" class="djdt-hidden" dir="ltr"
|
||||
data-store-id="b03ff2a671fc45f29549fcefbad74672" data-render-panel-url="/__debug__/render_panel/"
|
||||
>
|
||||
<div class="djdt-hidden" id="djDebugToolbar">
|
||||
<ul id="djDebugPanelList">
|
||||
|
||||
<li><a id="djHideToolBarButton" href="#" title="Hide toolbar">Hide »</a></li>
|
||||
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtVersionsPanel" checked="checked" title="Disable for next and successive requests" />
|
||||
|
||||
<a href="#" title="Versions" class="VersionsPanel">
|
||||
|
||||
Versions
|
||||
|
||||
|
||||
<br /><small>Django 1.9.5</small>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtTimerPanel" checked="checked" title="Disable for next and successive requests" />
|
||||
|
||||
<div class="djdt-contentless">
|
||||
|
||||
Time
|
||||
|
||||
|
||||
<br /><small>Total: 456.00ms</small>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtSettingsPanel" checked="checked" title="Disable for next and successive requests" />
|
||||
|
||||
<a href="#" title="Settings from <code>rowsandall_app.settings_dev</code>" class="SettingsPanel">
|
||||
|
||||
Settings
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtHeadersPanel" checked="checked" title="Disable for next and successive requests" />
|
||||
|
||||
<a href="#" title="Headers" class="HeadersPanel">
|
||||
|
||||
Headers
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtRequestPanel" checked="checked" title="Disable for next and successive requests" />
|
||||
|
||||
<a href="#" title="Request" class="RequestPanel">
|
||||
|
||||
Request
|
||||
|
||||
|
||||
<br /><small>error500_view</small>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtSQLPanel" checked="checked" title="Disable for next and successive requests" />
|
||||
|
||||
<a href="#" title="SQL queries from 0 connections" class="SQLPanel">
|
||||
|
||||
SQL
|
||||
|
||||
|
||||
<br /><small>0 queries in 0.00ms</small>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtStaticFilesPanel" checked="checked" title="Disable for next and successive requests" />
|
||||
|
||||
<a href="#" title="Static files (1470 found, 0 used)" class="StaticFilesPanel">
|
||||
|
||||
Static files
|
||||
|
||||
|
||||
<br /><small>0 files used</small>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtTemplatesPanel" checked="checked" title="Disable for next and successive requests" />
|
||||
|
||||
<a href="#" title="Templates (3 rendered)" class="TemplatesPanel">
|
||||
|
||||
Templates
|
||||
|
||||
|
||||
<br /><small>500.html</small>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtCachePanel" checked="checked" title="Disable for next and successive requests" />
|
||||
|
||||
<a href="#" title="Cache calls from 1 backend" class="CachePanel">
|
||||
|
||||
Cache
|
||||
|
||||
|
||||
<br /><small>0 calls in 0.00ms</small>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtSignalsPanel" checked="checked" title="Disable for next and successive requests" />
|
||||
|
||||
<a href="#" title="Signals" class="SignalsPanel">
|
||||
|
||||
Signals
|
||||
|
||||
|
||||
<br /><small>17 receivers of 12 signals</small>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtLoggingPanel" checked="checked" title="Disable for next and successive requests" />
|
||||
|
||||
<a href="#" title="Log messages" class="LoggingPanel">
|
||||
|
||||
Logging
|
||||
|
||||
|
||||
<br /><small>0 messages</small>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="djDebugPanelButton">
|
||||
<input type="checkbox" data-cookie="djdtRedirectsPanel" title="Enable for next and successive requests" />
|
||||
|
||||
<div class="djdt-contentless djdt-disabled">
|
||||
|
||||
Intercept redirects
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
<div class="djdt-hidden" id="djDebugToolbarHandle">
|
||||
<span title="Show toolbar" id="djShowToolBarButton">«</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="VersionsPanel" class="djdt-panelContent">
|
||||
<div class="djDebugPanelTitle">
|
||||
<a href="" class="djDebugClose"></a>
|
||||
<h3>Versions</h3>
|
||||
</div>
|
||||
<div class="djDebugPanelContent">
|
||||
|
||||
<img src="/static/debug_toolbar/img/ajax-loader.gif" alt="loading" class="djdt-loader" />
|
||||
<div class="djdt-scroll"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div id="SettingsPanel" class="djdt-panelContent">
|
||||
<div class="djDebugPanelTitle">
|
||||
<a href="" class="djDebugClose"></a>
|
||||
<h3>Settings from <code>rowsandall_app.settings_dev</code></h3>
|
||||
</div>
|
||||
<div class="djDebugPanelContent">
|
||||
|
||||
<img src="/static/debug_toolbar/img/ajax-loader.gif" alt="loading" class="djdt-loader" />
|
||||
<div class="djdt-scroll"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="HeadersPanel" class="djdt-panelContent">
|
||||
<div class="djDebugPanelTitle">
|
||||
<a href="" class="djDebugClose"></a>
|
||||
<h3>Headers</h3>
|
||||
</div>
|
||||
<div class="djDebugPanelContent">
|
||||
|
||||
<img src="/static/debug_toolbar/img/ajax-loader.gif" alt="loading" class="djdt-loader" />
|
||||
<div class="djdt-scroll"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="RequestPanel" class="djdt-panelContent">
|
||||
<div class="djDebugPanelTitle">
|
||||
<a href="" class="djDebugClose"></a>
|
||||
<h3>Request</h3>
|
||||
</div>
|
||||
<div class="djDebugPanelContent">
|
||||
|
||||
<img src="/static/debug_toolbar/img/ajax-loader.gif" alt="loading" class="djdt-loader" />
|
||||
<div class="djdt-scroll"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="SQLPanel" class="djdt-panelContent">
|
||||
<div class="djDebugPanelTitle">
|
||||
<a href="" class="djDebugClose"></a>
|
||||
<h3>SQL queries from 0 connections</h3>
|
||||
</div>
|
||||
<div class="djDebugPanelContent">
|
||||
|
||||
<img src="/static/debug_toolbar/img/ajax-loader.gif" alt="loading" class="djdt-loader" />
|
||||
<div class="djdt-scroll"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="StaticFilesPanel" class="djdt-panelContent">
|
||||
<div class="djDebugPanelTitle">
|
||||
<a href="" class="djDebugClose"></a>
|
||||
<h3>Static files (1470 found, 0 used)</h3>
|
||||
</div>
|
||||
<div class="djDebugPanelContent">
|
||||
|
||||
<img src="/static/debug_toolbar/img/ajax-loader.gif" alt="loading" class="djdt-loader" />
|
||||
<div class="djdt-scroll"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="TemplatesPanel" class="djdt-panelContent">
|
||||
<div class="djDebugPanelTitle">
|
||||
<a href="" class="djDebugClose"></a>
|
||||
<h3>Templates (3 rendered)</h3>
|
||||
</div>
|
||||
<div class="djDebugPanelContent">
|
||||
|
||||
<img src="/static/debug_toolbar/img/ajax-loader.gif" alt="loading" class="djdt-loader" />
|
||||
<div class="djdt-scroll"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="CachePanel" class="djdt-panelContent">
|
||||
<div class="djDebugPanelTitle">
|
||||
<a href="" class="djDebugClose"></a>
|
||||
<h3>Cache calls from 1 backend</h3>
|
||||
</div>
|
||||
<div class="djDebugPanelContent">
|
||||
|
||||
<img src="/static/debug_toolbar/img/ajax-loader.gif" alt="loading" class="djdt-loader" />
|
||||
<div class="djdt-scroll"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="SignalsPanel" class="djdt-panelContent">
|
||||
<div class="djDebugPanelTitle">
|
||||
<a href="" class="djDebugClose"></a>
|
||||
<h3>Signals</h3>
|
||||
</div>
|
||||
<div class="djDebugPanelContent">
|
||||
|
||||
<img src="/static/debug_toolbar/img/ajax-loader.gif" alt="loading" class="djdt-loader" />
|
||||
<div class="djdt-scroll"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="LoggingPanel" class="djdt-panelContent">
|
||||
<div class="djDebugPanelTitle">
|
||||
<a href="" class="djDebugClose"></a>
|
||||
<h3>Log messages</h3>
|
||||
</div>
|
||||
<div class="djDebugPanelContent">
|
||||
|
||||
<img src="/static/debug_toolbar/img/ajax-loader.gif" alt="loading" class="djdt-loader" />
|
||||
<div class="djdt-scroll"></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div id="djDebugWindow" class="djdt-panelContent"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,10 +1,9 @@
|
||||
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Rowsandall - About us{% endblock title %}
|
||||
{% block content %}
|
||||
{% extends "newbase.html" %}
|
||||
{% block title %}Rowsandall - About us{% endblock title %}
|
||||
{% block main %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
<div class="grid_4 alpha">
|
||||
<h2>Welcome to Rowsandall.com</h2>
|
||||
<p>Rowsandall.com is an online tool for indoor and On The Water (OTW) rowers.
|
||||
It accepts workout data from a number of devices and applications. It
|
||||
@@ -78,19 +77,13 @@
|
||||
<a href="/rowers/compatibility">here</a>.
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="grid_4">
|
||||
<div class="grid_4">
|
||||
<h2>Credits</h2>
|
||||
<p>The project is based on python plotting code by
|
||||
Greg Smith (<a href="https://quantifiedrowing.wordpress.com/" rel="nofollow">https://quantifiedrowing.wordpress.com/</a>)
|
||||
and inspired by the RowPro Dan Burpee spreadsheet
|
||||
(<a href="http://www.sub7irc.com/RP_Split_Template.zip" rel="nofollow">http://www.sub7irc.com/RP_Split_Template.zip</a>).</p>
|
||||
</div>
|
||||
<div class="grid_4">
|
||||
|
||||
<h2>Advanced Analysis, Coaching and Planning (Premium Features)</h2>
|
||||
|
||||
|
||||
@@ -119,12 +112,9 @@ and inspired by the RowPro Dan Burpee spreadsheet
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid_4 omega">
|
||||
{% if user.rower.rowerplan == 'basic' and user.rower.protrialexpires|date_dif == 1 %}
|
||||
<h2>Free Trial</h2>
|
||||
{% if user.rower.rowerplan == 'basic' and user.rower.protrialexpires|date_dif == 1 %}
|
||||
<h2>Free Trial</h2>
|
||||
<p>
|
||||
You qualify for a 14 day free trial. No credit card needed.
|
||||
Try out Pro membership for two weeks. Click the button below to
|
||||
@@ -188,5 +178,10 @@ and inspired by the RowPro Dan Burpee spreadsheet
|
||||
|
||||
<p>If, for any reason, you are not happy with your Pro membership, please let me know through the contact form. I will contact you as soon as possible to discuss how we can make things better.</p>
|
||||
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
{% endblock main %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_help.html' %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -1,52 +1,44 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Rowsandall {% endblock %}
|
||||
{% block title %}Rowsandall Age Group Records{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, false, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
|
||||
<div id="workouts" class="grid_12 alpha">
|
||||
<h1>Interactive Plot</h1>
|
||||
|
||||
|
||||
<h1>Interactive Plot</h1>
|
||||
|
||||
<p>This chart shows the <a href="http://www.concept2.com/indoor-rowers/racing/records/world">Indoor Rower World Records</a> for your gender and
|
||||
weight class. The red dots are the official records, and hovering
|
||||
over them with your mouse shows you the name of the record holder.
|
||||
The blue line is a fit to the data, which is used by rowsandall.com
|
||||
to calculate your performance assessment.</a>
|
||||
<ul class="main-content">
|
||||
<li class="maxheight grid_4">
|
||||
<p>This chart shows the
|
||||
<a href="http://www.concept2.com/indoor-rowers/racing/records/world">
|
||||
Indoor Rower World Records
|
||||
</a> for your gender and
|
||||
weight class. The red dots are the official records, and hovering
|
||||
over them with your mouse shows you the name of the record holder.
|
||||
The blue line is a fit to the data, which is used by rowsandall.com
|
||||
to calculate your performance assessment.
|
||||
</p>
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
|
||||
{{ the_div|safe }}
|
||||
</li>
|
||||
|
||||
|
||||
</div>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,47 +1,30 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Rowsandall {% endblock %}
|
||||
{% block title %}Rowsandall Age Group CP{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, false, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
|
||||
<div id="workouts" class="grid_12 alpha">
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
|
||||
<h1>Interactive Plot</h1>
|
||||
|
||||
<h1>Interactive Plot</h1>
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="maxheight grid_4">
|
||||
{{ the_div|safe }}
|
||||
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
+128
-145
@@ -1,171 +1,154 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Rowsandall - Analysis {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<h1>Analysis</h1>
|
||||
<h1>Analysis</h1>
|
||||
<p>Functionality to analyze multiple workouts.</p>
|
||||
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<h2>Basic</h2>
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button blue small" href="/rowers/ote-bests">Ranking Pieces</a></p>
|
||||
<p>Analyze your Concept2 ranking pieces over a date range and predict your pace on other pieces.</p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button blue small" href="/rowers/flexall">Stroke Analysis</a>
|
||||
</p>
|
||||
<p>
|
||||
Plot all strokes in a date range and analyze several parameters (Power, Pace, SPM, Heart Rate).
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p class="button white small">
|
||||
Analysis Feature 3
|
||||
</p>
|
||||
<p>
|
||||
Reserved for future functionality.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="grid_6 omega">
|
||||
<h2>Pro</h2>
|
||||
<div class="grid_2 alpha">
|
||||
<ul class="main-content">
|
||||
<li class="rounder">
|
||||
<h2>Ranking Pieces</h2>
|
||||
<a href="/rowers/ote-bests2">
|
||||
<div class="vignet">
|
||||
<img src="/static/img/rankingpiece.png"
|
||||
alt="Ranking Piece">
|
||||
</div>
|
||||
</a>
|
||||
<p>
|
||||
{% if user|is_promember %}
|
||||
<a class="button blue small" href="/rowers/histo">Power Histogram</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/promembership">Power Histogram</a>
|
||||
{% endif %}
|
||||
Analyze your Concept2 ranking pieces over a date range and predict your pace on other pieces.
|
||||
</p>
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>Stroke Analysis</h2>
|
||||
<a href="/rowers/flexall">
|
||||
<div class="vignet">
|
||||
<img src="/static/img/strokeanalysis.png"
|
||||
alt="Stroke Analysis">
|
||||
</div>
|
||||
</a>
|
||||
<p>
|
||||
Plot all strokes in a date range and analyze several parameters (Power, Pace, SPM, Heart Rate).
|
||||
</p>
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>Power Histogram</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/histo">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/histogram.png" alt="Power Histogram">
|
||||
</div>
|
||||
</a>
|
||||
<p>
|
||||
Plot a power histogram of all your strokes over a date range.
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
{% if user|is_promember %}
|
||||
<a class="button blue small" href="/rowers/cumstats">Statistics</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/promembership">Statistics</a>
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>Statistics</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/cumstats">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
</p>
|
||||
<div class="vignet">
|
||||
<img src="/static/img/statistics.PNG" alt="Statistics">
|
||||
</div>
|
||||
</a>
|
||||
<p>
|
||||
BETA: Statistics of stroke metrics over a date range
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p>
|
||||
{% if user|is_promember %}
|
||||
<a class="button blue small" href="/rowers/user-boxplot-select">Box Chart</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/promembership">Box Chart</a>
|
||||
{% endif %}
|
||||
Statistics of stroke metrics over a date range
|
||||
</p>
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>Box Chart</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/user-boxplot-select">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/boxplot.png" alt="Box Chart">
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<p>
|
||||
BETA: Box Chart Statistics of stroke metrics over a date range
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>OTW Critical Power</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/otw-bests">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/otwcp.png" alt="OTW Critical Power">
|
||||
</div>
|
||||
</a>
|
||||
<p>
|
||||
Analyse power vs piece duration to make predictions. For On-The-Water rowing.
|
||||
</p>
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>OTE Critical Power</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/ote-ranking">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/otecp.png" alt="OTE Critical Power">
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<div class="grid_2 suffix_4 alpha">
|
||||
<p>
|
||||
<a class="button blue small" href="/rowers/ote-bests2">
|
||||
Ranking Pieces 2.0</a></p>
|
||||
<p>Analyze your Concept2 ranking pieces over a date range and predict your pace on other pieces.</p>
|
||||
</div>
|
||||
</div>
|
||||
<p>
|
||||
Analyse power vs piece duration to make predictions, for erg pieces.
|
||||
</p>
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>Trend Flex</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/user-multiflex-select">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/trendflex.png" alt="Trend Flex">
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<div class="grid_6 omega">
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
{% if user|is_promember %}
|
||||
<a class="button blue small" href="/rowers/otw-bests">OTW Critical Power</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/promembership">OTW Critical Power</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p>
|
||||
Analyse power vs piece duration to make predictions. For On-The-Water rowing.
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
{% if user|is_promember %}
|
||||
<a class="button blue small" href="/rowers/team-compare-select/team/0/">Multi Compare</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/promembership">Multi Compare</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p>
|
||||
Compare many workouts
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p>
|
||||
{% if user|is_promember %}
|
||||
<a class="button blue small" href="/rowers/user-multiflex-select">Trend Flex</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/promembership">Trend Flex</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p>
|
||||
Select workouts and make X-Y charts of averages over various metrics
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_6 prefix_6 alpha">
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
{% if user|is_promember %}
|
||||
<a class="button blue small" href="/rowers/ote-ranking">OTE Critical Power</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/promembership">OTE Critical Power</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p>
|
||||
Analyse power vs piece duration to make predictions, for erg pieces.
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
{% if user|is_planmember %}
|
||||
<a class="button blue small" href="/rowers/fitness-progress">Power Progress</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/promembership">Power Progress</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p>
|
||||
Monitoring power duration evidence from all your workouts. Feel free to explore.
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p>
|
||||
{% if user|is_planmember %}
|
||||
<a class="button blue small" href="/rowers/laboratory">The Labs</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/promembership">The Labs</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p>
|
||||
Undisclosed new functionality. This is still experimental and
|
||||
may not make sense.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p>
|
||||
Select workouts and make X-Y charts of averages over various metrics
|
||||
</p>
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h1>Power Progress</h1>
|
||||
{% if user|is_planmember %}
|
||||
<a href="/rowers/fitness-progress">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/powerprogress.png" alt="Power Progress">
|
||||
</div>
|
||||
</a>
|
||||
<p>
|
||||
Monitoring power duration evidence from all your workouts. Feel free to explore.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
|
||||
<h1>Your Tasks Status</h1>
|
||||
@@ -117,4 +117,8 @@
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workouts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Rowsandall Box Plot {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
@@ -14,58 +14,34 @@
|
||||
<div id="id_script">
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, false, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<h1>Box Chart</h1>
|
||||
<div id="workouts" class="grid_8 alpha">
|
||||
<div id="id_chart" class="grid_8 alpha flexplot">
|
||||
<h1>Box Chart</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
<div id="id_chart">
|
||||
{{ the_div|safe }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_4 omega">
|
||||
<div class="grid_4">
|
||||
<form enctype="multipart/form-data" action="/rowers/user-boxplot/{{ userid }}" method="post">
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
{% csrf_token %}
|
||||
<table>
|
||||
{{ chartform.as_table }}
|
||||
</table>
|
||||
<div class="grid_1 prefix_2 suffix_1">
|
||||
<p>
|
||||
<input name='workoutselectform' class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
<input name='workoutselectform' class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
<div class="grid_4">
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>
|
||||
You can use the form above to change the metric or filter the data.
|
||||
You can use the form to change the metric or filter the data.
|
||||
Set Min SPM and Max SPM to select only strokes in a certain range of
|
||||
stroke rates.
|
||||
Set Work per Stroke to a minimum value to remove "paddle" strokes or turns.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
@@ -92,3 +68,7 @@
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% block title %}Rowsandall Brochure{% endblock title %}
|
||||
{% block meta %}
|
||||
<style>
|
||||
@@ -7,19 +7,20 @@
|
||||
object { width: 900px; height: 5000px }
|
||||
</style>
|
||||
{% endblock meta %}
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<h2>Read our Brochure</h2>
|
||||
<h2>Read our Brochure</h2>
|
||||
|
||||
<div id="container">
|
||||
<object id="obj" data="/static/brochure WEB.pdf" >
|
||||
object can't be rendered
|
||||
</object>
|
||||
</div>
|
||||
<!--
|
||||
<embed src="/static/brochure WEB.pdf" width="960" height="650">
|
||||
-->
|
||||
<div id="container">
|
||||
<object id="obj" data="/static/brochure WEB.pdf" >
|
||||
object can't be rendered
|
||||
</object>
|
||||
</div>
|
||||
<!--
|
||||
<embed src="/static/brochure WEB.pdf" width="960" height="650">
|
||||
-->
|
||||
{% endblock %}
|
||||
|
||||
{% endblock content %}
|
||||
{% block sidebar %}
|
||||
{% include 'menu_help.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,68 +1,74 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Workouts{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
<h1>Available on C2 Logbook</h1>
|
||||
|
||||
{% if workouts %}
|
||||
<div class="grid_2 alpha ">
|
||||
<a href="/rowers/workout/c2import/all/{{ page }}" class="button gray">Import all NEW</a>
|
||||
</div>
|
||||
<div class="grid_6">
|
||||
<p>This imports all workouts that have not been imported to rowsandall.com.
|
||||
<ul class="main-content">
|
||||
{% if workouts %}
|
||||
<li class="grid_2">
|
||||
<a href="/rowers/workout/c2import/all/{{ page }}">Import all NEW</a>
|
||||
<p>This imports all workouts that have not been imported to rowsandall.com.
|
||||
The action may take a longer time to process, so please be patient. Click on Import in the list below to import an individual workout.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid_2">
|
||||
{% if page > 1 %}
|
||||
<a class="button gray" href="/rowers/workout/c2list/{{ page|add:-1 }}"><</a>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>
|
||||
<span>
|
||||
{% if page > 1 %}
|
||||
<a class="wh" title="Previous" href="/rowers/workout/c2list/{{ page|add:-1 }}">
|
||||
<i class="fas fa-arrow-alt-left"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
<a class="wh" title="Next" href="/rowers/workout/c2list/{{ page|add:1 }}">
|
||||
<i class="fas fa-arrow-alt-right"></i>
|
||||
</a>
|
||||
</span>
|
||||
</p>
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Import </th>
|
||||
<th> Date/Time </th>
|
||||
<th> Duration </th>
|
||||
<th> Total Distance</th>
|
||||
<th> Type</th>
|
||||
<th> Source</th>
|
||||
<th> Comment</th>
|
||||
<th> New</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for workout in workouts %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="/rowers/workout/c2import/{{ workout|lookup:'id' }}/">Import</a></td>
|
||||
<td>{{ workout|lookup:'starttime' }}</td>
|
||||
<td>{{ workout|lookup:'duration' }}</td>
|
||||
<td>{{ workout|lookup:'distance' }}</td>
|
||||
<td>{{ workout|lookup:'rowtype' }}</td>
|
||||
<td>{{ workout|lookup:'source' }}</td>
|
||||
<td>{{ workout|lookup:'comment' }}</td>
|
||||
<td>
|
||||
{{ workout|lookup:'new' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
{% else %}
|
||||
|
||||
<p> No workouts found </p>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<a class="button gray" href="/rowers/workout/c2list/{{ page|add:1 }}">></a>
|
||||
</div>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Import </th>
|
||||
<th> Date/Time </th>
|
||||
<th> Duration </th>
|
||||
<th> Total Distance</th>
|
||||
<th> Type</th>
|
||||
<th> Source</th>
|
||||
<th> Comment</th>
|
||||
<th> New</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for workout in workouts %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="/rowers/workout/c2import/{{ workout|lookup:'id' }}/">Import</a></td>
|
||||
<td>{{ workout|lookup:'starttime' }}</td>
|
||||
<td>{{ workout|lookup:'duration' }}</td>
|
||||
<td>{{ workout|lookup:'distance' }}</td>
|
||||
<td>{{ workout|lookup:'rowtype' }}</td>
|
||||
<td>{{ workout|lookup:'source' }}</td>
|
||||
<td>{{ workout|lookup:'comment' }}</td>
|
||||
<td>
|
||||
{{ workout|lookup:'new' }}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<p> No workouts found </p>
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workouts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
|
||||
{% block title %}CrewNerd Summary loading{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>Upload Workout Summary File (CrewNerd)</h1>
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div id="formbutton" class="grid_1 prefix_4 suffix_1">
|
||||
<input type="submit" value="Submit">
|
||||
</div>
|
||||
</div>
|
||||
{% block main %}
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
<h1>Upload Workout Summary File (CrewNerd)</h1>
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
{% block scripts %}
|
||||
@@ -7,49 +7,32 @@
|
||||
|
||||
{% block title %}{{ course.name }} {% endblock %}
|
||||
{% block og_title %}{{ course.name }} {% endblock %}
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_2 alpha">
|
||||
{% if nosessions %}
|
||||
<a class="button small red" href="/rowers/courses/{{ course.id }}/delete">Delete</a>
|
||||
{% else %}
|
||||
<a class="button small red" href="/rowers/courses/{{ course.id }}/replace">
|
||||
Update</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
{% if course.manager == rower %}
|
||||
<a class="button small gray" href="/rowers/courses/{{ course.id }}">View Course</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<a class="button small gray" href="/rowers/list-courses">Courses</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
{% block main %}
|
||||
<h1>{{ course.name }}</h1>
|
||||
|
||||
<h1>{{ course.name }}</h1>
|
||||
|
||||
<div class="grid_6 alpha">
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<form id="course_form" method="post">
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div id="formbutton" class="grid_1 prefix_4 suffix_1 alpha">
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
{{ mapdiv|safe }}
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<div class="mapdiv">
|
||||
{{ mapdiv|safe }}
|
||||
|
||||
|
||||
{{ mapscript|safe }}
|
||||
</div>
|
||||
{{ mapscript|safe }}
|
||||
</div>
|
||||
</li>
|
||||
|
||||
</div>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_racing.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -15,39 +15,45 @@
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div id="id_dropregion" class="grid_12 alpha watermark invisible">
|
||||
<p>Drag and drop files here </p>
|
||||
</div>
|
||||
<div id="id_drop-files" class="grid_12 alpha drop-files">
|
||||
<form id="file_form" enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>Upload KML Course File</h1>
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
{% block main %}
|
||||
<h1>Upload KML Course File</h1>
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
<div id="id_dropregion watermark invisible">
|
||||
<p>Drag and drop files here </p>
|
||||
</div>
|
||||
<div id="id_drop-files" class="grid_12 alpha drop-files">
|
||||
<form id="file_form" enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div id="formbutton" class="grid_1 prefix_4 suffix_1">
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
</div>
|
||||
<div id="right" class="grid_6 omega">
|
||||
|
||||
</div>
|
||||
<p>
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
{% block sidebar %}
|
||||
{% include 'menu_racing.html' %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block scripts %}
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
|
||||
<script>
|
||||
var td = new FormData();
|
||||
@@ -169,7 +175,7 @@
|
||||
});
|
||||
|
||||
$("#id_drop-files").replaceWith(
|
||||
'<div id="id_waiting"><img src="/static/img/rowingtimer.gif" width="120" height="100">'
|
||||
'<div id="id_waiting"><img src="/static/img/rowingtimer.gif" width="120" height="100" style="width:120px">'
|
||||
);
|
||||
$.ajax({
|
||||
data: data,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
{% block scripts %}
|
||||
@@ -7,24 +7,12 @@
|
||||
|
||||
{% block title %}{{ course.name }} {% endblock %}
|
||||
{% block og_title %}{{ course.name }} {% endblock %}
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_2 prefix_2 alpha">
|
||||
{% if course.manager == rower %}
|
||||
<a class="button small gray" href="/rowers/courses/{{ course.id }}">View Course</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<a class="button small gray" href="/rowers/list-courses">Courses</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
{% block main %}
|
||||
<h1>Replace {{ course.name }}</h1>
|
||||
|
||||
<h1>Replace {{ course.name }}</h1>
|
||||
<ul class="main-content">
|
||||
|
||||
<div class="grid_8 alpha">
|
||||
<li class="grid_2">
|
||||
<p>
|
||||
This replaces the course {{ course.name }} with the course you select below for all
|
||||
planned sessions and virtual races, and then deletes this course.
|
||||
@@ -34,18 +22,21 @@
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div id="formbutton" class="grid_1 prefix_4 suffix_1 alpha">
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
</div>
|
||||
<div class="grid_4 omega">
|
||||
{{ mapdiv|safe }}
|
||||
|
||||
|
||||
{{ mapscript|safe }}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<div class="mapdiv">
|
||||
{{ mapdiv|safe }}
|
||||
|
||||
|
||||
{{ mapscript|safe }}
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_racing.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
{% block scripts %}
|
||||
@@ -7,34 +7,11 @@
|
||||
|
||||
{% block title %}{{ course.name }} {% endblock %}
|
||||
{% block og_title %}{{ course.name }} {% endblock %}
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_2 alpha">
|
||||
{% if nosessions %}
|
||||
<a class="button small red" href="/rowers/courses/{{ course.id }}/delete">Delete</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
{% if course.manager == rower %}
|
||||
<a class="button small gray" href="/rowers/courses/{{ course.id }}/edit">Edit</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<a class="button small gray" href="/rowers/list-courses">Courses</a>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<a class="button small gray" href="/rowers/courses/{{ course.id }}/emailkml">Export to KML</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
{% block main %}
|
||||
<h1>{{ course.name }}</h1>
|
||||
|
||||
<h1>{{ course.name }}</h1>
|
||||
|
||||
<div class="grid_6 alpha">
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<table class="listtable shortpadded" width="100%">
|
||||
<tr>
|
||||
<th>Name</th><td>{{ course.name }}</td>
|
||||
@@ -46,14 +23,19 @@
|
||||
<th>Notes</th><td>{{ course.notes|linebreaks }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
{{ mapdiv|safe }}
|
||||
|
||||
|
||||
{{ mapscript|safe }}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<div class="mapdiv">
|
||||
{{ mapdiv|safe }}
|
||||
|
||||
|
||||
{{ mapscript|safe }}
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_racing.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,7 +1,23 @@
|
||||
<div>
|
||||
{{ mapscript|safe }}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
{% block scripts %}
|
||||
{% include "monitorjobs.html" %}
|
||||
{% endblock %}
|
||||
|
||||
{% block title %}{{ course.name }} {% endblock %}
|
||||
{% block og_title %}{{ course.name }} {% endblock %}
|
||||
{% block main %}
|
||||
<h1>{{ course.name }}</h1>
|
||||
<div class="mapdiv">
|
||||
{{ mapdiv|safe }}
|
||||
{{ mapscript|safe }}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_racing.html' %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
|
||||
+70
-186
@@ -1,35 +1,16 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Rowsandall {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
|
||||
<div id="id_css_res">
|
||||
<link rel="stylesheet" href="/static/css/bokeh-0.12.3.min.css" type="text/css" />
|
||||
<link rel="stylesheet" href="/static/css/bokeh-widgets-0.12.3.min.css" type="text/css" />
|
||||
</div>
|
||||
<div id="id_js_res">
|
||||
<script
|
||||
type="text/javascript" src="/static/js/bokeh-0.12.3.min.js">
|
||||
</script>
|
||||
<script
|
||||
type="text/javascript" src="/static/js/bokeh-widgets-0.12.3.min.js">
|
||||
</script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
</div>
|
||||
|
||||
{% block main %}
|
||||
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
|
||||
<script>
|
||||
$(function() {
|
||||
|
||||
// Get the form fields and hidden div
|
||||
var checkbox = $("#id_water");
|
||||
var modality = $("#id_modality");
|
||||
var hidden = $("#id_waterboattype");
|
||||
|
||||
|
||||
@@ -38,16 +19,20 @@
|
||||
// enabled.
|
||||
|
||||
hidden.hide();
|
||||
|
||||
|
||||
if (modality.val() == 'water') {
|
||||
hidden.show();
|
||||
}
|
||||
|
||||
|
||||
// Setup an event listener for when the state of the
|
||||
// checkbox changes.
|
||||
checkbox.change(function() {
|
||||
modality.change(function() {
|
||||
// Check to see if the checkbox is checked.
|
||||
// If it is, show the fields and populate the input.
|
||||
// If not, hide the fields.
|
||||
if (checkbox.is(':checked')) {
|
||||
// If not, hide the fields.
|
||||
var Value = modality.val();
|
||||
if (Value=='water') {
|
||||
// Show the hidden fields.
|
||||
hidden.show();
|
||||
} else {
|
||||
@@ -74,173 +59,63 @@
|
||||
</script>
|
||||
|
||||
|
||||
<div id="id_css_res">
|
||||
<link rel="stylesheet" href="/static/css/bokeh-0.12.3.min.css" type="text/css" />
|
||||
<link rel="stylesheet" href="/static/css/bokeh-widgets-0.12.3.min.css" type="text/css" />
|
||||
</div>
|
||||
<div id="id_js_res">
|
||||
<script
|
||||
type="text/javascript" src="/static/js/bokeh-0.12.3.min.js">
|
||||
</script>
|
||||
<script
|
||||
type="text/javascript" src="/static/js/bokeh-widgets-0.12.3.min.js">
|
||||
</script>
|
||||
|
||||
</div>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
|
||||
|
||||
|
||||
<div id="id_script">
|
||||
|
||||
</div>
|
||||
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
<ul class="main-content">
|
||||
|
||||
<li class="grid_4">
|
||||
<p>Summary for {{ theuser.first_name }} {{ theuser.last_name }}
|
||||
between {{ startdate|date }} and {{ enddate|date }}</p>
|
||||
</li>
|
||||
|
||||
<div id="title" class="grid_12 alpha">
|
||||
<div class="grid_10 alpha">
|
||||
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 alpha dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ theuser.first_name }} {{ theuser.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_members %}
|
||||
<a class="button green small" href="/rowers/{{ member.id }}/flexall/{{ xparam }}/{{ yparam1 }}/{{ yparam2 }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">{{ member.first_name }} {{ member.last_name }}</a>
|
||||
{% endfor %}
|
||||
<li class="grid_4">
|
||||
<div id="id_chart">
|
||||
|
||||
{{ the_div|safe }}
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<div id="form" class="grid_6 alpha">
|
||||
</li>
|
||||
<li>
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% csrf_token %}
|
||||
<div class="grid_2 alpha">
|
||||
<table>
|
||||
{{ optionsform.as_table }}
|
||||
</table>
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega">
|
||||
<input type="hidden" name="options" value="options">
|
||||
<input class="grid_1 alpha button green small" value="Submit" type="Submit">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
<p>Use this form to select a different date range:</p>
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
<div class="grid_4 alpha">
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name='daterange' class="button green" type="submit" value="Submit"> </form>
|
||||
</div>
|
||||
<div class="grid_4 alpha">
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
Or use the last {{ deltaform }} days.
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% csrf_token %}
|
||||
<input name='datedelta' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="summary" class="grid_6 suffix_6 alpha">
|
||||
|
||||
<p>Summary for {{ theuser.first_name }} {{ theuser.last_name }}
|
||||
between {{ startdate|date }} and {{ enddate|date }}</p>
|
||||
|
||||
|
||||
<div id="plotbuttons" class="grid_6 alpha">
|
||||
<div class="grid_2 alpha dropdown">
|
||||
<button class="grid_2 alpha button blue small dropbtn">X-axis</button>
|
||||
<div class="dropdown-content">
|
||||
{% for key, value in axchoicesbasic.items %}
|
||||
{% if key != 'None' %}
|
||||
<a class="button blue small alpha" href="/rowers/flexall/{{ key }}/{{ yparam1 }}/{{ yparam2 }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d"}}">{{ value }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if promember %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
<a class="button blue small alpha" href="/rowers/flexall/{{ key }}/{{ yparam1 }}/{{ yparam2 }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d"}}">{{ value }}</a>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
<a class="button rosy small" href="/rowers/promembership">{{ value }}</a>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button blue small dropbtn">Left</button>
|
||||
<div class="dropdown-content">
|
||||
{% for key, value in axchoicesbasic.items %}
|
||||
{% if key not in noylist and key != 'None' %}
|
||||
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/{{ key }}/{{ yparam2 }}/{{ startdate|date:"Y-m-d"}}/{{ enddate|date:"Y-m-d"}}">{{ value }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if promember %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
{% if key not in noylist %}
|
||||
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/{{ key }}/{{ yparam2 }}/{{ startdate|date:"Y-m-d"}}/{{ enddate|date:"Y-m-d"}}">{{ value }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
{% if key not in noylist %}
|
||||
<a class="button rosy small" href="/rowers/promembership">{{ value }} (Pro)</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid_2 dropdown omega">
|
||||
<button class="grid_2 alpha button blue small dropbtn">Right</button>
|
||||
<div class="dropdown-content">
|
||||
{% for key, value in axchoicesbasic.items %}
|
||||
{% if key not in noylist %}
|
||||
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/{{ yparam1 }}/{{ key }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d"}}">{{ value }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if promember %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
{% if key not in noylist %}
|
||||
<a class="button blue small" href="/rowers/flexall/{{ xparam }}/{{ yparam1 }}/{{ key }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d"}}">{{ value }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
{% if key not in noylist %}
|
||||
<a class="button rosy small" href="/rowers/promembership">{{ value }} (Pro)</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div id="id_chart" class="grid_12 alpha">
|
||||
|
||||
{{ the_div|safe }}
|
||||
|
||||
</div>
|
||||
<table>
|
||||
{{ optionsform.as_table }}
|
||||
</table>
|
||||
<input type="hidden" name="options" value="options">
|
||||
</li>
|
||||
<li>
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
</li>
|
||||
<li>
|
||||
<table>
|
||||
{{ flexaxesform.as_table }}
|
||||
</table>
|
||||
</li>
|
||||
<li>
|
||||
{% csrf_token %}
|
||||
<input class="button green small" value="Submit" type="Submit">
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@@ -253,16 +128,25 @@
|
||||
$(function($) {
|
||||
console.log('loading script');
|
||||
$.getJSON(window.location.protocol + '//'+window.location.host + '/rowers/flexalldata', function(json) {
|
||||
console.log('got script');
|
||||
var counter=0;
|
||||
var script = json.script;
|
||||
var div = json.div;
|
||||
console.log('set vars');
|
||||
$("#id_sitready").remove();
|
||||
console.log('sitready removed');
|
||||
$("#id_chart").append(div);
|
||||
console.log(div);
|
||||
console.log('div appended');
|
||||
$("#id_script").append("<script>"+script+"</s"+"cript>");
|
||||
console.log('script changed');
|
||||
|
||||
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
+112
-164
@@ -1,17 +1,16 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Workout Statistics{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block title %}Rowsandall {% endblock %}
|
||||
|
||||
{% block main %}
|
||||
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
|
||||
<script>
|
||||
$(function() {
|
||||
|
||||
// Get the form fields and hidden div
|
||||
var checkbox = $("#id_water");
|
||||
var modality = $("#id_modality");
|
||||
var hidden = $("#id_waterboattype");
|
||||
|
||||
|
||||
@@ -20,15 +19,20 @@
|
||||
// enabled.
|
||||
|
||||
hidden.hide();
|
||||
|
||||
if (modality.val() == 'water') {
|
||||
hidden.show();
|
||||
}
|
||||
|
||||
|
||||
// Setup an event listener for when the state of the
|
||||
// checkbox changes.
|
||||
checkbox.change(function() {
|
||||
modality.change(function() {
|
||||
// Check to see if the checkbox is checked.
|
||||
// If it is, show the fields and populate the input.
|
||||
// If not, hide the fields.
|
||||
if (checkbox.is(':checked')) {
|
||||
// If not, hide the fields.
|
||||
var Value = modality.val();
|
||||
if (Value=='water') {
|
||||
// Show the hidden fields.
|
||||
hidden.show();
|
||||
} else {
|
||||
@@ -46,168 +50,93 @@
|
||||
// $("#hidden_field").val("");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{{ plotscript |safe }}
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, true, true);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_4 alpha">
|
||||
{% if theuser %}
|
||||
<h3>{{ theuser.first_name }}'s Workout Statistics</h3>
|
||||
{% else %}
|
||||
<h3>{{ user.first_name }}'s Workout Statistics</h3>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2 suffix_6 omega">
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 alpha dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ theuser.first_name }} {{ theuser.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_members %}
|
||||
<a class="button green small" href="/rowers/{{ member.id }}/cumstats/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}/p/{{ plotfield }}">{{ member.first_name }} {{ member.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
<div id="id_css_res">
|
||||
<link rel="stylesheet" href="/static/css/bokeh-0.12.3.min.css" type="text/css" />
|
||||
<link rel="stylesheet" href="/static/css/bokeh-widgets-0.12.3.min.css" type="text/css" />
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div id="summary" class="grid_6 alpha">
|
||||
<p>Summary for {{ theuser.first_name }} {{ theuser.last_name }}
|
||||
between {{ startdate|date }} and {{ enddate|date }}</p>
|
||||
|
||||
<p>Direct link for other Pro users:
|
||||
<a href="/rowers/{{ id }}/cumstats/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}/p/{{ plotfield }}">https://rowsandall.com/rowers/{{ id }}/cumstats/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}/p/{{ plotfield }}</a>
|
||||
</p>
|
||||
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% csrf_token %}
|
||||
<div class="grid_2 alpha">
|
||||
<table>
|
||||
{{ optionsform.as_table }}
|
||||
</table>
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega">
|
||||
<input type="hidden" name="options" value="options">
|
||||
<input class="grid_1 alpha button green small" value="Submit" type="Submit">
|
||||
</div>
|
||||
</form>
|
||||
<div id="id_js_res">
|
||||
<script
|
||||
type="text/javascript" src="/static/js/bokeh-0.12.3.min.js">
|
||||
</script>
|
||||
<script
|
||||
type="text/javascript" src="/static/js/bokeh-widgets-0.12.3.min.js">
|
||||
</script>
|
||||
|
||||
</div>
|
||||
<div id="form" class="grid_6 omega">
|
||||
<p>Use this form to select a different date range:</p>
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
<div class="grid_4 alpha">
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name='daterange' class="button green" type="submit" value="Submit"> </form>
|
||||
</div>
|
||||
<div class="grid_4 alpha">
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
Or use the last {{ deltaform }} days.
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% csrf_token %}
|
||||
<input name='datedelta' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_4 alpha">
|
||||
{% if stats %}
|
||||
{% for key, value in stats.items %}
|
||||
<h2>{{ value.verbosename }}</h2>
|
||||
<div class="grid_1">
|
||||
<p>
|
||||
<a class="button blue small" href="/rowers/{{ id }}/cumstats/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}/p/{{ key }}">Plot</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
|
||||
|
||||
|
||||
<div id="id_script">
|
||||
|
||||
</div>
|
||||
|
||||
<ul class="main-content">
|
||||
|
||||
<li class="grid_4">
|
||||
<p>Summary for {{ theuser.first_name }} {{ theuser.last_name }}
|
||||
between {{ startdate|date }} and {{ enddate|date }}</p>
|
||||
</li>
|
||||
|
||||
<li class="grid_4">
|
||||
{% if stats %}
|
||||
<h2>Statistics</h2>
|
||||
<table width="100%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Metric</th>
|
||||
<th>Value</th>
|
||||
<th>Mean</th>
|
||||
<th>Minimum</th>
|
||||
<th>25%</th>
|
||||
<th>Median</th>
|
||||
<th>75%</th>
|
||||
<th>Maximum</th>
|
||||
<th>Standard Deviation</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for key, value in stats.items %}
|
||||
<tr>
|
||||
<td>Mean</td><td>{{ value.mean|floatformat:-2 }}</td>
|
||||
</tr><tr>
|
||||
<td>Minimum</td><td>{{ value.min|floatformat:-2 }}</td>
|
||||
</tr><tr>
|
||||
<td>25%</td><td>{{ value.firstq|floatformat:-2 }}</td>
|
||||
</tr><tr>
|
||||
<td>Median</td><td>{{ value.median|floatformat:-2 }}</td>
|
||||
</tr><tr>
|
||||
<td>75%</td><td>{{ value.thirdq|floatformat:-2 }}</td>
|
||||
</tr><tr>
|
||||
<td>Maximum</td><td>{{ value.max|floatformat:-2 }}</td>
|
||||
</tr><tr>
|
||||
<td>Standard Deviation</td><td>{{ value.std|floatformat:-2 }}</td>
|
||||
<td>{{ value.verbosename }}</td>
|
||||
<td>{{ value.mean|floatformat:-2 }}</td>
|
||||
<td>{{ value.min|floatformat:-2 }}</td>
|
||||
<td>{{ value.firstq|floatformat:-2 }}</td>
|
||||
<td>{{ value.median|floatformat:-2 }}</td>
|
||||
<td>{{ value.thirdq|floatformat:-2 }}</td>
|
||||
<td>{{ value.max|floatformat:-2 }}</td>
|
||||
<td>{{ value.std|floatformat:-2 }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_8 omega">
|
||||
{% if cordict %}
|
||||
<div class="grid_8">
|
||||
<h2> Correlation Matrix</h2>
|
||||
<p>This matrix indicates a positive (+) or negative (-) correlation between two parameters. The Spearman correlation coefficient has values between +1 and -1. Positive correlation between two metrics means that if one metric increases, the other value is also likely to increase. Negative is the opposite. The further from zero, the higher the likelyhood.
|
||||
|
||||
{% endif %}
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
{% if cordict %}
|
||||
<h2> Correlation matrix</h2>
|
||||
<p>This matrix indicates a positive (+) or negative (-) correlation between two parameters. The Spearman correlation coefficient has values between +1 and -1. Positive correlation between two metrics means that if one metric increases, the other value is also likely to increase. Negative is the opposite. The further from zero, the higher the likelyhood.
|
||||
</p>
|
||||
<table width="90%" class="cortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
{% for key,value in cordict.items %}
|
||||
<th class="rotate"><div><span>{{ key }}</span></div></th>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for key, thedict in cordict.items %}
|
||||
<table width="90%" class="cortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
{% for key,value in cordict.items %}
|
||||
<th class="rotate"><div><span>{{ key }}</span></div></th>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for key, thedict in cordict.items %}
|
||||
<tr>
|
||||
<th> {{ key }}</th>
|
||||
{% for key2,value in thedict.items %}
|
||||
@@ -218,24 +147,43 @@
|
||||
<div class="weakposcor">{{ value|floatformat:-1 }}</div>
|
||||
{% elif value < -0.5 %}
|
||||
<div class="negcor">{{ value|floatformat:-1 }}</div>
|
||||
{% elif value < -0.1 %}
|
||||
<div class="weaknegcor">{{ value|floatformat:-1 }}</div>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
{% elif value < -0.1 %}
|
||||
<div class="weaknegcor">{{ value|floatformat:-1 }}</div>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="grid_8">
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% endif %}
|
||||
|
||||
<div class="grid_8">
|
||||
{{ plotdiv|safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
<table>
|
||||
{{ optionsform.as_table }}
|
||||
</table>
|
||||
<input type="hidden" name="options" value="options">
|
||||
</li>
|
||||
<li>
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
</li>
|
||||
<li>
|
||||
{% csrf_token %}
|
||||
<input class="button green small" value="Submit" type="Submit">
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
+109
-107
@@ -1,126 +1,123 @@
|
||||
|
||||
{% extends "base.html" %}
|
||||
{% block title %}About us{% endblock title %}
|
||||
{% block content %}
|
||||
{% extends "newbase.html" %}
|
||||
{% block title %}Rowsandall Developers Info{% endblock title %}
|
||||
{% block main %}
|
||||
|
||||
<div class="grid_6 alpha">
|
||||
<h2>Resources for developers</h2>
|
||||
<h1>Resources for developers</h1>
|
||||
|
||||
<p>On this page, a work in progress, I will collect useful information
|
||||
for developers of rowing data apps and hardware.</p>
|
||||
|
||||
<p>I presume you have an app (smartphone app, dedicated hardware, web site)
|
||||
where your users (customers) generate, collect or store their rowing
|
||||
related workout data. You can now offer your users easy ways to get
|
||||
their data on this site.</p>
|
||||
|
||||
<p>There are three ways to allow your users to get data to Rowsandall.com.</p>
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
|
||||
<h5>File based export from your app</h5>
|
||||
|
||||
<p>Enable export of TCX, FIT or CSV formatted files from your app.
|
||||
The users
|
||||
upload the file to Rowsandall.com.</p>
|
||||
|
||||
<ul>
|
||||
<li>Advantages
|
||||
<ul>
|
||||
<li>User sees immediate results</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Disadvantages
|
||||
<ul>
|
||||
<li>It is a multi-step process: Download from your
|
||||
app, store, upload.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>On this page, a work in progress, I will collect useful information
|
||||
for developers of rowing data apps and hardware.</p>
|
||||
|
||||
<p>I presume you have an app (smartphone app, dedicated hardware, web site)
|
||||
where your users (customers) generate, collect or store their rowing
|
||||
related workout data. You can now offer your users easy ways to get
|
||||
their data on this site.</p>
|
||||
|
||||
</li>
|
||||
|
||||
<h5>Email from your app</h5>
|
||||
|
||||
<p>Similar as above, generate TCX, FIT or CSV formatted files and
|
||||
email them
|
||||
to <i>workouts@rowsandall.com</i> directly from your app. The From: field
|
||||
should be the email address of the registered user.</p>
|
||||
|
||||
<ul>
|
||||
<li>Advantages
|
||||
<ul>
|
||||
<li>It's a simple process, which can be automated.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Disadvantages
|
||||
<ul>
|
||||
<li>It may take up to five minutes for the workout to show up
|
||||
<li class="grid_2">
|
||||
<p>There are three ways to allow your users to get data to Rowsandall.com.</p>
|
||||
<h2>File based export from your app</h2>
|
||||
|
||||
<p>Enable export of TCX, FIT or CSV formatted files from your app.
|
||||
The users
|
||||
upload the file to Rowsandall.com.</p>
|
||||
|
||||
<ul class="contentli">
|
||||
<li>Advantages
|
||||
<ul class="contentli">
|
||||
<li>User sees immediate results</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Disadvantages
|
||||
<ul class="contentli">
|
||||
<li>It is a multi-step process: Download from your
|
||||
app, store, upload.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Email from your app</h2>
|
||||
|
||||
<p>Similar as above, generate TCX, FIT or CSV formatted files and
|
||||
email them
|
||||
to <em>workouts@rowsandall.com</em> directly from your app. The From: field
|
||||
should be the email address of the registered user.</p>
|
||||
|
||||
<ul class="contentli">
|
||||
<li>Advantages
|
||||
<ul class="contentli">
|
||||
<li>It's a simple process, which can be automated.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Disadvantages
|
||||
<ul class="contentli">
|
||||
<li>It may take up to five minutes for the workout to show up
|
||||
on the site.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Using the REST API</h2>
|
||||
|
||||
<p>We are building a REST API which will allow you to post and
|
||||
receive stroke
|
||||
data from the site directly.</p>
|
||||
|
||||
<p>The REST API is a work in progress. We are open to improvement
|
||||
suggestions (provided they don't break existing apps). Please send
|
||||
email to <a href="mailto:info@rowsandall.com">info@rowsandall.com</a>
|
||||
with questions and/or suggestions. We
|
||||
will get back to you as soon as possible.</p>
|
||||
|
||||
<ul class="contentli">
|
||||
<li>Advantages
|
||||
<ul class="contentli">
|
||||
<li>Once it is set up, this is a one-click operation.</li>
|
||||
<li>You can read a user's workout data from the site and use
|
||||
them in your app.</li>
|
||||
<li>This is not limited to workout data. You could make a full mobile
|
||||
version of our site.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Disadvantages
|
||||
<ul class="contentli">
|
||||
<li>The API is not stable and not fully tested yet.</li>
|
||||
<li>You need to register your app with us. We can revoke your
|
||||
permissions if you misuse them.</li>
|
||||
<li>The user user must grant permissions to your app.</li>
|
||||
<li>You need to manage authorization tokens.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h5>Using the REST API</h5>
|
||||
|
||||
<p>We are building a REST API which will allow you to post and
|
||||
receive stroke
|
||||
data from the site directly.</p>
|
||||
|
||||
<p>The REST API is a work in progress. We are open to improvement
|
||||
suggestions (provided they don't break existing apps). Please send
|
||||
email to <a href="mailto:info@rowsandall.com">info@rowsandall.com</a>
|
||||
with questions and/or suggestions. We
|
||||
will get back to you as soon as possible.</p>
|
||||
|
||||
<ul>
|
||||
<li>Advantages
|
||||
<ul>
|
||||
<li>Once it is set up, this is a one-click operation.</li>
|
||||
<li>You can read a user's workout data from the site and use
|
||||
them in your app.</li>
|
||||
<li>This is not limited to workout data. You could make a full mobile
|
||||
version of our site.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>Disadvantages
|
||||
<ul>
|
||||
<li>The API is not stable and not fully tested yet.</li>
|
||||
<li>You need to register your app with us. We can revoke your
|
||||
permissions if you misuse them.</li>
|
||||
<li>The user user must grant permissions to your app.</li>
|
||||
<li>You need to manage authorization tokens.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="grid_6 omega">
|
||||
<div class="grid_6">
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<h2>Quick Links</h2>
|
||||
|
||||
<h5>Accepted file formats</h5>
|
||||
<h3>Accepted file formats</h3>
|
||||
|
||||
<p>All files adhering to the standards <a href="http://www8.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd">TCX</a> and <a href="https://www.thisisant.com/resources/fit/">FIT</a> formats will be parsed.</p>
|
||||
|
||||
<p>However, some rowing related parameters are not supported by TCX and FIT. Therefore, we are supporting the CSV format that is documented in the following link.</p>
|
||||
|
||||
<ul><li><a href="http://rowingdata.readthedocs.io/en/latest/#csv-file-standard">Our standard rowing CSV file</a></li></ul>
|
||||
<ul class="contentli"><li><a href="http://rowingdata.readthedocs.io/en/latest/#csv-file-standard">Our standard rowing CSV file</a></li></ul>
|
||||
|
||||
<p>Using this standard will guarantee that your user's data are accepted
|
||||
without complaints.</p>
|
||||
|
||||
<h5>API related documentation</h5>
|
||||
<h2>API related documentation</h2>
|
||||
|
||||
<h6>Registering an app</h6>
|
||||
<h3>Registering an app</h3>
|
||||
|
||||
|
||||
<p>We have disabled the self service app link for security reasons.
|
||||
We will replace it with a secure self service app link soon. If you
|
||||
need to register an app, please send email to info@rowsandall.com</p>
|
||||
|
||||
<h6>Authentication</h6>
|
||||
<h3>Authentication</h3>
|
||||
|
||||
<p>Standard <a href="https://oauth.net/2/">Oauth2</a> authentication.
|
||||
Get authorization code by pointing your user to the authorization URL.
|
||||
@@ -128,19 +125,19 @@
|
||||
expires,
|
||||
use the refresh token to refresh it.</p>
|
||||
|
||||
<p>The redirect URI for user authentication has to be <i>https</i>.
|
||||
<p>The redirect URI for user authentication has to be <em>https</em>.
|
||||
Developers of iOS or Android apps should contact me directly if
|
||||
this doesn't work for them. I can add exceptions.</p>
|
||||
|
||||
|
||||
<ul>
|
||||
<ul class="contentli">
|
||||
<li>Authorization URL: <b>https://{{ request.get_host }}/rowers/o/authorize</b></li>
|
||||
<li>Access Token request: <b>https://{{ request.get_host }}/rowers/o/token/</b></li>
|
||||
<li>Access Token refresh: <b>https://{{ request.get_host }}/rowers/o/token/</b></li>
|
||||
<li>Handy utility for testing: <b><a href="http://django-oauth-toolkit.herokuapp.com/consumer/">http://django-oauth-toolkit.herokuapp.com/consumer/</a></b></li>
|
||||
</ul>
|
||||
|
||||
<h6>API documentation</h6>
|
||||
<h3>API documentation</h3>
|
||||
|
||||
<p>Once you have a registered app, you have gone through the authorization
|
||||
and have successfully obtained an access token, you can use it to place
|
||||
@@ -149,7 +146,7 @@
|
||||
<p>The workout summary data and the stroke data are obtained and sent
|
||||
separately.</p>
|
||||
|
||||
<ul>
|
||||
<ul class="contentli">
|
||||
<li><a href="/rowers/api-docs">API documentation</a>
|
||||
(But refer to the below for stroke data.)</li>
|
||||
<li><a href="/rowers/api-docs#/workouts">Try out the workout summary API</a></li>
|
||||
@@ -162,7 +159,7 @@
|
||||
future to enable updating stroke data. Stroke data for workout {id} are
|
||||
posted to:</p>
|
||||
|
||||
<ul>
|
||||
<ul class="contentli">
|
||||
<li><b>https://{{ request.get_host }}/rowers/api/workouts/{id}/strokedata</b></li>
|
||||
</ul>
|
||||
|
||||
@@ -180,14 +177,14 @@
|
||||
</pre></p>
|
||||
|
||||
<p>Mandatory data fields are:</p>
|
||||
<ul>
|
||||
<ul class="contentli">
|
||||
<li><b>time</b>: Time (milliseconds since workout start)</li>
|
||||
<li><b>distance</b>: Distance (meters)</li>
|
||||
<li><b>pace</b>: Pace (milliseconds per 500m)</li>
|
||||
<li><b>spm</b> Stroke rate (strokes per minute)</li>
|
||||
</ul>
|
||||
<p>Optional data fiels are:</p>
|
||||
<ul>
|
||||
<ul class="contentli">
|
||||
<li><b>power</b>: Power (Watt)</li>
|
||||
<li><b>drivelength</b>: Drive length (meters)</li>
|
||||
<li><b>dragfactor</b>: Drag factor</li>
|
||||
@@ -201,7 +198,7 @@
|
||||
<li><b>catch</b>: Catch angle per Empower oarlock (degrees)</li>
|
||||
<li><b>finish</b>: Finish angle per Empower oarlock (degrees)</li>
|
||||
<li><b>peakforceangle</b>: Peak Force Angle per Empower oarlock (degrees)</li>
|
||||
<li><b>slip</b>: Wash as defined per Empower oarlock (degrees)</li>
|
||||
<li><b>slip</b>: Slip as defined per Empower oarlock (degrees)</li>
|
||||
|
||||
</ul>
|
||||
|
||||
@@ -211,7 +208,12 @@
|
||||
must have the same number of records. If an optional data field
|
||||
fails a test, its values are silently replaced by zeros.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_help.html' %}
|
||||
{% endblock %}
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -15,64 +15,65 @@
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div id="id_dropregion" class="grid_12 alpha watermark invisible">
|
||||
<p>Drag and drop files here </p>
|
||||
</div>
|
||||
<div id="id_drop-files" class="grid_12 alpha drop-files">
|
||||
<form id="file_form" enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>Upload Workout File</h1>
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<p>Looking for <a href="/rowers/workout/upload/team/">Team Manager
|
||||
Upload?</a></p>
|
||||
{% endif %}
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
{% block main %}
|
||||
<div id="id_main">
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<div id="id_dropregion" class="watermark invisible">
|
||||
<p>Drag and drop files here </p>
|
||||
</div>
|
||||
<div id="id_drop-files" class="drop-files">
|
||||
<form id="file_form" enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
<h1>Upload Workout File</h1>
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<p>Looking for <a href="/rowers/workout/upload/team/">Team Manager
|
||||
Upload?</a></p>
|
||||
{% endif %}
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div id="formbutton" class="grid_1 prefix_4 suffix_1">
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div id="right" class="grid_6 omega">
|
||||
<h1>Optional extra actions</h1>
|
||||
<p>
|
||||
<table>
|
||||
{{ optionsform.as_table }}
|
||||
|
||||
</table>
|
||||
</p>
|
||||
<p>
|
||||
You can select one static plot to be generated immediately for
|
||||
this workout. You can select to export to major fitness
|
||||
platforms automatically.
|
||||
If you check "make private", this workout will not be visible to your followers and will not show up in your teams' workouts list. With the Landing Page option, you can select to which (workout related) page you will be
|
||||
taken after a successfull upload.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
If you don't have a workout file but have written down the splits,
|
||||
you can create a workout file yourself from <a href="/static/dummy_workout_template.xls">this template</a>
|
||||
</p>
|
||||
|
||||
|
||||
<p><b>Select Files with the File button or drag them on the marked area</b></p>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<h1>Optional extra actions</h1>
|
||||
<p>
|
||||
<table>
|
||||
{{ optionsform.as_table }}
|
||||
|
||||
</table>
|
||||
</p>
|
||||
<p>
|
||||
You can select one static plot to be generated immediately for
|
||||
this workout. You can select to export to major fitness
|
||||
platforms automatically.
|
||||
If you check "make private", this workout will not be visible to your followers and will not show up in your teams' workouts list. With the Landing Page option, you can select to which (workout related) page you will be
|
||||
taken after a successfull upload.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
If you don't have a workout file but have written down the splits,
|
||||
you can create a workout file yourself from <a href="/static/dummy_workout_template.xls">this template</a>
|
||||
</p>
|
||||
|
||||
|
||||
<p><b>Select Files with the File button or drag them on the marked area</b></p>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
</form>
|
||||
</ul>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
@@ -221,8 +222,8 @@ $('#id_workouttype').change();
|
||||
console.log(value);
|
||||
});
|
||||
|
||||
$("#id_drop-files").replaceWith(
|
||||
'<div id="id_waiting"><img src="/static/img/rowingtimer.gif" width="120" height="100">'
|
||||
$("#id_main").replaceWith(
|
||||
'<div id="id_waiting"><img src="/static/img/rowingtimer.gif" width="120" height="100" style="width:120px">'
|
||||
);
|
||||
$.ajax({
|
||||
data: data,
|
||||
@@ -310,3 +311,8 @@ $('#id_workouttype').change();
|
||||
};
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workouts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
+111
-98
@@ -1,104 +1,117 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Contact Us{% endblock title %}
|
||||
{% block content %}
|
||||
<div id="emailform" class="grid_6 alpha">
|
||||
<h1>Contact us through email</h1>
|
||||
{% extends "newbase.html" %}
|
||||
{% block title %}Contact Us{% endblock title %}
|
||||
{% block main %}
|
||||
<h1>Contact us through email</h1>
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<form method="post" action="/rowers/email/send/">{% csrf_token %}
|
||||
<table>
|
||||
<tr><td>
|
||||
<label class="label">Name <span class="required">*</span></label>
|
||||
|
||||
|
||||
<form method="post" action="/rowers/email/send/">{% csrf_token %}
|
||||
<table>
|
||||
<tr><td>
|
||||
<label class="label">Name <span class="required">*</span></label>
|
||||
<span class="span">
|
||||
</td><td>
|
||||
<input name= "firstname" class="inputtext" maxlength="255" size="12" />
|
||||
<label class="spanlabel">First</label>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
</span>
|
||||
<span class="span">
|
||||
</td><td>
|
||||
<input name= "lastname" class="inputtext" maxlength="255" size="18" />
|
||||
<label class="spanlabel">Last</label>
|
||||
</span>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label class="label">Email Address <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<input name="email" class="inputtext" type="text" maxlength="255" size="35" />
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label class="label">Subject <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<input name="subject" class="inputtext" type="text" maxlength="255" size="45" />
|
||||
</td></tr>
|
||||
</table>
|
||||
<label class="label">You must answer <u>YES</u> to the question below to approve sending this email. <span class="required">*</span></label>
|
||||
<table>
|
||||
<tr><td>
|
||||
Do you want to send me an email?
|
||||
</td><td>
|
||||
<input name="botcheck" class="inputtext" type="text" maxlength="5" size="5" />
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label class="label">Message <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<textarea name="message" class="inputtextarea" rows="11" cols="45"></textarea>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<input class="button green" type="submit" name="submitform" value="Send Message" />
|
||||
</td></tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</td><td>
|
||||
<input name= "firstname" class="inputtext" maxlength="255" size="12" />
|
||||
<label class="spanlabel">First</label>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
</span>
|
||||
<span class="span">
|
||||
</td><td>
|
||||
<input name= "lastname" class="inputtext" maxlength="255" size="18" />
|
||||
<label class="spanlabel">Last</label>
|
||||
</span>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label class="label">Email Address <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<input name="email" class="inputtext" type="text" maxlength="255" size="35" />
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label class="label">Subject <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<input name="subject" class="inputtext" type="text" maxlength="255" size="45" />
|
||||
</td></tr>
|
||||
</table>
|
||||
<label class="label">You must answer <u>YES</u> to the question below to approve sending this email. <span class="required">*</span></label>
|
||||
<table>
|
||||
<tr><td>
|
||||
Do you want to send me an email?
|
||||
</td><td>
|
||||
<input name="botcheck" class="inputtext" type="text" maxlength="5" size="5" />
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<label class="label">Message <span class="required">*</span></label>
|
||||
</td><td>
|
||||
<textarea name="message" class="inputtextarea" rows="11" cols="45"></textarea>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<input class="button green" type="submit" name="submitform" value="Send Message" />
|
||||
</td></tr>
|
||||
</table>
|
||||
</form>
|
||||
</li>
|
||||
|
||||
<li class="grid_2">
|
||||
<h1>Bug reporting, feature requests</h1>
|
||||
|
||||
<p>
|
||||
Bug reports and feature requests can be done through our BitBucket page. Please check on the following link if your bug or issue is a known one. Feel free to file any feature request.
|
||||
<ul>
|
||||
<li><a href="https://bitbucket.org/sanderroosendaal/rowsandall/issues">BitBucket Issue list (click here to go report an issue or request a feature)</a></li>
|
||||
</ul>
|
||||
</p>
|
||||
</li>
|
||||
|
||||
<li class="grid_2">
|
||||
<h1>Facebook Group</h1>
|
||||
|
||||
<p>We run a facebook group where you can post questions and report problems,
|
||||
especially if you think the wider user community benefits from the answers.</p>
|
||||
<ul>
|
||||
<li><a href="https://www.facebook.com/groups/rowsandall/">https://www.facebook.com/groups/rowsandall/</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li class="grid_2">
|
||||
<h1>Twitter</h1>
|
||||
|
||||
<p>You can also check me on Twitter:
|
||||
<ul>
|
||||
<li><a href="https://twitter.com/rowsandall">https://twitter.com/rowsandall</a>
|
||||
</ul>
|
||||
When the site is down, this is the appropriate channel to look for apologies, updates, and offer help.
|
||||
</p>
|
||||
</li>
|
||||
|
||||
<li class="grid_2">
|
||||
<h1>Rowsandall s.r.o.</h1>
|
||||
|
||||
<p><strong>Rowsandall s.r.o.</strong><br />
|
||||
Nové sady 988/2<br />
|
||||
602 00 Brno<br />
|
||||
Czech Republic<br />
|
||||
IČ: 070 48 572<br />
|
||||
DIČ: CZ 070 48 572 (Nejsme plátce DPH)<br />
|
||||
Datová schránka: 7897syr<br />
|
||||
Email: <a href="mailto:info@rowsandall.com">info@rowsandall.com</a><br />
|
||||
The company is registered in the business register at the
|
||||
Regional Court in Brno (Společnost je zapsána v obchodním rejstříku vedeném u Krajského soudu v Brně, oddíl C, vložka 105845)<br/>
|
||||
</p>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_help.html' %}
|
||||
{% endblock %}
|
||||
|
||||
<div class="grid_6 omega">
|
||||
<h1>Bug reporting, feature requests</h1>
|
||||
|
||||
<p>
|
||||
Bug reports and feature requests can be done through our BitBucket page. Please check on the following link if your bug or issue is a known one. Feel free to file any feature request.
|
||||
<ul>
|
||||
<li><a href="https://bitbucket.org/sanderroosendaal/rowsandall/issues">BitBucket Issue list (click here to go report an issue or request a feature)</a></li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<h1>Facebook Group</h1>
|
||||
|
||||
<p>We run a facebook group where you can post questions and report problems,
|
||||
especially if you think the wider user community benefits from the answers.</p>
|
||||
<ul>
|
||||
<li><a href="https://www.facebook.com/groups/rowsandall/">https://www.facebook.com/groups/rowsandall/</a></li>
|
||||
</ul>
|
||||
|
||||
<h1>Twitter</h1>
|
||||
|
||||
<p>You can also check me on Twitter:
|
||||
<ul>
|
||||
<li><a href="https://twitter.com/rowsandall">https://twitter.com/rowsandall</a>
|
||||
</ul>
|
||||
When the site is down, this is the appropriate channel to look for apologies, updates, and offer help.
|
||||
</p>
|
||||
|
||||
<h1>Rowsandall s.r.o.</h1>
|
||||
|
||||
<p><strong>Rowsandall s.r.o.</strong><br />
|
||||
Nové sady 988/2<br />
|
||||
602 00 Brno<br />
|
||||
Czech Republic<br />
|
||||
IČ: 070 48 572<br />
|
||||
DIČ: CZ 070 48 572 (Nejsme plátce DPH)<br />
|
||||
Datová schránka: 7897syr<br />
|
||||
Email: <a href="mailto:info@rowsandall.com">info@rowsandall.com</a><br />
|
||||
The company is registered in the business register at the
|
||||
Regional Court in Brno (Společnost je zapsána v obchodním rejstříku vedeném u Krajského soudu v Brně, oddíl C, vložka 105845)<br/>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Workouts{% endblock %}
|
||||
{% block title %}Empower FIX{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script>
|
||||
function toggle(source) {
|
||||
@@ -65,80 +65,72 @@
|
||||
</script>
|
||||
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
{% include "teambuttons.html" with teamid=team.id team=team %}
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<h2>Empower Workouts</h2>
|
||||
<p>This functionality is aimed at users who have uploaded workouts from
|
||||
the Nielsen-Kellerman Empower Oarlock/SpeedCoach combination before the
|
||||
power inflation bug was known (May 4, 2018). </p>
|
||||
<h1>Empower Workouts</h1>
|
||||
|
||||
<p>Workouts recorded with a SpeedCoach running NK Firmware version 2.17 or
|
||||
lower have Power and Work per Stroke values that are approximately
|
||||
9% (sculling) or 5% too high. The exact value of the error depends on your
|
||||
inboard and oar length.</p>
|
||||
|
||||
<p>Currently, we autocorrect workouts recorded with old Firmware upon
|
||||
their upload, but workouts that were present on the site before
|
||||
the bug was known still have incorrect values for Power and Work per Stroke.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
You can use this page to correct those workouts.
|
||||
</p>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<div class="grid_4 alpha">
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name='daterange' class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<div id="workouts_table" class="grid_8 alpha">
|
||||
|
||||
|
||||
{% if workouts %}
|
||||
|
||||
<input type="checkbox" onClick="toggle(this)" /> Toggle All<br/>
|
||||
|
||||
<table width="100%" class="listtable">
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
<p> No workouts found </p>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div id="form_settings" class="grid_4 alpha">
|
||||
<p>Select workouts on the left,
|
||||
and press submit</p>
|
||||
<div class="grid_1 prefix_2 suffix_1">
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<p>Use the date form to reduce the selection</p>
|
||||
<p>
|
||||
{% csrf_token %}
|
||||
<input name='workoutselectform' class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_4">
|
||||
<p>You can use the date form above to reduce the selection</p>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input name='daterange' class="green button" type="submit" value="Submit">
|
||||
</form>
|
||||
</p>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>This functionality is aimed at users who have uploaded workouts from
|
||||
the Nielsen-Kellerman Empower Oarlock/SpeedCoach combination before the
|
||||
power inflation bug was known (May 4, 2018). </p>
|
||||
|
||||
<p>Workouts recorded with a SpeedCoach running NK Firmware version 2.17 or
|
||||
lower have Power and Work per Stroke values that are approximately
|
||||
9% (sculling) or 5% too high. The exact value of the error depends on your
|
||||
inboard and oar length.</p>
|
||||
|
||||
<p>Currently, we autocorrect workouts recorded with old Firmware upon
|
||||
their upload, but workouts that were present on the site before
|
||||
the bug was known still have incorrect values for Power and Work per Stroke.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
You can use this page to correct those workouts.
|
||||
</p>
|
||||
</li>
|
||||
|
||||
<li class="grid_4">
|
||||
<p>
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
{% if workouts %}
|
||||
|
||||
<input type="checkbox" onClick="toggle(this)" /> Toggle All<br/>
|
||||
|
||||
<table width="100%" class="listtable">
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input name='workoutselectform' class="button green" type="submit" value="Submit">
|
||||
|
||||
|
||||
</form>
|
||||
</p>
|
||||
{% else %}
|
||||
<p> No workouts found </p>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% if workouts %}
|
||||
<li>
|
||||
<p>Select workouts
|
||||
and press submit
|
||||
</p>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workouts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,23 +1,24 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Rowsandall Workouts Summary Export{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12">
|
||||
<form enctype="multipart/form-data" method="post">
|
||||
<div class="grid_4 alpha">
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
</form>
|
||||
<div class="grid_6 omega">
|
||||
{% block main %}
|
||||
<h1>Export all workouts</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<p>
|
||||
<form enctype="multipart/form-data" method="post">
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input class="green button" type="submit" value="Submit">
|
||||
</form>
|
||||
</p>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>
|
||||
With this form, you can export a summary table for all workouts within a selected date range.
|
||||
The table will be sent to you as a CSV file which can be opened in excel. The table contains
|
||||
@@ -27,7 +28,11 @@
|
||||
By setting the start date to your registration date or earlier and the end date to today,
|
||||
you will receive all workout data we are storing for you.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_profile.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,41 +1,46 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
|
||||
{% block title %}Change Favorite Charts{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
<h1>Change Favorite Charts of {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
|
||||
<form method="post">
|
||||
<ul class="main-content">
|
||||
{% csrf_token %}
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_4 alpha fav-form-header">
|
||||
<li class="grid_4">
|
||||
<div class="fav-form-header">
|
||||
<p><input type="submit" value="Update Favorites" class="button green small"/></p>
|
||||
</div>
|
||||
</div>
|
||||
{{ favorites_formset.management_form }}
|
||||
</li>
|
||||
|
||||
{% for favorites_form in favorites_formset %}
|
||||
<div class="fav-formset grid_4 alpha">
|
||||
<h2>Chart {{ forloop.counter }}</h2>
|
||||
<table>
|
||||
{{ favorites_form.as_table }}
|
||||
</table>
|
||||
</div>
|
||||
<li>
|
||||
<div class="fav-formset rounder">
|
||||
<h2>Chart {{ forloop.counter }}</h2>
|
||||
<table width=100%>
|
||||
{{ favorites_form.as_table }}
|
||||
</table>
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
<div class="grid_12 alpha">
|
||||
<p> </p>
|
||||
</div>
|
||||
</ul>
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
<!-- Include formset plugin - including jQuery dependency -->
|
||||
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
|
||||
<script src="/static/js/jquery.formset.js"></script>
|
||||
<script>
|
||||
$('.fav-formset').formset({
|
||||
addText: '<div class="grid_12"> </div><div class="button grid_2 green small">add chart</div>',
|
||||
deleteText: '<div class="grid_12"><p> </p></div><div class="button grid_1 red small">remove</div>'
|
||||
addText: '<div> </div><div class="button green small">add chart</div>',
|
||||
deleteText: '<div><p> </p></div><div class="button red small">remove</div>'
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_profile.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Rowsandall Fitness Progress {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
|
||||
<script>
|
||||
$(function() {
|
||||
@@ -70,56 +70,34 @@
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
|
||||
{% if rower.user %}
|
||||
<h1>{{ rower.user.first_name }} Power Estimates</h1>
|
||||
{% else %}
|
||||
<h1>{{ user.first_name }} Power Estimates</h1>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<div id="title" class="grid_12 alpha">
|
||||
<div class="grid_6 suffix_6 alpha">
|
||||
<form enctype="multipart/form-data" method="post">
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
{{ the_div|safe }}
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<form enctype="multipart/form-data" action="/rowers/fitness-progress/user/{{ rower.user.id }}" method="post">
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div class="grid_2 prefix_4 alpha">
|
||||
<input name='daterange' class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
<input name='daterange' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
</div>
|
||||
<div class="grid_10 alpha">
|
||||
{% if therower.user %}
|
||||
<h3>{{ therower.user.first_name }} Power Estimates</h3>
|
||||
{% else %}
|
||||
<h3>{{ user.first_name }} Power Estimates</h3>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 alpha dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ therower.user.first_name }} {{ therower.user.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_members %}
|
||||
<a class="button green small"
|
||||
href="/rowers/fitness-progress/rower/{{ member.id }}/{{ mode }}">{{ member.first_name }} {{ member.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div id="graph" class="grid_12 alpha">
|
||||
|
||||
{{ the_div|safe }}
|
||||
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
{% load tz %}
|
||||
@@ -6,7 +6,7 @@
|
||||
{% block title %} Flexible Plot {% endblock %}
|
||||
|
||||
{% localtime on %}
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
{{ js_res | safe }}
|
||||
{{ css_res| safe }}
|
||||
@@ -20,197 +20,45 @@
|
||||
{{ the_script |safe }}
|
||||
|
||||
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
|
||||
<div id="navigation" class="grid_12 alpha">
|
||||
{% if user.is_authenticated and mayedit %}
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ id }}/workflow">Workflow View</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_6 omega">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ id }}/advanced">Advanced Edit</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
||||
<p> </p>
|
||||
|
||||
<div id="plotbuttons" class="grid_12 alpha">
|
||||
|
||||
|
||||
<div id="x-axis" class="grid_9 alpha">
|
||||
<div class="grid_3 alpha dropdown">
|
||||
<button class="grid_2 alpha button blue small dropbtn">X-axis</button>
|
||||
<div class="dropdown-content">
|
||||
<div style="float: left; width:67%;">
|
||||
{% for key, value in axchoicesbasic.items %}
|
||||
{% if key != 'None' %}
|
||||
<a class="button blue small alpha" href="/rowers/workout/{{ id }}/flexchart/{{ key }}/{{ yparam1 }}/{{ yparam2 }}/{{ plottype }}">{{ value }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if promember %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
<a class="button blue small alpha" href="/rowers/workout/{{ id }}/flexchart/{{ key }}/{{ yparam1 }}/{{ yparam2 }}/scatter">{{ value }}</a>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
<a class="button rosy small" href="/rowers/promembership">{{ value }}</a>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div style="float: right; width: 33%;">
|
||||
{% if promember %}
|
||||
{% for key, value in extrametrics.items %}
|
||||
<a class="button orange small" href="/rowers/workout/{{ id }}/flexchart/{{ key }}/{{ yparam1 }}/{{ yparam2 }}/{{ plottype }}">{{ value }}</a>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{% for key, value in extrametrics.items %}
|
||||
<a class="button rosy small" href="/rowers/promembership">{{ value }} (Pro)</a>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="left-y" class="grid_3 dropdown">
|
||||
<button class="grid_2 alpha button blue small dropbtn">Left</button>
|
||||
<div class="dropdown-content">
|
||||
<div style="float: left; width:67%;">
|
||||
{% for key, value in axchoicesbasic.items %}
|
||||
{% if key not in noylist and key != 'None' %}
|
||||
<a class="button blue small" href="/rowers/workout/{{ id }}/flexchart/{{ xparam }}/{{ key }}/{{ yparam2 }}/{{ plottype }}">{{ value }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if promember %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
{% if key not in noylist %}
|
||||
<a class="button blue small" href="/rowers/workout/{{ id }}/flexchart/{{ xparam }}/{{ key }}/{{ yparam2 }}/{{ plottype }}">{{ value }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
{% if key not in noylist %}
|
||||
<a class="button rosy small" href="/rowers/promembership">{{ value }} (Pro)</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div style="float: right; width:33%;">
|
||||
{% if promember %}
|
||||
{% for key, value in extrametrics.items %}
|
||||
<a class="button orange small" href="/rowers/workout/{{ id }}/flexchart/{{ xparam }}/{{ key }}/{{ yparam2 }}/{{ plottype }}">{{ value }}</a>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{% for key, value in extrametrics.items %}
|
||||
<a class="button rosy small" href="/rowers/promembership">{{ value }} (Pro)</a>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<h1>Flexible Chart</h1>
|
||||
|
||||
<div id="right-y" class="grid_3 dropdown omega">
|
||||
<button class="grid_2 alpha button blue small dropbtn">Right</button>
|
||||
<div class="dropdown-content">
|
||||
<div style="float: left; width:67%;">
|
||||
{% for key, value in axchoicesbasic.items %}
|
||||
{% if key not in noylist %}
|
||||
<a class="button blue small" href="/rowers/workout/{{ id }}/flexchart/{{ xparam }}/{{ yparam1 }}/{{ key }}/{{ plottype }}">{{ value }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if promember %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
{% if key not in noylist %}
|
||||
<a class="button blue small" href="/rowers/workout/{{ id }}/flexchart/{{ xparam }}/{{ yparam1 }}/{{ key }}/{{ plottype }}">{{ value }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{% for key, value in axchoicespro.items %}
|
||||
{% if key not in noylist %}
|
||||
<a class="button rosy small" href="/rowers/promembership">{{ value }} (Pro)</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div style="float: right; width:33%;">
|
||||
{% if promember %}
|
||||
{% for key, value in extrametrics.items %}
|
||||
<a class="button orange small" href="/rowers/workout/{{ id }}/flexchart/{{ xparam }}/{{ yparam1 }}/{{ key }}/{{ plottype }}">{{ value }}</a>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{% for key, value in extrametrics.items %}
|
||||
<a class="button rosy small" href="/rowers/promembership">{{ value }} (Pro)</a>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
<div id="theplot" class="flexplot">
|
||||
{{ the_div|safe }}
|
||||
</div>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<form enctype="multipart/form-data"
|
||||
action=""
|
||||
method="post">
|
||||
{% csrf_token %}
|
||||
<table>
|
||||
{{ chartform.as_table }}
|
||||
</table>
|
||||
<table>
|
||||
{{ optionsform.as_table }}
|
||||
</table>
|
||||
<p>
|
||||
<input name="chartform" class="button green" type="submit"
|
||||
value="Submit">
|
||||
</p>
|
||||
</form>
|
||||
</li>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="y-axis" class="grid_3 omega">
|
||||
<div class="grid_2 alpha tooltip">
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% csrf_token %}
|
||||
{% if workstrokesonly %}
|
||||
<input type="hidden" name="workstrokesonly" value="True">
|
||||
<input class="grid_2 alpha button blue small" value="Remove Rest Strokes" type="Submit">
|
||||
{% else %}
|
||||
<input class="grid_2 alpha button blue small" type="hidden" name="workstrokesonly" value="False">
|
||||
<input class="grid_2 alpha button blue small" value="Include Rest Strokes" type="Submit">
|
||||
{% endif %}
|
||||
</form>
|
||||
<span class="tooltiptext">If your data source allows, this will show or hide strokes taken during rest intervals.</span>
|
||||
</div>
|
||||
<div class="grid_1 omega">
|
||||
{% if plottype == 'scatter' %}
|
||||
<a class="button blue small" href="/rowers/workout/{{ id }}/flexchart/{{ xparam }}/{{ yparam1 }}/{{ yparam2 }}/line">Line</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/workout/{{ id }}/flexchart/{{ xparam }}/{{ yparam1 }}/{{ yparam2 }}/scatter">Scatter</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="theplot" class="grid_12 alpha">
|
||||
|
||||
|
||||
{{ the_div|safe }}
|
||||
|
||||
</div>
|
||||
|
||||
<div id="favorites" class="grid_12 alpha">
|
||||
<div class="grid_2 suffix_4 alpha">
|
||||
{% if maxfav >= 0 %}
|
||||
<a class="button gray small" href="/rowers/me/favoritecharts">Manage Favorites</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
{% if favoritenr > 0 %}
|
||||
<a class="button blue small" href="/rowers/workout/{{ id }}/flexchart?favoritechart={{ favoritenr|add:-1 }}"><</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/workout/{{ id }}/flexchart?favoritechart={{ maxfav }}"><</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<li class="grid_2">
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% if favoritenr > 0 %}
|
||||
<a class="wh"
|
||||
href="/rowers/workout/{{ id }}/flexchart?favoritechart={{ favoritenr|add:-1 }}">
|
||||
<i class="fas fa-arrow-alt-left"></i>
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="wh"
|
||||
href="/rowers/workout/{{ id }}/flexchart?favoritechart={{ maxfav }}">
|
||||
<i class="fas fa-arrow-alt-left"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% csrf_token %}
|
||||
<input class="grid_2 alpha button blue small" type="hidden" name="savefavorite" value="True">
|
||||
{% if workstrokesonly %}
|
||||
@@ -218,22 +66,28 @@
|
||||
{% else %}
|
||||
<input type="hidden" name="workstrokesonlysave" value="True">
|
||||
{% endif %}
|
||||
<input class="grid_2 alpha button blue small" value="Make Favorite" type="Submit">
|
||||
</form>
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
{% if favoritenr < maxfav %}
|
||||
<a class="button blue small" href="/rowers/workout/{{ id }}/flexchart?favoritechart={{ favoritenr|add:1 }}">></a>
|
||||
<input value="Make Favorite" type="Submit">
|
||||
{% if favoritenr < maxfav %}
|
||||
<a class="wh"
|
||||
href="/rowers/workout/{{ id }}/flexchart?favoritechart={{ favoritenr|add:1 }}">
|
||||
<i class="fas fa-arrow-alt-right"></i>
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/workout/{{ id }}/flexchart?favoritechart=0">></a>
|
||||
<a class="wh"
|
||||
href="/rowers/workout/{{ id }}/flexchart?favoritechart=0">
|
||||
<i class="fas fa-arrow-alt-right"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if favoritechartnotes %}
|
||||
<div class="grid_6 prefix_6 alpha">
|
||||
</form>
|
||||
{% if favoritechartnotes %}
|
||||
<p>Chart {{ favoritenr|add:1 }}:{{ favoritechartnotes }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
{% endlocaltime %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
|
||||
|
||||
<h2>Flex Charts</h2>
|
||||
<div id="id_thumbscripts">
|
||||
|
||||
</div>
|
||||
<div id="id_thumbs">
|
||||
{{ charts | safe }}
|
||||
</div>
|
||||
<ul class="main-content" id="id_thumbs">
|
||||
{{ charts| safe }}
|
||||
</ul>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
{% load tz %}
|
||||
@@ -6,7 +6,7 @@
|
||||
{% block title %} Force Curve Plot {% endblock %}
|
||||
|
||||
{% localtime on %}
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
{{ js_res | safe }}
|
||||
{{ css_res| safe }}
|
||||
@@ -19,54 +19,34 @@
|
||||
|
||||
{{ the_script |safe }}
|
||||
|
||||
<h1>Empower Force Curve</h1>
|
||||
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
|
||||
<div id="navigation" class="grid_12 alpha">
|
||||
{% if user.is_authenticated and mayedit %}
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ id }}/advanced">Advanced Edit</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="grid_2 suffix_4 omega tooltip">
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
{% if user.is_authenticated and mayedit %}
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% csrf_token %}
|
||||
{% if workstrokesonly %}
|
||||
<input type="hidden" name="workstrokesonly" value="True">
|
||||
<input class="grid_2 alpha button blue small" value="Remove Rest Strokes" type="Submit">
|
||||
<input class="button blue small" value="Remove Rest Strokes" type="Submit">
|
||||
{% else %}
|
||||
<input class="grid_2 alpha button blue small" type="hidden" name="workstrokesonly" value="False">
|
||||
<input class="grid_2 alpha button blue small" value="Include Rest Strokes" type="Submit">
|
||||
{% endif %}
|
||||
<input class="button blue small" type="hidden" name="workstrokesonly" value="False">
|
||||
<input class="button blue small" value="Include Rest Strokes" type="Submit">
|
||||
</form>
|
||||
{% endif %}
|
||||
<span class="tooltiptext">If your data source allows, this will show or hide strokes taken during rest intervals.</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
{{ the_div|safe }}
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<p> </p>
|
||||
|
||||
|
||||
|
||||
<div id="theplot" class="grid_12 alpha">
|
||||
|
||||
{{ the_div|safe }}
|
||||
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
{% endlocaltime %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,22 +1,34 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Workouts{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<h3>Fusion Editor</h3>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<h1>Fusion Editor</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<p>
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
</p>
|
||||
<p>
|
||||
{% csrf_token %}
|
||||
<input name='fusion' class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</form>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>
|
||||
Adding sensor data from workout {{ workout2.id }} into workout {{ workout1.id }}.
|
||||
This will create a new workout. After you submit the form, you will be
|
||||
taken to the newly created workout. If you are happy with the result, you
|
||||
can delete the two original workouts manually.
|
||||
Adding sensor data from workout {{ workout2.id }} into workout {{ workout1.id }}.
|
||||
This will create a new workout. After you submit the form, you will be
|
||||
taken to the newly created workout. If you are happy with the result, you
|
||||
can delete the two original workouts manually.
|
||||
</p>
|
||||
<p>
|
||||
Workout 1: {{ workout1.name }}
|
||||
@@ -24,21 +36,13 @@
|
||||
<p>
|
||||
Workout 2: {{ workout2.name }}
|
||||
</p>
|
||||
<p>On the right hand side, please select the columns from workout 2 that
|
||||
<p>Please select the columns from workout 2 that
|
||||
you want to replace the equivalent columns in workout 1. </p>
|
||||
</div>
|
||||
<div class="grid_4">
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name='fusion' class="button green" type="submit" value="Submit"> </form>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,36 +1,34 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Workouts{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div id="workouts" class="grid_4 alpha">
|
||||
<div class="grid_4 alpha">
|
||||
<h1>Workout {{ id }}</h1>
|
||||
<table width=100%>
|
||||
<tr>
|
||||
{% block main %}
|
||||
<h1>Workout {{ id }} Sensor Fusion</h1>
|
||||
<ul class="main-content">
|
||||
<li>
|
||||
<table width=100%>
|
||||
<tr>
|
||||
<th>Rower:</th><td>{{ first_name }} {{ last_name }}</td>
|
||||
</tr><tr>
|
||||
<tr>
|
||||
</tr><tr>
|
||||
<tr>
|
||||
<th>Name:</th><td>{{ workout.name }}</td>
|
||||
</tr><tr>
|
||||
<tr>
|
||||
</tr><tr>
|
||||
<tr>
|
||||
<th>Date:</th><td>{{ workout.date }}</td>
|
||||
</tr><tr>
|
||||
</tr><tr>
|
||||
<th>Time:</th><td>{{ workout.starttime }}</td>
|
||||
</tr><tr>
|
||||
</tr><tr>
|
||||
<th>Distance:</th><td>{{ workout.distance }}m</td>
|
||||
</tr><tr>
|
||||
</tr><tr>
|
||||
<th>Duration:</th><td>{{ workout.duration |durationprint:"%H:%M:%S.%f" }}</td>
|
||||
</tr><tr>
|
||||
</tr><tr>
|
||||
<th>Type:</th><td>{{ workout.workouttype }}</td>
|
||||
</tr><tr>
|
||||
</tr><tr>
|
||||
<th>Weight Category:</th><td>{{ workout.weightcategory }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="grid_4 alpha">
|
||||
</tr>
|
||||
</table>
|
||||
<p>
|
||||
<form id="searchform" action=""
|
||||
method="get" accept-charset="utf-8">
|
||||
@@ -40,82 +38,108 @@
|
||||
<input class="searchfield" id="searchbox" name="q" type="text" placeholder="Search">
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
Select start and end date for a date range:
|
||||
<div class="grid_4 alpha">
|
||||
<p>
|
||||
<form enctype="multipart/form-data" action="/rowers/workout/fusion/{{ id }}/" method="post">
|
||||
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega">
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
</p>
|
||||
<p>
|
||||
<form enctype="multipart/form-data" action="/rowers/workout/fusion/{{ id }}/" method="post">
|
||||
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</p>
|
||||
<input name='daterange' class="button green" type="submit" value="Submit"> </form>
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="grid_3">
|
||||
<h1>Fuse this workout with data from:</h1>
|
||||
{% if workouts %}
|
||||
<p>
|
||||
<span>
|
||||
{% if workouts.has_previous %}
|
||||
{% if request.GET.q %}
|
||||
<a class="wh" href="?page=1&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-to-left"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.previous_page_number }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-left"></i>
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="wh" href="?page=1">
|
||||
<i class="fas fa-arrow-alt-to-left"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.previous_page_number }}">
|
||||
<i class="fas fa-arrow-alt-left"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<span>
|
||||
Page {{ workouts.number }} of {{ workouts.paginator.num_pages }}.
|
||||
</span>
|
||||
|
||||
{% if workouts.has_next %}
|
||||
{% if request.GET.q %}
|
||||
<a class="wh" href="?page={{ workouts.next_page_number }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-right"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.paginator.num_pages }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-to-right">
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="wh" href="?page={{ workouts.next_page_number }}">
|
||||
<i class="fas fa-arrow-alt-right"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.paginator.num_pages }}">
|
||||
<i class="fas fa-arrow-alt-to-right"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</span>
|
||||
</p>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div id="fusion" class="grid_8 omega">
|
||||
<h1>Fuse this workout with data from:</h1>
|
||||
{% if workouts %}
|
||||
<table width="100%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Date</th>
|
||||
<th> Time</th>
|
||||
<th> Name</th>
|
||||
<th> Type</th>
|
||||
<th> Distance </th>
|
||||
<th> Duration </th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
<th> Fusion</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</tbody>
|
||||
{% for cworkout in workouts %}
|
||||
<tr>
|
||||
<td> {{ cworkout.date }} </td>
|
||||
<td> {{ cworkout.starttime }} </td>
|
||||
<td> <a href="/rowers/workout/{{ workout.id }}/edit">{{ cworkout.name }}</a> </td>
|
||||
<td> {{ cworkout.workouttype }} </td>
|
||||
<td> {{ cworkout.distance }}m</td>
|
||||
<td> {{ cworkout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ cworkout.averagehr }} </td>
|
||||
<td> {{ cworkout.maxhr }} </td>
|
||||
{% if id == cworkout.id %}
|
||||
<td> </td>
|
||||
{% else %}
|
||||
<td> <a class="button blue small" href="/rowers/workout/fusion/{{ id }}/{{ cworkout.id }}">Fusion</a> </td>
|
||||
{% endif %}
|
||||
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p> No workouts found </p>
|
||||
{% endif %}
|
||||
|
||||
<div class="grid_2 prefix_5 suffix_1 omega">
|
||||
<span class="button gray small">
|
||||
{% if workouts.has_previous %}
|
||||
<a class="wh" href="/rowers/workout/fusion/{{ id }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}?page={{ workouts.previous_page_number }}"><</a>
|
||||
<table width="100%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Date</th>
|
||||
<th> Time</th>
|
||||
<th> Name</th>
|
||||
<th> Type</th>
|
||||
<th> Distance </th>
|
||||
<th> Duration </th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
<th> Fusion</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for cworkout in workouts %}
|
||||
<tr>
|
||||
<td> {{ cworkout.date }} </td>
|
||||
<td> {{ cworkout.starttime }} </td>
|
||||
<td> <a href="/rowers/workout/{{ workout.id }}/edit">{{ cworkout.name }}</a> </td>
|
||||
<td> {{ cworkout.workouttype }} </td>
|
||||
<td> {{ cworkout.distance }}m</td>
|
||||
<td> {{ cworkout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ cworkout.averagehr }} </td>
|
||||
<td> {{ cworkout.maxhr }} </td>
|
||||
{% if id == cworkout.id %}
|
||||
<td> </td>
|
||||
{% else %}
|
||||
<td> <a class="button blue small" href="/rowers/workout/fusion/{{ id }}/{{ cworkout.id }}">Fusion</a> </td>
|
||||
{% endif %}
|
||||
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p> No workouts found </p>
|
||||
{% endif %}
|
||||
|
||||
<span>
|
||||
Page {{ workouts.number }} of {{ workouts.paginator.num_pages }}.
|
||||
</span>
|
||||
|
||||
{% if workouts.has_next %}
|
||||
<a class="wh" href="/rowers/workout/fusion/{{ id }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}?page={{ workouts.next_page_number }}">></a>
|
||||
{% endif %}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,53 +1,52 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}GDPR Opt-In{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12">
|
||||
<h2>GDPR Opt-In</h2>
|
||||
<p>
|
||||
<b>
|
||||
To comply with the European Union General Data Protection Regulation,
|
||||
we need to record your consent to use personal data on this website.
|
||||
Please take some time to review our data policies. If you agree and
|
||||
opt in, click the green button at the bottom to be taken to the site.
|
||||
If you do not agree, please use the red button to delete your
|
||||
account. This will irreversibly delete all your data on rowsandall.com
|
||||
and remove your account.
|
||||
</b>
|
||||
</p>
|
||||
<hr>
|
||||
{% block main %}
|
||||
<h2>GDPR Opt-In</h2>
|
||||
<p>
|
||||
<b>
|
||||
To comply with the European Union General Data Protection Regulation,
|
||||
we need to record your consent to use personal data on this website.
|
||||
Please take some time to review our data policies. If you agree and
|
||||
opt in, click the green button at the bottom to be taken to the site.
|
||||
If you do not agree, please use the red button to delete your
|
||||
account. This will irreversibly delete all your data on rowsandall.com
|
||||
and remove your account.
|
||||
</b>
|
||||
</p>
|
||||
<hr>
|
||||
|
||||
{% include "privacypolicy.html" %}
|
||||
{% include "privacypolicy.html" %}
|
||||
|
||||
<hr>
|
||||
<hr>
|
||||
|
||||
<p>
|
||||
To start or continue using the site, please give your consent by clicking on the green Opt In button below.
|
||||
</p>
|
||||
<p>
|
||||
To start or continue using the site, please give your consent by clicking on the green Opt In button below.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<div class="grid_2 suffix_10 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/exportallworkouts">Download your data</a>
|
||||
</p>
|
||||
</div>
|
||||
</p>
|
||||
|
||||
<div class="grid_2 alpha">
|
||||
<a href="/rowers/me/gdpr-optin-confirm/?next={{ next }}" class="button green small">Opt in and continue</a>
|
||||
</div>
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/exportallworkouts">Download your data</a>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/me/gdpr-optin-confirm/?next={{ next }}">Opt in and continue</a>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<form method="POST" action="/rowers/me/delete" class="padding">
|
||||
{% csrf_token %}
|
||||
<input id="id_delete_user" type="hidden" name="delete_user" value="True">
|
||||
<div class="grid_2 prefix_2">
|
||||
<input class="button red small" type="submit" name="action" value="DELETE ACCOUNT">
|
||||
|
||||
</div>
|
||||
<input class="button red small" type="submit" name="action" value="DELETE ACCOUNT">
|
||||
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</p>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_profile.html' %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -1,43 +1,30 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Delete Graph Image {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div id="workouts" class="grid_6 alpha">
|
||||
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<h1>Confirm Graph Delete</h1>
|
||||
<p>This will permanently delete the graph</p>
|
||||
|
||||
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button green small" href="/rowers/list-workouts/">Cancel</a>
|
||||
</div>
|
||||
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button red small" href="/rowers/graph/{{ graph.id }}/delete">Delete</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="images" class="grid_6 omega">
|
||||
<p>
|
||||
<a href="/{{ graph.filename }}" download="myimage">
|
||||
<image src="/{{ graph.filename }}" alt="/{{ graph.filename }}" width="480"/>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
{% block main %}
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<form action="" method="post">
|
||||
{% csrf_token %}
|
||||
<p>Are you sure you want to delete this chart?</p>
|
||||
<p>
|
||||
<input class="button red" type="submit" value="Confirm">
|
||||
</p>
|
||||
</form>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<a href="/rowers/graph/{{ object.id }}">
|
||||
<image src="/{{ object.filename }}" alt="{{ object.filename }}"/>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workouts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
+160
-3
@@ -3,11 +3,168 @@
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block main %}
|
||||
<h1>Main</h1>
|
||||
<p>Vestibulum consectetur sit amet nisi ut consectetur. Praesent efficitur, nibh vitae fringilla scelerisque, est neque faucibus quam, in iaculis purus libero eget mauris. Curabitur et luctus sapien, ac gravida orci. Aliquam erat volutpat. In hac habitasse platea dictumst. Aenean commodo, arcu a commodo efficitur, libero dolor mollis turpis, non posuere orci leo eget enim. Curabitur sit amet elementum orci, pulvinar dignissim urna. Morbi id ex eu ex congue laoreet. Aenean tincidunt dolor justo, semper pretium libero luctus nec. Ut vulputate metus accumsan leo imperdiet tincidunt. Phasellus nec rutrum dolor. Cras imperdiet sollicitudin arcu, id interdum nibh <a href="">fermentum</a> in.
|
||||
<h1>Welcome to Rowsandall.com</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<h2>What is it?</h2>
|
||||
<p>
|
||||
Rowsandall.com is an online tool for rowers to analyze data from On The Water
|
||||
(OTW) and On The Erg (OTE) workouts. It accepts workout data from a
|
||||
number of devices and applications. It analyzes the data to provide
|
||||
valuable insights about your training, and enables you to share
|
||||
data with many common online training tracking systems.
|
||||
</p>
|
||||
<p>Vestibulum consectetur sit amet nisi ut consectetur. Praesent efficitur, nibh vitae fringilla scelerisque, est neque faucibus quam, in iaculis purus libero eget mauris. Curabitur et luctus sapien, ac gravida orci. Aliquam erat volutpat. In hac habitasse platea dictumst. Aenean commodo, arcu a commodo efficitur, libero dolor mollis turpis, non posuere orci leo eget enim. Curabitur sit amet elementum orci, pulvinar dignissim urna. Morbi id ex eu ex congue laoreet. Aenean tincidunt dolor justo, semper pretium libero luctus nec. Ut vulputate metus accumsan leo imperdiet tincidunt. Phasellus nec rutrum dolor. Cras imperdiet sollicitudin arcu, id interdum nibh <a href="">fermentum</a> in.
|
||||
<h2>Indoor Rowing</h2>
|
||||
<p>
|
||||
rowsandall.com is designed to work with all models of the Concept2
|
||||
Indoor rower. Using applications like ergstick, rowpro, ergdata or
|
||||
painsled; a user can collect stroke by stroke data from the Concept2
|
||||
Performance Monitor (Models PM3, PM4 or PM5). Workout data can be exported
|
||||
from these applications, usually in CSV format, and uploaded to
|
||||
rowsandall.com. Users can upload workouts either through the online
|
||||
interface, for by emailing workouts to the site to simplify the
|
||||
process for some applications.
|
||||
</p>
|
||||
<h2>On The Water Rowing</h2>
|
||||
<p>
|
||||
On the water rowers use either dedicated devices like Speedcoaches or
|
||||
smartphone applications to collect data on their workouts. All of these
|
||||
devices and applications provide a method to export workout data in CSV,
|
||||
TCX or FIT format files. Workout data in these formats can be uploaded
|
||||
to rowsandall.com. Users can upload workouts either through the online
|
||||
interface, for by emailing workouts to the site to simplify the process
|
||||
for some applications.
|
||||
</p>
|
||||
<h2>Basic Analysis</h2>
|
||||
<p>
|
||||
Many athletes use training approaches that use heart rate as a key metric. In general, HR training is managed by defining different training zones for different purposes. Rowsandall.com uses heart rate zone definitions that are consistent with the Concept2 Training Guide.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
After a user defines their training zones, any training files that are uploaded with HR data can be analyzed to provide time in HR zone pie charts.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The tools also provide the ability to review a row, stroke by stroke in plots versus time or distance. Basic plots in include HR, Pace, Stroke rate, and power for the erg.
|
||||
</p>
|
||||
|
||||
|
||||
<p>
|
||||
The tools also provide a text summary of the row.
|
||||
</p>
|
||||
|
||||
<h2>Workout Export</h2>
|
||||
|
||||
<p>
|
||||
rowsandall.com provides the ability to easily export workouts from the erg or boat to the Concept2 online logbook. Export to other sport tracking sites like Strava and SportTracks is also supported. Users can also export workout data by email.
|
||||
</p>
|
||||
|
||||
<h2>Import Compatibility</h2>
|
||||
|
||||
<p>
|
||||
Rowsandall.com tries to be compatible with the most important tools that rowers use to capture the data (both indoor and OTW). The list of supported tools
|
||||
continues to be expanded.
|
||||
</p>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<h2>Getting your data on rowsandall.com</h2>
|
||||
|
||||
<p>
|
||||
To start using the tool, you first need to get some workouts in it.
|
||||
There are basically two ways. The first method works with a workout file
|
||||
(CSV, FIT, TCX, etc). The details are described in this
|
||||
<a href="https://analytics.rowsandall.com/2017/11/08/getting-your-data-on-rowsandall-com/">blog post</a>.
|
||||
A straightforward way to upload your data is to use the
|
||||
<a href="/rowers/upload">Upload Page</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The second way to get data into the tool is by importing them
|
||||
from other workout tracking portals like Strava, SportTracks, etc.
|
||||
To do this, you use the Import menu on the left of the
|
||||
<a href="/rowers/list-workouts">Workouts List</a> page. For this
|
||||
to work, you need to have coupled the external fitness tracking
|
||||
site with rowsandall.com. You can do this in your
|
||||
<a href="/rowers/me/edit">User Profile</a>. Don't worry, the site
|
||||
will guide you through the process.
|
||||
</p>
|
||||
|
||||
<h2>User settings</h2>
|
||||
|
||||
<p>Talking about the <a href="/rowers/me/edit">user profile</a>,
|
||||
we recommend that you look
|
||||
at what parameters can be set there. To get the most out of
|
||||
the site, we recommend you set the heart rate and power zones,
|
||||
as well as check that your age and gender are correct. Exercise
|
||||
data make much more sense when this context is taken into account.
|
||||
</p>
|
||||
|
||||
<h2>Exploring a workout</h2>
|
||||
|
||||
<p>
|
||||
In the <a href="/rowers/list-workouts">Workouts List</a>,
|
||||
you can click on the name of a workout to open it.
|
||||
Once you're on a workout page, the menu on the left will
|
||||
give you all possibilities you have to edit, manipulate, chart,
|
||||
or analyze the workout data.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
When you are about to do something irreversible (like deleting a workout)
|
||||
the site will ask for a confirmation, so don't hesitate to explore.
|
||||
</p>
|
||||
|
||||
<h2>Analysis</h2>
|
||||
|
||||
<p>
|
||||
Some of our functionality is not related to a single workout, but instead
|
||||
looks at comparisons, trends, statistics, and other. You can find all
|
||||
that under the <a href="/rowers/analysis">Analysis Tab</a>.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>On-line Racing</h2>
|
||||
|
||||
<p>
|
||||
<a href="/rowers/virtualevents">On-line racing</a> is a
|
||||
fun way to race other Rowsandall.com users
|
||||
rowing on the same stretch of water.
|
||||
</p>
|
||||
|
||||
<h2>Training Plan</h2>
|
||||
|
||||
<p>
|
||||
Under the <a href="/rowers/sessions">Plan</a> tab, you
|
||||
will find your training plan and functionality to see how
|
||||
you are progressing towards your goals.
|
||||
</p>
|
||||
|
||||
<h2>Teams</h2>
|
||||
|
||||
<p>
|
||||
The <a href="/rowers/team">Teams</a> tab brings you to
|
||||
functionality related to interaction with your team, if you
|
||||
are part of one.
|
||||
</p>
|
||||
|
||||
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
<h2>Need more help?</h2>
|
||||
|
||||
<p>
|
||||
The links in the menu on the left bring you to our blog, where we
|
||||
regularly publish how-to's and articles about new functionality, to
|
||||
our Facebook group where you can discuss with other users, and to
|
||||
a contact page where you can learn how to contact the developers
|
||||
of this site.
|
||||
</p>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sideheader %}
|
||||
<h1>Help</h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
|
||||
+96
-110
@@ -1,16 +1,16 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Rowsandall Histogram {% endblock %}
|
||||
{% block title %}Rowsandall {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
|
||||
<script>
|
||||
$(function() {
|
||||
|
||||
// Get the form fields and hidden div
|
||||
var checkbox = $("#id_water");
|
||||
var modality = $("#id_modality");
|
||||
var hidden = $("#id_waterboattype");
|
||||
|
||||
|
||||
@@ -19,15 +19,20 @@
|
||||
// enabled.
|
||||
|
||||
hidden.hide();
|
||||
|
||||
if (modality.val() == 'water') {
|
||||
hidden.show();
|
||||
}
|
||||
|
||||
|
||||
// Setup an event listener for when the state of the
|
||||
// checkbox changes.
|
||||
checkbox.change(function() {
|
||||
modality.change(function() {
|
||||
// Check to see if the checkbox is checked.
|
||||
// If it is, show the fields and populate the input.
|
||||
// If not, hide the fields.
|
||||
if (checkbox.is(':checked')) {
|
||||
// If not, hide the fields.
|
||||
var Value = modality.val();
|
||||
if (Value=='water') {
|
||||
// Show the hidden fields.
|
||||
hidden.show();
|
||||
} else {
|
||||
@@ -45,117 +50,98 @@
|
||||
// $("#hidden_field").val("");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{{ interactiveplot |safe }}
|
||||
<div id="id_css_res">
|
||||
<link rel="stylesheet" href="/static/css/bokeh-0.12.3.min.css" type="text/css" />
|
||||
<link rel="stylesheet" href="/static/css/bokeh-widgets-0.12.3.min.css" type="text/css" />
|
||||
</div>
|
||||
<div id="id_js_res">
|
||||
<script
|
||||
type="text/javascript" src="/static/js/bokeh-0.12.3.min.js">
|
||||
</script>
|
||||
<script
|
||||
type="text/javascript" src="/static/js/bokeh-widgets-0.12.3.min.js">
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, false, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
</div>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
|
||||
|
||||
|
||||
<div id="title" class="grid_12 alpha">
|
||||
<div class="grid_10 alpha">
|
||||
{% if theuser %}
|
||||
<h3>{{ theuser.first_name }}'s Stroke Analysis</h3>
|
||||
{% else %}
|
||||
<h3>{{ user.first_name }}'s Stroke Analysis</h3>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 alpha dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ theuser.first_name }} {{ theuser.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_members %}
|
||||
<a class="button green small" href="/rowers/{{ member.id }}/flexall/{{ xparam }}/{{ yparam1 }}/{{ yparam2 }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">{{ member.first_name }} {{ member.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div id="form" class="grid_6 alpha">
|
||||
<p>Warning: Large date ranges may take a long time to load. Huge date ranges may crash your browser.</p>
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% csrf_token %}
|
||||
<div class="grid_2 alpha">
|
||||
<table>
|
||||
{{ optionsform.as_table }}
|
||||
</table>
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega">
|
||||
<input type="hidden" name="options" value="options">
|
||||
<input class="grid_1 alpha button green small" value="Submit" type="Submit">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
<p>Use this form to select a different date range:</p>
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
<div class="grid_4 alpha">
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name='daterange' class="button green" type="submit" value="Submit"> </form>
|
||||
</div>
|
||||
<div class="grid_4 alpha">
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
Or use the last {{ deltaform }} days.
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% csrf_token %}
|
||||
<input name='datedelta' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="summary" class="grid_6 suffix_6 alpha">
|
||||
|
||||
<div id="id_script">
|
||||
|
||||
</div>
|
||||
|
||||
<ul class="main-content">
|
||||
|
||||
<li class="grid_4">
|
||||
<p>Summary for {{ theuser.first_name }} {{ theuser.last_name }}
|
||||
between {{ startdate|date }} and {{ enddate|date }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<div id="graph" class="grid_12 alpha">
|
||||
|
||||
{{ the_div|safe }}
|
||||
|
||||
</div>
|
||||
<li class="grid_4">
|
||||
<div id="id_chart">
|
||||
|
||||
{{ the_div|safe }}
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
<table>
|
||||
{{ optionsform.as_table }}
|
||||
</table>
|
||||
<input type="hidden" name="options" value="options">
|
||||
</li>
|
||||
<li>
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
</li>
|
||||
<li>
|
||||
{% csrf_token %}
|
||||
<input class="button green small" value="Submit" type="Submit">
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
<script type='text/javascript'
|
||||
src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js'>
|
||||
</script>
|
||||
|
||||
<script>
|
||||
$(function($) {
|
||||
console.log('loading script');
|
||||
$.getJSON(window.location.protocol + '//'+window.location.host + '/rowers/histodata', function(json) {
|
||||
console.log('got script');
|
||||
var counter=0;
|
||||
var script = json.script;
|
||||
var div = json.div;
|
||||
console.log('set vars');
|
||||
$("#id_sitready").remove();
|
||||
console.log('sitready removed');
|
||||
$("#id_chart").append(div);
|
||||
console.log('div appended');
|
||||
$("#id_script").append("<script>"+script+"</s"+"cript>");
|
||||
console.log('script changed');
|
||||
|
||||
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,66 +1,34 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}View Workout {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, false, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
|
||||
<div id="navigation" class="grid_12 alpha">
|
||||
{% if user.is_authenticated and mayedit %}
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_8 omega">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ id }}/advanced">Advanced Edit</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="title" class="grid_12 alpha">
|
||||
<h1>Indoor Rower Power Histogram</h1>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="graph" class="grid_12 alpha">
|
||||
{% if user.is_authenticated and mayedit %}
|
||||
<h1>Indoor Rower Power Histogram</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
|
||||
{{ the_div|safe }}
|
||||
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -15,36 +15,33 @@
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div id="id_dropregion" class="grid_12 alpha watermark invisible">
|
||||
<p>Drag and drop files here </p>
|
||||
</div>
|
||||
<div id="id_drop-files" class="grid_12 alpha drop-files">
|
||||
<form id="file_form" enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>Upload Image</h1>
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
{% block main %}
|
||||
<h1>Upload Image</h1>
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
<div id="id_dropregion" class="watermark invisible">
|
||||
<p>Drag and drop files here </p>
|
||||
</div>
|
||||
<div id="id_drop-files" class="drop-files">
|
||||
<form id="file_form" enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div id="formbutton" class="grid_1 prefix_4 suffix_1">
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
</div>
|
||||
<div id="right" class="grid_6 omega">
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</form>
|
||||
<p>
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
@@ -169,7 +166,7 @@
|
||||
});
|
||||
|
||||
$("#id_drop-files").replaceWith(
|
||||
'<div id="id_waiting"><img src="/static/img/rowingtimer.gif" width="120" height="100">'
|
||||
'<div id="id_waiting"><img src="/static/img/rowingtimer.gif" width="120" height="100" style="width:120px">'
|
||||
);
|
||||
$.ajax({
|
||||
data: data,
|
||||
@@ -250,3 +247,7 @@
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,80 +1,60 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Advanced Features {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div id="workouts" class="grid_6 alpha">
|
||||
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<h1>In Stroke Metrics</h1>
|
||||
{% if user.rower.rowerplan == 'basic' %}
|
||||
<p>This is a preview of the page with advanced functionality for Pro users. See <a href="/rowers/about">the About page</a> for more information and to sign up for Pro Membership</a>
|
||||
{% block main %}
|
||||
<h1>In Stroke Metrics</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
{% if user.rower.rowerplan == 'basic' %}
|
||||
|
||||
<p>
|
||||
This is a preview of the page with advanced functionality for Pro users.
|
||||
See <a href="/rowers/about">the About page</a> for more information
|
||||
and to sign up for Pro Membership
|
||||
</p>
|
||||
{% endif %}
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced Edit</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="grid_6 alpha">
|
||||
|
||||
<table width=100%>
|
||||
<tr>
|
||||
<th>Date:</th><td>{{ workout.date }}</td>
|
||||
</tr><tr>
|
||||
<th>Time:</th><td>{{ workout.starttime }}</td>
|
||||
</tr><tr>
|
||||
<th>Distance:</th><td>{{ workout.distance }}m</td>
|
||||
</tr><tr>
|
||||
<th>Duration:</th><td>{{ workout.duration |durationprint:"%H:%M:%S.%f" }}</td>
|
||||
</tr>
|
||||
<th>Public link to this workout</th>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a>
|
||||
<td>
|
||||
</table>
|
||||
</div>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<table width=100%>
|
||||
<tr>
|
||||
<th>Date:</th><td>{{ workout.date }}</td>
|
||||
</tr><tr>
|
||||
<th>Time:</th><td>{{ workout.starttime }}</td>
|
||||
</tr><tr>
|
||||
<th>Distance:</th><td>{{ workout.distance }}m</td>
|
||||
</tr><tr>
|
||||
<th>Duration:</th><td>{{ workout.duration |durationprint:"%H:%M:%S.%f" }}</td>
|
||||
</tr>
|
||||
<th>Public link to this workout</th>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a>
|
||||
<td>
|
||||
|
||||
</table>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
<div class="grid_6 alpha">
|
||||
{% if instrokemetrics %}
|
||||
{% for metric in instrokemetrics %}
|
||||
{% if forloop.first %}
|
||||
<div class="grid_2 alpha">
|
||||
{% else %}
|
||||
<div class="grid_2">
|
||||
{% endif %}
|
||||
<li>
|
||||
{% if instrokemetrics %}
|
||||
{% for metric in instrokemetrics %}
|
||||
<p>
|
||||
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/instroke/{{ metric }}">{{ metric }}</a>
|
||||
</div>
|
||||
</p>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<p>Unfortunately, this workout doesn't have any in stroke metrics</p>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div id="advancedplots" class="grid_6 omega">
|
||||
<p> </p>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
+31
-29
@@ -1,22 +1,21 @@
|
||||
|
||||
{% extends "base.html" %}
|
||||
{% block title %}About us{% endblock title %}
|
||||
{% block content %}
|
||||
{% extends "newbase.html" %}
|
||||
{% block title %}Legal{% endblock title %}
|
||||
{% block main %}
|
||||
|
||||
<div class="grid_6 alpha">
|
||||
<h2>Terms and Conditions</h2>
|
||||
<h3>Credit</h3>
|
||||
<h1>Terms and Conditions</h1>
|
||||
<h2>Credit</h2>
|
||||
|
||||
<p>This document was created using a Contractology template available at
|
||||
<a href="http://www.freenetlaw.com">http://www.freenetlaw.com.</a>.</p>
|
||||
|
||||
<h3>Introduction</h3>
|
||||
<h2>Introduction</h2>
|
||||
|
||||
<p>These terms and conditions govern your use of this website; by using this website, you accept these terms and conditions in full. If you disagree with these terms and conditions or any part of these terms and conditions, you must not use this website. </p>
|
||||
|
||||
<p>This website uses cookies. By using this website and agreeing to these terms and conditions, you consent to our rowsandall.com’s use of cookies in accordance with the terms of rowsandall.com’s privacy policy.</p>
|
||||
|
||||
<h3>License to use website</h3>
|
||||
<h2>License to use website</h2>
|
||||
|
||||
<p>Unless otherwise stated, rowsandall.com and/or its licensors own the intellectual property rights in the website and material on the website. Subject to the license below, all these intellectual property rights are reserved.</p>
|
||||
|
||||
@@ -33,7 +32,7 @@
|
||||
|
||||
</p>
|
||||
|
||||
<h3>Acceptable use</h3>
|
||||
<h2>Acceptable use</h2>
|
||||
|
||||
<p>You must not use this website in any way that causes, or may cause, damage to the website or impairment of the availability or accessibility of the website; or in any way which is unlawful, illegal, fraudulent or harmful, or in connection with any unlawful, illegal, fraudulent or harmful purpose or activity.</p>
|
||||
|
||||
@@ -44,7 +43,7 @@
|
||||
<p>You must not use this website to transmit or send unsolicited commercial communications.</p>
|
||||
|
||||
|
||||
<h3>Restricted access</h3>
|
||||
<h2>Restricted access</h2>
|
||||
|
||||
<p>Access to certain areas of this website is restricted. rowsandall.com reserves the right to restrict access to areas of this website, or indeed this entire website, at rowsandall.com’s discretion.</p>
|
||||
|
||||
@@ -52,7 +51,7 @@
|
||||
|
||||
<p>rowsandall.com may disable your user ID and password in rowsandall.com’s sole discretion without notice or explanation.</p>
|
||||
|
||||
<h3>User content</h3>
|
||||
<h2>User content</h2>
|
||||
|
||||
<p>In these terms and conditions, <q>your user content</q> means material (including without limitation text, images, audio material, video material and audio-visual material) that you submit to this website, for whatever purpose.</p>
|
||||
|
||||
@@ -66,7 +65,7 @@
|
||||
|
||||
<p>Notwithstanding rowsandall.com’s rights under these terms and conditions in relation to user content, rowsandall.com does not undertake to monitor the submission of such content to, or the publication of such content on, this website.</p>
|
||||
|
||||
<h3>No warranties</h3>
|
||||
<h2>No warranties</h2>
|
||||
|
||||
<p>This website is provided <q>as is</q> without any representations or warranties, express or implied. rowsandall.com makes no representations or warranties in relation to this website or the information and materials provided on this website. </p>
|
||||
|
||||
@@ -79,7 +78,7 @@
|
||||
|
||||
<p>Nothing on this website constitutes, or is meant to constitute, advice of any kind. If you require advice in relation to any legal, financial or medica] matter you should consult an appropriate professional.</p>
|
||||
|
||||
<h3>Limitations of liability</h3>
|
||||
<h2>Limitations of liability</h2>
|
||||
|
||||
<p>rowsandall.com will not be liable to you (whether under the law of contact, the law of torts or otherwise) in relation to the contents of, or use of, or otherwise in connection with, this website:
|
||||
|
||||
@@ -90,7 +89,7 @@
|
||||
|
||||
<p>These limitations of liability apply even if rowsandall.com has been expressly advised of the potential loss.</p>
|
||||
|
||||
<h3>Exceptions</h3>
|
||||
<h2>Exceptions</h2>
|
||||
|
||||
<p>Nothing in this website disclaimer will exclude or limit any warranty implied by law that it would be unlawful to exclude or limit; and nothing in this website disclaimer will exclude or limit rowsandall.com’s liability in respect of any:
|
||||
|
||||
@@ -100,61 +99,59 @@
|
||||
<li>matter which it would be illegal or unlawful for rowsandall.com to exclude or limit, or to attempt or purport to exclude or limit, its liability.
|
||||
</ul></p>
|
||||
|
||||
<h3>Reasonableness</h3>
|
||||
<h2>Reasonableness</h2>
|
||||
|
||||
<p>By using this website, you agree that the exclusions and limitations of liability set out in this website disclaimer are reasonable. </p>
|
||||
|
||||
<p>If you do not think they are reasonable, you must not use this website.</p>
|
||||
|
||||
<h3>Other parties</h3>
|
||||
<h2>Other parties</h2>
|
||||
|
||||
|
||||
<p>You agree that the limitations of warranties and liability set out in this website disclaimer will protect rowsandall.com’s officers, employees, agents, subsidiaries, successors, assigns and sub-contractors as well as rowsandall.com. </p>
|
||||
|
||||
<h3>Unenforceable provisions</h3>
|
||||
<h2>Unenforceable provisions</h2>
|
||||
|
||||
<p>If any provision of this website disclaimer is, or is found to be, unenforceable under applicable law, that will not affect the enforceability of the other provisions of this website disclaimer.</p>
|
||||
|
||||
<h3>Indemnity</h3>
|
||||
<h2>Indemnity</h2>
|
||||
|
||||
<p>You hereby indemnify rowsandall.com and undertake to keep rowsandall.com indemnified against any losses, damages, costs, liabilities and expenses (including without limitation legal expenses and any amounts paid by rowsandall.com to a third party in settlement of a claim or dispute on the advice of rowsandall.com’s legal advisers) incurred or suffered by rowsandall.com arising out of any breach by you of any provision of these terms and conditions, or arising out of any claim that you have breached any provision of these terms and conditions.</p>
|
||||
|
||||
<h3>Breaches of these terms and conditions</h3>
|
||||
<h2>Breaches of these terms and conditions</h2>
|
||||
|
||||
<p>Without prejudice to rowsandall.com’s other rights under these terms and conditions, if you breach these terms and conditions in any way, rowsandall.com may take such action as rowsandall.com deems appropriate to deal with the breach, including suspending your access to the website, prohibiting you from accessing the website, blocking computers using your IP address from accessing the website, contacting your internet service provider to request that they block your access to the website and/or bringing court proceedings against you.</p>
|
||||
|
||||
<h3>Variation</h3>
|
||||
<h2>Variation</h2>
|
||||
|
||||
<p>rowsandall.com may revise these terms and conditions from time-to-time. Revised terms and conditions will apply to the use of this website from the date of the publication of the revised terms and conditions on this website. Please check this page regularly to ensure you are familiar with the current version.</p>
|
||||
|
||||
<h3>Assignment</h3>
|
||||
<h2>Assignment</h2>
|
||||
|
||||
<p>rowsandall.com may transfer, sub-contract or otherwise deal with rowsandall.com’s rights and/or obligations under these terms and conditions without notifying you or obtaining your consent.</p>
|
||||
|
||||
<p>You may not transfer, sub-contract or otherwise deal with your rights and/or obligations under these terms and conditions. </p>
|
||||
|
||||
<h3>Severability</h3>
|
||||
<h2>Severability</h2>
|
||||
|
||||
<p>If a provision of these terms and conditions is determined by any court or other competent authority to be unlawful and/or unenforceable, the other provisions will continue in effect. If any unlawful and/or unenforceable provision would be lawful or enforceable if part of it were deleted, that part will be deemed to be deleted, and the rest of the provision will continue in effect. </p>
|
||||
|
||||
<h3>Entire agreement</h3>
|
||||
<h2>Entire agreement</h2>
|
||||
|
||||
<p>These terms and conditions constitute the entire agreement between you and rowsandall.com in relation to your use of this website, and supersede all previous agreements in respect of your use of this website.</p>
|
||||
|
||||
<h3>Law and jurisdiction</h3>
|
||||
<h2>Law and jurisdiction</h2>
|
||||
|
||||
<p>These terms and conditions will be governed by and construed in accordance with Czech Law and any disputes relating to these terms and conditions will be subject to the exclusive jurisdiction of the courts of The Czech Republic.</p>
|
||||
|
||||
|
||||
<h3>rowsandall.com’s details</h3>
|
||||
<h2>rowsandall.com’s details</h2>
|
||||
|
||||
<p>The rowsandall.com site is owned by Rowsandall s.r.o., Nové sady 988/2, Staré Brno, 602 00 Brno, Czech Republic (company identification number 070 48 572)</p>
|
||||
|
||||
<p>You can contact rowsandall.com by using the <a href="/rowers/email/">email contact form.</a></p>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
<h2>Privacy Policy</h2>
|
||||
|
||||
{% include "privacypolicy.html" %}
|
||||
@@ -162,5 +159,10 @@
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
{% endblock main %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_help.html' %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
<style>
|
||||
#mypointer {
|
||||
cursor: pointer;
|
||||
@@ -17,12 +17,12 @@
|
||||
|
||||
|
||||
|
||||
<div class="grid_12">
|
||||
<h1>Courses</h1>
|
||||
|
||||
<div id="courses_table" class="grid_8 alpha">
|
||||
<h1>Courses</h1>
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="grid_3">
|
||||
{% if courses %}
|
||||
<p>
|
||||
<table width="100%" class="listtable shortpadded">
|
||||
<thead>
|
||||
<tr>
|
||||
@@ -51,100 +51,90 @@
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
{% else %}
|
||||
<p> No courses found </p>
|
||||
{% endif %}
|
||||
|
||||
<div class="grid_6 alpha">
|
||||
<div class="grid_2 prefix_1 alpha">
|
||||
<a class="button small green" href="/rowers/courses/upload">Add Courses</a>
|
||||
</div>
|
||||
<p> </p>
|
||||
<form id="searchform" action="/rowers/list-courses/"
|
||||
method="get" accept-charset="utf-8">
|
||||
<div class="grid_3 prefix_1 alpha">
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<form id="searchform" action="/rowers/list-courses/"
|
||||
method="get" accept-charset="utf-8">
|
||||
<input class="searchfield" id="searchbox" name="q" type="text" placeholder="Search">
|
||||
</div>
|
||||
<div class="grid_1 omega">
|
||||
<button class="button blue small" type="submit">
|
||||
Search
|
||||
</button>
|
||||
</form>
|
||||
</p>
|
||||
<p>
|
||||
<a class="button small green" href="/rowers/courses/upload">Add Courses</a>
|
||||
</p>
|
||||
{% if announcements %}
|
||||
<h3>What's New?</h3>
|
||||
{% for a in announcements %}
|
||||
<div class="site-announcement-box">
|
||||
<div class="site-announcement">
|
||||
<i>{{ a.created }}:</i>
|
||||
{{ a.announcement|urlize }}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="grid_4 omega">
|
||||
<div class="grid_4" id="announcements">
|
||||
{% if announcements %}
|
||||
<h3>What's New?</h3>
|
||||
{% for a in announcements %}
|
||||
<div class="site-announcement-box">
|
||||
<div class="site-announcement">
|
||||
<i>{{ a.created }}:</i>
|
||||
{{ a.announcement|urlize }}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<p> </p>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_4" id="about">
|
||||
<h2>How-to</h2>
|
||||
<p>
|
||||
Courses allow you to mark the start & finish lines of your
|
||||
test pieces and measure the time spent on the course (as opposed
|
||||
to the total duration of a workout). This allows you to row and rank
|
||||
marked courses.
|
||||
{% endfor %}
|
||||
<p> </p>
|
||||
{% endif %}
|
||||
|
||||
</li>
|
||||
|
||||
To create a course, you use <a href="earth.google.com">Google Earth</a>
|
||||
to mark the start and finish lines using polygons. The process is identical
|
||||
to creating custom courses for the
|
||||
<a href="http://performancephones.com/crewnerd/">CrewNerd</a>
|
||||
app.
|
||||
<li class="grid_4">
|
||||
<h2>How-to</h2>
|
||||
<p>
|
||||
Courses allow you to mark the start & finish lines of your
|
||||
test pieces and measure the time spent on the course (as opposed
|
||||
to the total duration of a workout). This allows you to row and rank
|
||||
marked courses.
|
||||
|
||||
To create a course, you use <a href="earth.google.com">Google Earth</a>
|
||||
to mark the start and finish lines using polygons. The process is identical
|
||||
to creating custom courses for the
|
||||
<a href="http://performancephones.com/crewnerd/">CrewNerd</a>
|
||||
app.
|
||||
|
||||
</p>
|
||||
|
||||
</p>
|
||||
<p>CrewNerd has published a nice video tutorial of the process.
|
||||
<a href="https://youtu.be/whhWFmMJbhM">Click here</a> to see the video. The part
|
||||
we're interested in starts at 2:05.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
In addition to start and finish areas, on rowsandall.com you can add additional
|
||||
polygons to mark areas that you must pass (in that order). This allows for
|
||||
courses with turns around buoys, respecting buoy lines, or respecting traffic
|
||||
patterns on rivers and lakes.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<ul>
|
||||
<li>Open Google Earth</li>
|
||||
<li>Create a folder "Courses" under "Temporary Places" or under "My Places"</li>
|
||||
<li>Create a folder for each Course under "Courses", and for each course:</li>
|
||||
<li>Create Start polygon</li>
|
||||
<li>Optional: Create First "must row through" polygon</li>
|
||||
<li>Optional: Create subsequent "must row through" polygons</li>
|
||||
<li>Create Finish polygon</li>
|
||||
<li>Save "Courses" as KML file</li>
|
||||
<li>Upload the file to rowsandall.com using the "Add Courses" button</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>CrewNerd has published a nice video tutorial of the process.
|
||||
<a href="https://youtu.be/whhWFmMJbhM">Click here</a> to see the video. The part
|
||||
we're interested in starts at 2:05.
|
||||
</p>
|
||||
<p>You are allowed to have multiple courses in one KML file.
|
||||
Your CrewNerd "courses.kml" file works out of the box</p>
|
||||
|
||||
<p>The site doesn't test for duplicate courses.</p>
|
||||
|
||||
<p>
|
||||
In addition to start and finish areas, on rowsandall.com you can add additional
|
||||
polygons to mark areas that you must pass (in that order). This allows for
|
||||
courses with turns around buoys, respecting buoy lines, or respecting traffic
|
||||
patterns on rivers and lakes.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<ul>
|
||||
<li>Open Google Earth</li>
|
||||
<li>Create a folder "Courses" under "Temporary Places" or under "My Places"</li>
|
||||
<li>Create a folder for each Course under "Courses", and for each course:</li>
|
||||
<li>Create Start polygon</li>
|
||||
<li>Optional: Create First "must row through" polygon</li>
|
||||
<li>Optional: Create subsequent "must row through" polygons</li>
|
||||
<li>Create Finish polygon</li>
|
||||
<li>Save "Courses" as KML file</li>
|
||||
<li>Upload the file to rowsandall.com using the "Add Courses" button</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>You are allowed to have multiple courses in one KML file.
|
||||
Your CrewNerd "courses.kml" file works out of the box</p>
|
||||
|
||||
<p>The site doesn't test for duplicate courses.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_racing.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -8,61 +8,88 @@
|
||||
{% include "monitorjobs.html" %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
<h1>Recent Graphs</h1>
|
||||
|
||||
<form id="searchform" action="."
|
||||
method="get" accept-charset="utf-8">
|
||||
<button class="button blue small" type="submit">
|
||||
Search
|
||||
</button>
|
||||
<input class="searchfield" id="searchbox" name="q" type="text" placeholder="Search">
|
||||
</form>
|
||||
{% if graphs1 %}
|
||||
<div class="grid_1 alpha">
|
||||
<p> </p>
|
||||
</div>
|
||||
<ul class="main-content">
|
||||
{% if graphs %}
|
||||
<li class="grid_2">
|
||||
<form id="searchform" action="."
|
||||
method="get" accept-charset="utf-8">
|
||||
<button class="button blue small" type="submit">
|
||||
Search
|
||||
</button>
|
||||
<input class="searchfield" id="searchbox" name="q" type="text" placeholder="Search">
|
||||
</form>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>
|
||||
<span>
|
||||
{% if graphs.has_previous %}
|
||||
{% if request.GET.q %}
|
||||
<a class="wh" href="?page=1&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-to-left"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.previous_page_number }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-left"></i>
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="wh" href="?page=1">
|
||||
<i class="fas fa-arrow-alt-to-left"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ graphs.previous_page_number }}">
|
||||
<i class="fas fa-arrow-alt-left"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<span>
|
||||
Page {{ graphs.number }} of {{ graphs.paginator.num_pages }}.
|
||||
</span>
|
||||
|
||||
{% if graphs.has_next %}
|
||||
{% if request.GET.q %}
|
||||
<a class="wh" href="?page={{ graphs.next_page_number }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-right"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ graphs.paginator.num_pages }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-to-right">
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="wh" href="?page={{ graphs.next_page_number }}">
|
||||
<i class="fas fa-arrow-alt-right"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ graphs.paginator.num_pages }}">
|
||||
<i class="fas fa-arrow-alt-to-right"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</span>
|
||||
</p>
|
||||
</li>
|
||||
{% for graph in graphs %}
|
||||
<li>
|
||||
<p class="caption">
|
||||
<a href="/rowers/graph/{{ graph.id }}/">
|
||||
<img src="/{{ graph.filename }}"
|
||||
onerror="this.src='/static/img/rowingtimer.gif'"
|
||||
alt="{{ graph.filename }}" width="120" height="100">
|
||||
</a>
|
||||
</p>
|
||||
<p class="caption">{{ graph.workout.name }}</p>
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<li class="grid_4">
|
||||
<p>
|
||||
No charts found
|
||||
</p>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
{% for graph in graphs1 %}
|
||||
<div id="thumb-container" class="grid_2">
|
||||
<p class="caption"><a href="/rowers/graph/{{ graph.id }}/">
|
||||
<img src="/{{ graph.filename }}"
|
||||
onerror="this.src='/static/img/rowingtimer.gif'"
|
||||
alt="{{ graph.filename }}" width="120" height="100"></a></p>
|
||||
<p class="caption">{{ graph.workout.name }}</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
<div class="grid_1 omega">
|
||||
<p> </p>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="grid_12">
|
||||
<p> </p>
|
||||
</div>
|
||||
|
||||
<div class="grid_1 alpha">
|
||||
<p> </p>
|
||||
</div>
|
||||
|
||||
{% for graph in graphs2 %}
|
||||
<div id="thumb-container" class="grid_2">
|
||||
<a href="/rowers/graph/{{ graph.id }}/">
|
||||
<p class="caption"><img src="/{{ graph.filename }}"
|
||||
onerror="this.src='/static/img/rowingtimer.gif'"
|
||||
alt="{{ graph.filename }}" width="120" height="100"></a></p>
|
||||
<p class="caption">{{ graph.workout.name }}</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
<div class="grid_1 omega">
|
||||
<p> </p>
|
||||
</div>
|
||||
|
||||
|
||||
{% else %}
|
||||
<p> No graphs found </p>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workouts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
+129
-196
@@ -1,7 +1,7 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
xo
|
||||
{% block title %}Rowsandall Workouts List{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
@@ -41,65 +41,117 @@
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
<style>
|
||||
#mypointer {
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="grid_12">
|
||||
|
||||
<div class="grid_4 alpha">
|
||||
|
||||
{% if team %}
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<p>
|
||||
<form enctype="multipart/form-data" method="post">
|
||||
{% else %}
|
||||
<form enctype="multipart/form-data" method="post">
|
||||
{% endif %}
|
||||
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 alpha">
|
||||
<input name='daterange' class="button green" type="submit" value="Submit"> </form>
|
||||
</div>
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ rower.user.first_name }} {{ rower.user.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_members %}
|
||||
<a class="button green small" href="/rowers/u/{{ member.id }}/list-workouts/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">{{ member.first_name }} {{ member.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
|
||||
{% endif %}
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
{% if team %}
|
||||
<div class="grid_12 alpha">
|
||||
{% include "teambuttons.html" with teamid=team.id team=team %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="grid_12">
|
||||
|
||||
<div id="workouts_table" class="grid_8 alpha">
|
||||
<input name='daterange' type="submit" value="Submit">
|
||||
</form>
|
||||
</p>
|
||||
{% if team %}
|
||||
<h3>{{ team.name }} Team Workouts</h3>
|
||||
{% else %}
|
||||
<h3>Workouts of {{ rower.user.first_name }} {{ rower.user.last_name }}</h3>
|
||||
<p>
|
||||
<form id="searchform" action="/rowers/list-workouts/team/{{ team.id }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}"
|
||||
method="get" accept-charset="utf-8">
|
||||
{% else %}
|
||||
<form id="searchform" action="/rowers/list-workouts/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}"
|
||||
method="get" accept-charset="utf-8">
|
||||
{% endif %}
|
||||
<input class="searchfield" id="searchbox" name="q" type="text" placeholder="Search">
|
||||
<input type="submit">
|
||||
</input>
|
||||
</form>
|
||||
</p>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
{{ the_div |safe }}
|
||||
</li>
|
||||
<li>
|
||||
{% if team %}
|
||||
<h3>{{ team.name }} Team Workouts</h3>
|
||||
{% else %}
|
||||
<h3>
|
||||
Workouts of {{ rower.user.first_name }} {{ rower.user.last_name }}
|
||||
</h3>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<span>
|
||||
{% if workouts.has_previous %}
|
||||
{% if request.GET.q %}
|
||||
<a class="wh" href="?page=1&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-to-left"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.previous_page_number }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-left"></i>
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="wh" href="?page=1">
|
||||
<i class="fas fa-arrow-alt-to-left"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.previous_page_number }}">
|
||||
<i class="fas fa-arrow-alt-left"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<span>
|
||||
Page {{ workouts.number }} of {{ workouts.paginator.num_pages }}.
|
||||
</span>
|
||||
|
||||
{% if workouts.has_next %}
|
||||
{% if request.GET.q %}
|
||||
<a class="wh" href="/rowers/list-workouts/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}?page={{ workouts.next_page_number }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-right"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.paginator.num_pages }}&q={{ request.GET.q }}">
|
||||
<i class="fas fa-arrow-alt-to-right">
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="wh" href="/rowers/list-workouts/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}?page={{ workouts.next_page_number }}">
|
||||
<i class="fas fa-arrow-alt-right"></i>
|
||||
</a>
|
||||
<a class="wh" href="?page={{ workouts.paginator.num_pages }}">
|
||||
<i class="fas fa-arrow-alt-to-right"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</span>
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
{% if rankingonly and not team %}
|
||||
<a href="/rowers/list-workouts">
|
||||
<i class="far fa-star"></i>Show All Workouts
|
||||
</a>
|
||||
{% elif not team %}
|
||||
<a href="/rowers/list-workouts/ranking">
|
||||
<i class="fas fa-star"></i>Show Only Ranking Pieces
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
</p>
|
||||
</li>
|
||||
<li class="maxheight grid_4">
|
||||
|
||||
{% if workouts %}
|
||||
<table width="100%" class="listtable shortpadded">
|
||||
<thead>
|
||||
@@ -115,14 +167,13 @@
|
||||
<th> Max HR </th>
|
||||
{% if not team %}
|
||||
<th> </th>
|
||||
<th> </th>
|
||||
{% else %}
|
||||
<th colspan="2">
|
||||
Owner
|
||||
</th>
|
||||
{% endif %}
|
||||
</tr>
|
||||
</thead>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for workout in workouts %}
|
||||
{% if workout.rankingpiece %}
|
||||
@@ -140,8 +191,8 @@
|
||||
</td>
|
||||
<td> {{ workout.date|date:"Y-m-d" }} </td>
|
||||
<td> {{ workout.starttime|date:"H:i" }} </td>
|
||||
{% if workout.user.user == user or user == team.manager %}
|
||||
{% if workout.name != '' %}
|
||||
{% if workout.user.user == user or user == team.manager %}
|
||||
{% if workout.name != '' %}
|
||||
<td>
|
||||
<a href={% url rower.defaultlandingpage id=workout.id %}>
|
||||
{{ workout.name }}
|
||||
@@ -164,23 +215,19 @@
|
||||
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ workout.averagehr }} </td>
|
||||
<td> {{ workout.maxhr }} </td>
|
||||
{% if not team %}
|
||||
<td>
|
||||
<a class="small" href="/rowers/workout/{{ workout.id }}/export">Export</a>
|
||||
</td>
|
||||
{% else %}
|
||||
{% if team %}
|
||||
<td colspan="2">
|
||||
<a class="small" href="/rowers/{{ workout.user.id }}/list-workouts">
|
||||
{{ workout.user.user.first_name }}
|
||||
{{ workout.user.user.last_name }}
|
||||
</a>
|
||||
<a class="small" href="/rowers/{{ workout.user.id }}/list-workouts">
|
||||
{{ workout.user.user.first_name }}
|
||||
{{ workout.user.user.last_name }}
|
||||
</a>
|
||||
</td>
|
||||
{% endif %}
|
||||
<td> <a class="small" href="/rowers/workout/{{ workout.id }}/flexchart">Flex</a> </td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/workout/{{ workout.id }}/deleteconfirm">Delete
|
||||
<a class="small" href="/rowers/workout/{{ workout.id }}/delete">Delete
|
||||
</td>
|
||||
|
||||
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
@@ -189,140 +236,26 @@
|
||||
{% else %}
|
||||
<p> No workouts found </p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="grid_4 omega">
|
||||
{% if team %}
|
||||
<div class="grid_4" id="teambuttons">
|
||||
<div class="grid_3 alpha">
|
||||
<p>
|
||||
|
||||
</p>
|
||||
</li>
|
||||
{% if announcements %}
|
||||
<li class="grid_4">
|
||||
<h3>What's New?</h3>
|
||||
</li>
|
||||
{% for a in announcements %}
|
||||
<li>
|
||||
<div class="site-announcement-box">
|
||||
<div class="site-announcement">
|
||||
<em>{{ a.created }}:</em>
|
||||
{{ a.announcement|urlize }}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="grid_4" id="interactiveplot">
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, true, true);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
{{ the_div |safe }}
|
||||
</div>
|
||||
<div class="grid_4" id="announcements">
|
||||
{% if announcements %}
|
||||
<h3>What's New?</h3>
|
||||
{% for a in announcements %}
|
||||
<div class="site-announcement-box">
|
||||
<div class="site-announcement">
|
||||
<i>{{ a.created }}:</i>
|
||||
{{ a.announcement|urlize }}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<p> </p>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_4" id="about">
|
||||
<h3>About</h3>
|
||||
<p>This site is a beta site, pioneering rowing data
|
||||
visualization and analysis. No warranties. The site's author is
|
||||
Sander Roosendaal. A Masters rower.
|
||||
|
||||
Read his <a href="http://blog.rowsandall.com/">blog</a>
|
||||
</p>
|
||||
<p><a href="/rowers/email/">© Rowsandall s.r.o.</a></p>
|
||||
<div style="text-align: right; padding: 2em">
|
||||
<a href="http://blog.rowsandall.com/">
|
||||
<img src="/static/img/sander.jpg" width="80"></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="grid_6 alpha">
|
||||
{% if rankingonly and not team %}
|
||||
<div class="grid_2 alpha">
|
||||
<a class="button small green" href="/rowers/list-workouts">All Workouts</a>
|
||||
</div>
|
||||
{% elif not team %}
|
||||
<div class="grid_2 alpha">
|
||||
<a class="button small green" href="/rowers/list-workouts/ranking">Ranking Pieces Only</a>
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<div class="grid_2">
|
||||
{% if user|is_promember %}
|
||||
<a class="button small gray" href="/rowers/workouts-join-select">Glue Workouts</a>
|
||||
{% else %}
|
||||
<a class="button blue small" href="/rowers/promembership">Glue</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<a class="button small gray" href="/rowers/update_empower">Empower Repair</a>
|
||||
</div>
|
||||
<p> </p>
|
||||
{% if team %}
|
||||
<form id="searchform" action="/rowers/list-workouts/team/{{ team.id }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}"
|
||||
method="get" accept-charset="utf-8">
|
||||
{% else %}
|
||||
<form id="searchform" action="/rowers/list-workouts/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}"
|
||||
method="get" accept-charset="utf-8">
|
||||
{% endif %}
|
||||
<div class="grid_3 prefix_1 alpha">
|
||||
<input class="searchfield" id="searchbox" name="q" type="text" placeholder="Search">
|
||||
</div>
|
||||
<div class="grid_1 omega">
|
||||
<button class="button blue small" type="submit">
|
||||
Search
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<span class="button gray small">
|
||||
{% if workouts.has_previous %}
|
||||
{% if request.GET.q %}
|
||||
<a class="wh" href="?page={{ workouts.previous_page_number }}&q={{ request.GET.q }}"><</a>
|
||||
{% else %}
|
||||
<a class="wh" href="?page={{ workouts.previous_page_number }}"><</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<span>
|
||||
Page {{ workouts.number }} of {{ workouts.paginator.num_pages }}.
|
||||
</span>
|
||||
|
||||
{% if workouts.has_next %}
|
||||
{% if request.GET.q %}
|
||||
<a class="wh" href="/rowers/list-workouts/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}?page={{ workouts.next_page_number }}&q={{ request.GET.q }}">></a>
|
||||
{% else %}
|
||||
<a class="wh" href="/rowers/list-workouts/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}?page={{ workouts.next_page_number }}">></a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</span>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workouts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
{% load tz %}
|
||||
@@ -35,33 +35,33 @@ $('#id_workouttype').change();
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
<h1>Add Workout Manually</h1>
|
||||
<div class="grid_6 alpha">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
{% block main %}
|
||||
<h1>Add Workout Manually</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<form id="importantform"
|
||||
enctype="multipart/form-data" action="" method="post">
|
||||
<table width=100%>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<p>
|
||||
<input class="button green" type="submit" value="Save">
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<form id="importantform"
|
||||
enctype="multipart/form-data" action="" method="post">
|
||||
<table width=100%>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div id="formbutton" class="grid_1 suffix_1 omega">
|
||||
<input class="button green" type="submit" value="Save">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div id="images" class="grid_6 omega">
|
||||
<p> </p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workouts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}{{ workout.name }} {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
@@ -12,58 +12,24 @@
|
||||
</script>
|
||||
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, false, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body, #mymap {height: 100%; margin:5px;}
|
||||
</style>
|
||||
<h1>{{ workout.name }}</h1>
|
||||
|
||||
<ul class="main-content">
|
||||
|
||||
<li class="grid_4">
|
||||
<div style="height:100%;" id="theplot" class="flexplot mapdiv">
|
||||
{{ mapdiv|safe }}
|
||||
|
||||
|
||||
<div id="workouts" class="grid_12 alpha">
|
||||
|
||||
|
||||
|
||||
{% if user.is_authenticated and mayedit %}
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced Edit</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div style="height:100%;" id="theplot" class="grid_12 alpha flexplot">
|
||||
{{ mapdiv|safe }}
|
||||
|
||||
|
||||
{{ mapscript|safe }}
|
||||
</div>
|
||||
{{ mapscript|safe }}
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
<h1>Analysis</h1>
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li class="has-children" id="fitness">
|
||||
@@ -6,22 +8,22 @@
|
||||
<i class="fas fa-watch-fitness fa-fw"></i> Fitness</label>
|
||||
<ul>
|
||||
<li id="fitness-ranking">
|
||||
<a href="">
|
||||
<a href="/rowers/ote-bests2">
|
||||
<i class="fas fa-star fa-fw"></i> Ranking Pieces
|
||||
</a>
|
||||
</li>
|
||||
<li id="fitness-otecp">
|
||||
<a href="">
|
||||
<a href="/rowers/ote-ranking">
|
||||
<i class="fas fa-user-chart fa-fw"></i> CP Chart OTE
|
||||
</a>
|
||||
</li>
|
||||
<li id="fitness-otwcp">
|
||||
<a href="">
|
||||
<a href="/rowers/otw-bests">
|
||||
<i class="far fa-user-chart fa-fw"></i> CP Chart OTW
|
||||
</a>
|
||||
</li>
|
||||
<li id="fitness-powerprogress">
|
||||
<a href="">
|
||||
<a href="/rowers/fitnessprogress">
|
||||
<i class="far fa-watch-fitness fa-fw"></i> Power Progress
|
||||
</a>
|
||||
</li>
|
||||
@@ -34,34 +36,60 @@
|
||||
</label>
|
||||
<ul>
|
||||
<li id="stats-boxchart">
|
||||
<a href="">
|
||||
<a href="/rowers/user-boxplot-select">
|
||||
<i class="fas fa-box-open fa-fw"></i> Box Chart
|
||||
</a>
|
||||
</li>
|
||||
<li id="stats-trendflex">
|
||||
<a href="">
|
||||
<a href="/rowers/user-multiflex-select">
|
||||
<i class="far fa-chart-line fa-fw"></i> Trend Flex
|
||||
</a>
|
||||
</li>
|
||||
<li id="stats-cumstats">
|
||||
<a href="">
|
||||
<a href="/rowers/cumstats">
|
||||
<i class="fal fa-table fa-fw"></i> Statistics
|
||||
</a>
|
||||
</li>
|
||||
<li id="stats-histopower">
|
||||
<a href="">
|
||||
<a href="/rowers/histo">
|
||||
<i class="fas fa-chart-bar"></i> Power Histogram
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<a href="">
|
||||
<a href="/rowers/flexall">
|
||||
<i class="fas fa-chart-line fa-fw"></i> Cumulative Flex Chart
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="">
|
||||
<a href="/rowers/laboratory">
|
||||
<i class="fas fa-flask fa-fw"></i> Laboratory</a>
|
||||
</li>
|
||||
</ul><!-- cd-accordion-menu -->
|
||||
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<p> </p>
|
||||
|
||||
{% if user|team_members %}
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li class="has-children" id="athletes">
|
||||
<input type="checkbox" name="athlete-selector" id="athlete-selector">
|
||||
<label for="athlete-selector"><i class="fas fa-users fa-fw"></i> Athletes</label>
|
||||
<ul>
|
||||
{% for member in user|team_members %}
|
||||
<a href={{ request.path|userurl:member }}>
|
||||
<i class="fas fa-user fa-fw"></i>
|
||||
{% if member == rower.user %}
|
||||
•
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
{{ member.first_name }} {{ member.last_name }}
|
||||
</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<h1>Demo</h1>
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li><a href="#0">Link</a></li>
|
||||
<li class="has-children">
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
<h1>Help</h1>
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li id="gettingstarted">
|
||||
<a href="">
|
||||
<a href="/rowers/help">
|
||||
<i class="fas fa-question-circle fa-fw"></i> Getting Started
|
||||
</a>
|
||||
</li>
|
||||
<li id="blog">
|
||||
<a href="">
|
||||
<a href="analytics.rowsandall.com">
|
||||
<i class="fab fa-wordpress-simple fa-fw"></i> Blog
|
||||
</a>
|
||||
</li>
|
||||
<li id="contact">
|
||||
<a href="">
|
||||
<a href="/rowers/email">
|
||||
<i class="fas fa-envelope fa-fw"></i> Contact
|
||||
</a>
|
||||
</li>
|
||||
<li id="videos">
|
||||
<a href="">
|
||||
<i class="fab fa-youtube fa-fw"></i> Videos
|
||||
<li id="facebook">
|
||||
<a href="https://www.facebook.com/rowsandall">
|
||||
<i class="fab fa-facebook-square fa-fw"></i> Facebook group
|
||||
</a>
|
||||
</li>
|
||||
</ul><!-- cd-accordion-menu -->
|
||||
|
||||
@@ -1,5 +1,27 @@
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
<h1>Plan</h1>
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li class="has-children" id="plans">
|
||||
<input type="checkbox" name="group-plans" id="group-plans">
|
||||
<label for="group-plans">
|
||||
<i class="fas fa-bullseye-pointer"></i> Plans
|
||||
</label>
|
||||
<ul>
|
||||
<li id="plans-manage">
|
||||
<a href="/rowers/createplan/">
|
||||
<i class="fas fa-bullseye-pointer"></i> Manage Plans
|
||||
</a>
|
||||
</li>
|
||||
{% for plan in rower|trainingplans %}
|
||||
<li id="plan-{{ plan.id }}">
|
||||
<a href="/rowers/plan/{{ plan.id }}/">
|
||||
<i class="fal fa-calendar-alt fa-fw"></i> {{ plan.name }}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</li>
|
||||
<li class="has-children" id="sessions">
|
||||
<input type="checkbox" name="group-sessions" id="group-sessions">
|
||||
<label for="group-sessions">
|
||||
@@ -7,20 +29,25 @@
|
||||
</label>
|
||||
<ul>
|
||||
<li id="sessions-list">
|
||||
<a href="">
|
||||
<a href="/rowers/sessions/">
|
||||
<i class="far fa-calendar-alt fa-fw"></i> Sessions
|
||||
</a>
|
||||
</li>
|
||||
<li id="sessions-link">
|
||||
<a href="">
|
||||
<a href="/rowers/sessions/manage/">
|
||||
<i class="fas fa-tasks fa-fw"></i> Link Workouts
|
||||
</a>
|
||||
</li>
|
||||
<li id="sessions-coach">
|
||||
<a href="">
|
||||
<a href="/rowers/sessions/coach/">
|
||||
<i class="fas fa-bullhorn fa-fw"></i> Coach View
|
||||
</a>
|
||||
</li>
|
||||
<li id="sessions-print">
|
||||
<a href="/rowers/sessions/print/">
|
||||
<i class="fas fa-print fa-fw"></i> Print View
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="has-children" id="plan">
|
||||
@@ -30,20 +57,106 @@
|
||||
</label>
|
||||
<ul>
|
||||
<li id="plan-session">
|
||||
<a href="">
|
||||
<a href="/rowers/sessions/create/">
|
||||
<i class="far fa-calendar-plus fa-fw"></i> Add Session
|
||||
</a>
|
||||
</li>
|
||||
<li id="plan-teamsession">
|
||||
<a href="">
|
||||
<a href="/rowers/sessions/teamcreate/">
|
||||
<i class="fas fa-whistle fa-fw"></i> Add Team Session
|
||||
</a>
|
||||
</li>
|
||||
<li id="plan-microcycle">
|
||||
<a href="">
|
||||
<a href="/rowers/sessions/multicreate/">
|
||||
<i class="fas fa-expand fa-fw"></i>Plan Microcycle
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul><!-- cd-accordion-menu -->
|
||||
|
||||
<p> </p>
|
||||
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li class="has-children" id="cycles">
|
||||
<input type="checkbox" name="cycle-selector" id="cycle-selector">
|
||||
<label for="cycle-selector"><i class="far fa-calendar-alt fa-fw"></i> Select Time Period</label>
|
||||
<ul>
|
||||
<li class="has-children" id="cycles-this">
|
||||
<input type="checkbox" name="cycle-this" id="cycle-this">
|
||||
<label for="cycle-this">This</label>
|
||||
<ul>
|
||||
<li>
|
||||
<a href = {{ request.path|timeurl:"thisweek" }}>
|
||||
Week
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href = {{ request.path|timeurl:"thismonth" }}>
|
||||
Month
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="has-children" id="cycles-next">
|
||||
<input type="checkbox" name="cycle-next" id="cycle-next">
|
||||
<label for="cycle-next">Next</label>
|
||||
<ul>
|
||||
<li>
|
||||
<a href = {{ request.path|timeurl:"nextweek" }}>
|
||||
Week
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href = {{ request.path|timeurl:"nextmonth" }}>
|
||||
Month
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="has-children" id="cycles-Last">
|
||||
<input type="checkbox" name="cycle-Last" id="cycle-Last">
|
||||
<label for="cycle-Last">Last</label>
|
||||
<ul>
|
||||
<li>
|
||||
<a href = {{ request.path|timeurl:"lastweek" }}>
|
||||
Week
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href = {{ request.path|timeurl:"lastmonth" }}>
|
||||
Month
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<p> </p>
|
||||
|
||||
{% if user|team_members %}
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li class="has-children" id="athletes">
|
||||
<input type="checkbox" name="athlete-selector" id="athlete-selector">
|
||||
<label for="athlete-selector"><i class="fas fa-users fa-fw"></i> Athletes</label>
|
||||
<ul>
|
||||
{% for member in user|team_members %}
|
||||
<a href={{ request.path|userurl:member }}?when={{ timeperiod }}>
|
||||
<i class="fas fa-user fa-fw"></i>
|
||||
{% if member == rower.user %}
|
||||
•
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
{{ member.first_name }} {{ member.last_name }}
|
||||
</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
@@ -1,19 +1,55 @@
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
<h1>Profile</h1>
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li id="manage-account">
|
||||
<a href="">
|
||||
<i class="fas fa-user fa-fw"></i> Account
|
||||
<li id="manage-prefs">
|
||||
<a href="/rowers/me/preferences/">
|
||||
<i class="fas fa-cog fa-fw"></i> Zones
|
||||
</a>
|
||||
</li>
|
||||
<li id="manage-impex">
|
||||
<a href="">
|
||||
<a href="/rowers/me/exportsettings/">
|
||||
<i class="fas fa-cloud-download fa-fw"></i> Import/Export
|
||||
</a>
|
||||
</li>
|
||||
<li id="manage-prefs">
|
||||
<a href="">
|
||||
<i class="fas fa-cog fa-fw"></i> Preferences
|
||||
<li id="manage-account">
|
||||
<a href="/rowers/me/edit/">
|
||||
<i class="fas fa-user fa-fw"></i> Account
|
||||
</a>
|
||||
</li>
|
||||
<li id="manage-favs">
|
||||
<a href="/rowers/me/favoritecharts/">
|
||||
<i class="fas fa-chart-area fa-fw"></i> Favorite Charts
|
||||
</a>
|
||||
</li>
|
||||
<li id="manage-workflow">
|
||||
<a href="/rowers/me/workflowconfig2/">
|
||||
<i class="fas fa-tachometer-alt-slow fa-fw"></i> Manage Workflow
|
||||
</a>
|
||||
</li>
|
||||
</ul><!-- cd-accordion-menu -->
|
||||
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<p> </p>
|
||||
{% if user|team_members %}
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li class="has-children" id="athletes">
|
||||
<input type="checkbox" name="athlete-selector" id="athlete-selector">
|
||||
<label for="athlete-selector"><i class="fas fa-users fa-fw"></i> Athletes</label>
|
||||
<ul>
|
||||
{% for member in user|team_members %}
|
||||
<a href={{ request.path|userurl:member }}>
|
||||
<i class="fas fa-user fa-fw"></i>
|
||||
{% if member == rower.user %}
|
||||
•
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
{{ member.first_name }} {{ member.last_name }}
|
||||
</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
@@ -1,18 +1,56 @@
|
||||
<h1>Racing</h1>
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li id="races-list">
|
||||
<a href="#0">
|
||||
<a href="/rowers/virtualevents">
|
||||
<i class="fas fa-flag-checkered fa-fw"></i> Races
|
||||
</a>
|
||||
</li>
|
||||
<li id="races-new">
|
||||
<a href="#0">
|
||||
<a href="/rowers/virtualevent/create">
|
||||
<i class="far fa-flag fa-fw"></i> New Race
|
||||
</a>
|
||||
</li>
|
||||
<li id="courses">
|
||||
<a href="#0">
|
||||
<a href="/rowers/list-courses">
|
||||
<i class="fas fa-map-marked fa-fw"></i> Courses
|
||||
</a>
|
||||
</li>
|
||||
</li>
|
||||
{% if course %}
|
||||
<li class="has-children" id="course">
|
||||
<input type="checkbox" name="group-course" id="group-course" checked>
|
||||
<label for="group-course"><i class="fas fa-map-marked fa-fw"></i> {{ course.name }}</label>
|
||||
<ul>
|
||||
<li id="course-view">
|
||||
<a href="/rowers/courses/{{ course.id }}">
|
||||
<i class="fas fa-search fa-fw"></i> View
|
||||
</a>
|
||||
</li>
|
||||
<li id="course-mapview">
|
||||
<a href="/rowers/courses/{{ course.id }}/map">
|
||||
<i class="fas fa-map fa-fw"></i> Map View
|
||||
</a>
|
||||
</li>
|
||||
{% if course.manager == rower %}
|
||||
<li id="course-emailkml">
|
||||
<a href="/rowers/courses/{{ course.id }}/emailkml">
|
||||
<i class="fas fa-envelope fa-fw"></i> Export as KML</a>
|
||||
</li>
|
||||
<li id="course-editview">
|
||||
<a href="/rowers/courses/{{ course.id }}/edit">
|
||||
<i class="fas fa-pencil-alt fa-fw"></i> Edit</a>
|
||||
</li>
|
||||
{% if nosessions %}
|
||||
<li id="course-deleteview">
|
||||
<a href="/rowers/courses/{{ course.id }}/delete">
|
||||
<i class="fas fa-trash-alt fa-fw"></i> Delete</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li id="course-view">
|
||||
<a href="/rowers/courses/{{ course.id }}/replace">
|
||||
<i class="fas fa-map-marked-alt fa-fw"></i> Update Markers</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul> <!-- cd-accordion-menu -->
|
||||
|
||||
@@ -1,24 +1,94 @@
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
<h1>Teams</h1>
|
||||
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li id="manage">
|
||||
<a href="">
|
||||
<i class="fas fa-cog fa-fw"></i> Manage
|
||||
<a href="/rowers/me/teams">
|
||||
<i class="fas fa-cog fa-fw"></i> Overview
|
||||
</a>
|
||||
</li>
|
||||
{% if teams %}
|
||||
<li class="has-children" id="teams">
|
||||
<input type="checkbox" name="group-teams" id="group-teams">
|
||||
<label for="group-teams">Teams</label>
|
||||
<ul>
|
||||
{% for team in teams %}
|
||||
<li id="team-{{ team.id }}">
|
||||
<a href="">
|
||||
<i class="fas fa-user-friends fa-fw"></i> {{ team.name }}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% if user|is_manager %}
|
||||
<li id="create">
|
||||
<a href="/rowers/team/create">
|
||||
<i class="fas fa-plus fa-fw"></i> New Team
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul><!-- cd-accordion-menu -->
|
||||
|
||||
|
||||
{% if myteams %}
|
||||
<h2>Managing</h2>
|
||||
<ul class="cd-accordion-menu animated">
|
||||
{% for team in myteams %}
|
||||
<li class="has-children" id="team-{{ team.id }}">
|
||||
<input type="checkbox" name="group-team-{{ team.id }}" id="group-team-{{ team.id }}">
|
||||
<label for="group-team-{{ team.id }}">{{ team.name }}</label>
|
||||
<ul>
|
||||
<li id="team-{{ team.id }}-view">
|
||||
<a href="/rowers/team/{{ team.id }}">
|
||||
<i class="fas fa-user-friends fa-fw"></i> View
|
||||
</a>
|
||||
</li>
|
||||
<li id="team-{{ team.id }}-edit">
|
||||
<a href="/rowers/team/{{ team.id }}/edit">
|
||||
<i class="fas fa-user-friends fa-fw"></i> Edit
|
||||
</a>
|
||||
</li>
|
||||
<li id="team-{{ team.id }}-stats">
|
||||
<a href="/rowers/team/{{ team.id }}/memberstats">
|
||||
<i class="fas fa-pencil-alt fa-fw"></i> Member Stats
|
||||
</a>
|
||||
</li>
|
||||
<li id="team-{{ team.id }}-workouts">
|
||||
<a href="/rowers/list-workouts/team/{{ team.id }}/">
|
||||
<i class="fas fa-clipboard-list fa-fw"></i> Member Workouts
|
||||
</a>
|
||||
</li>
|
||||
<li id="team-{{ team.id }}-leave">
|
||||
<a href="/rowers/team/{{ team.id }}/leaveconfirm">
|
||||
<i class="fas fa-sign-out fa-fw"></i> Leave
|
||||
</a>
|
||||
</li>
|
||||
<li id="team-{{ team.id }}-delete">
|
||||
<a href="/rowers/team/{{ team.id }}/deleteconfirm">
|
||||
<i class="fas fa-trash fa-fw"></i> Delete
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% if memberteams %}
|
||||
<h2>Member</h2>
|
||||
<ul class="cd-accordion-menu animated">
|
||||
{% for team in memberteams %}
|
||||
<li class="has-children" id="team-{{ team.id }}">
|
||||
<input type="checkbox" name="group-team-{{ team.id }}" id="group-team-{{ team.id }}">
|
||||
<label for="group-team-{{ team.id }}">{{ team.name }}</label>
|
||||
<ul>
|
||||
<li id="team-{{ team.id }}-view">
|
||||
<a href="/rowers/team/{{ team.id }}">
|
||||
<i class="fas fa-user-friends fa-fw"></i> View
|
||||
</a>
|
||||
</li>
|
||||
<li id="team-{{ team.id }}-workouts">
|
||||
<a href="/rowers/list-workouts/team/{{ team.id }}/">
|
||||
<i class="fas fa-clipboard-list fa-fw"></i> Member Workouts
|
||||
</a>
|
||||
</li>
|
||||
<li id="team-{{ team.id }}-leave">
|
||||
<a href="/rowers/team/{{ team.id }}/leaveconfirm">
|
||||
<i class="fas fa-sign-out fa-fw"></i> Leave
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{% load rowerfilters %}
|
||||
<h1>Workout</h1>
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li class="has-children" id="workout">
|
||||
@@ -5,81 +6,231 @@
|
||||
<label for="group-workout">Workout</label>
|
||||
<ul>
|
||||
<li id="workout-dashboard">
|
||||
<a href="">
|
||||
{% if user.is_authenticated and workout|may_edit:request %}
|
||||
<a href="/rowers/workout/{{ workout.id }}/workflow">
|
||||
<i class="fas fa-tachometer-alt fa-fw"></i> View
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="/rowers/workout/{{ workout.id }}/workflow">
|
||||
<i class="fas fa-tachometer-alt fa-fw"></i> View
|
||||
</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% if user.is_authenticated and workout|may_edit:request %}
|
||||
<li id="workout-edit">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/edit">
|
||||
<i class="fas fa-pencil-alt fa-fw"></i> Edit
|
||||
</a>
|
||||
</li>
|
||||
<li id="workout-intervals">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/editintervals">
|
||||
<i class="fas fa-pause fa-fw"></i> Intervals
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if user.is_authenticated %}
|
||||
<li id="workout-comments">
|
||||
<a href="/rowers/workout/{{ workout.id }}/comment">
|
||||
<i class="fas fa-comments fa-fw"></i> Comments
|
||||
({{ workout|aantalcomments }})
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li id="workout-stats">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/stats">
|
||||
<i class="fal fa-table fa-fw"></i> Statistics
|
||||
</a>
|
||||
</li>
|
||||
<li id="compare">
|
||||
<a href="#0">
|
||||
<a href="/rowers/multi-compare">
|
||||
<i class="fas fa-balance-scale fa-fw"></i> Compare
|
||||
</a>
|
||||
</li>
|
||||
</li>
|
||||
{% if user.is_authenticated and workout|may_edit:request %}
|
||||
<li id="workout-delete">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/delete">
|
||||
<i class="fas fa-trash-alt fa-fw"></i> Delete
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</li>
|
||||
<li class="has-children" id="flexchart">
|
||||
<input type="checkbox" name="group-flexchart" id="group-flexchart">
|
||||
<label for="group-flexchart">Interactive Charts</label>
|
||||
<ul>
|
||||
<li id="chart-flexchart">
|
||||
<a href="/rowers/workout/{{ workout.id }}/flexchart">
|
||||
<i class="fas fa-chart-line fa-fw"></i> Flex Chart
|
||||
</a>
|
||||
</li>
|
||||
{% if workout|water %}
|
||||
<li id="chart-map">
|
||||
<a href="/rowers/workout/{{ workout.id }}/map">
|
||||
<i class="fas fa-map-marked-alt fa-fw"></i> Map
|
||||
</a>
|
||||
</li>
|
||||
<li id="chart-empower">
|
||||
<a href="/rowers/workout/{{ workout.id }}/forcecurve">
|
||||
<i class="fas fa-dumbbell fa-fw"></i> Force Curve
|
||||
</a>
|
||||
</li>
|
||||
<li id="chart-otwpower">
|
||||
<a href="/rowers/workout/{{ workout.id }}/interactiveotwplot">
|
||||
<i class="fal fa-calculator-alt fa-fw"></i> OTW Power
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</li>
|
||||
{% if user.is_authenticated and workout|may_edit:request %}
|
||||
<li class="has-children" id="chart">
|
||||
<input type="checkbox" name="group-chart" id="group-chart">
|
||||
<label for="group-chart">Charts</label>
|
||||
<label for="group-chart">Static Charts</label>
|
||||
<ul>
|
||||
<li id="chart-time">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/addstatic/1">
|
||||
<i class="fas fa-stopwatch fa-fw"></i> Time
|
||||
</a>
|
||||
</li>
|
||||
<li id="chart-distance">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/addstatic/2">
|
||||
<i class="fas fa-ruler fa-fw"></i> Distance
|
||||
</a>
|
||||
</li>
|
||||
<li id="chart-powerpie">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/addstatic/13">
|
||||
<i class="far fa-chart-pie fa-fw"></i> Power (Pie)
|
||||
</a>
|
||||
</li>
|
||||
</li>
|
||||
<li id="chart-hrpie">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/addstatic/3">
|
||||
<i class="fas fa-heartbeat fa-fw"></i> Heart Rate (Pie)
|
||||
</a>
|
||||
</li>
|
||||
{% if workout|water %}
|
||||
<li id="chart-otwpower">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/addstatic/9">
|
||||
<i class="fas fa-chart-area fa-fw"></i> OTW Power
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li id="chart-image">
|
||||
<a href="/rowers/workout/{{ workout.id }}/image">
|
||||
<i class="fas fa-file-image fa-fw"></i> Upload Image
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="has-children" id="export">
|
||||
<input type="checkbox" name="group-export" id="group-export">
|
||||
<label for="group-export">Export</label>
|
||||
<ul>
|
||||
<li id="export-c2"><a href="">Concept2</a></li>
|
||||
<li id="export-strava"><a href="">Strava</a></li>
|
||||
<li id="export-st"><a href="">SportTracks</a></li>
|
||||
<li id="export-rk"><a href="">Runkeeper</a></li>
|
||||
<li id="export-mmf"><a href="">MapMyFitness</a></li>
|
||||
<li id="export-tp"><a href="">TrainingPeaks</a></li>
|
||||
<li id="export-csv"><a href="">CSV</a></li>
|
||||
<li id="export-gpx"><a href="">GPX</a></li>
|
||||
<li id="export-tcx"><a href="">TCX</a></li>
|
||||
<li id="export-c2">
|
||||
{% if workout.uploadedtoc2 %}
|
||||
<a href="http://log.concept2.com/profile/{{ user|c2userid }}/log/{{ workout.uploadedtoc2 }}">
|
||||
Concept2 <i class="fas fa-check"></i>
|
||||
</a>
|
||||
{% elif user.rower.c2token == None or user.rower.c2token == '' %}
|
||||
<a href="/rowers/me/c2authorize">
|
||||
Connect to Concept2
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="/rowers/workout/{{ workout.id }}/c2uploadw">
|
||||
Concept2
|
||||
</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li id="export-strava">
|
||||
{% if workout.uploadedtostrava %}
|
||||
<a href="https://www.strava.com/activities/{{ workout.uploadedtostrava }}">
|
||||
Strava <i class="fas fa-check"></i>
|
||||
</a>
|
||||
{% elif user.rower.stravatoken == None or user.rower.stravatoken == '' %}
|
||||
<a href="/rowers/me/stravaauthorize">
|
||||
Connect to Strava
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="/rowers/workout/{{ workout.id }}/stravauploadw">
|
||||
Strava
|
||||
</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li id="export-st">
|
||||
{% if workout.uploadedtosporttracks %}
|
||||
<a href="https://sporttracks.mobi/activity/{{ workout.uploadedtosporttracks }}">
|
||||
SportTracks <i class="fas fa-check"></i>
|
||||
</a>
|
||||
{% elif user.rower.sporttrackstoken == None or user.rower.sporttrackstoken == '' %}
|
||||
<a href="/rowers/me/sporttracksauthorize">
|
||||
Connect to SportTracks
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="/rowers/workout/{{ workout.id }}/sporttracksuploadw">
|
||||
SportTracks
|
||||
</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li id="export-rk">
|
||||
{% if workout.uploadedtorunkeeper %}
|
||||
<a href="https://runkeeper.com/user/{{ user|rkuserid }}/activity/{{ workout.uploadedtorunkeeper }}">
|
||||
Runkeeper <i class="fas fa-check"></i>
|
||||
</a>
|
||||
{% elif user.rower.runkeepertoken == None or user.rower.runkeepertoken == '' %}
|
||||
<a href="/rowers/me/runkeeperauthorize">
|
||||
Connect to Runkeeper
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="/rowers/workout/{{ workout.id }}/runkeeperuploadw">
|
||||
Runkeeper
|
||||
</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li id="export-mmf">
|
||||
{% if workout.uploadedtounderarmour %}
|
||||
<a href="https://www.mapmyfitness.com/workout/{{ workout.uploadedtounderarmour }}">
|
||||
MapMyFitness <i class="fas fa-check"></i>
|
||||
</a>
|
||||
{% elif user.rower.underarmourtoken == None or user.rower.underarmourtoken == '' %}
|
||||
<a href="/rowers/me/underarmourauthorize">
|
||||
Connect to MapMyFitness
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="/rowers/workout/{{ workout.id }}/underarmouruploadw">
|
||||
MapMyFitness
|
||||
</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li id="export-tp">
|
||||
{% if workout.uploadedtotp %}
|
||||
<a href="https://app.trainingpeaks.com">
|
||||
TrainingPeaks <i class="fas fa-check"></i>
|
||||
</a>
|
||||
{% elif user.rower.tptoken == None or user.rower.tptoken == '' %}
|
||||
<a href="/rowers/me/tpauthorize">
|
||||
Connect to TrainingPeaks
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="/rowers/workout/{{ workout.id }}/tpuploadw">
|
||||
TrainingPeaks
|
||||
</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li id="export-csv">
|
||||
<a href="/rowers/workout/{{ workout.id }}/emailcsv">
|
||||
CSV
|
||||
</a>
|
||||
</li>
|
||||
<li id="export-gpx">
|
||||
<a href="/rowers/workout/{{ workout.id }}/emailgpx">
|
||||
GPX
|
||||
</a>
|
||||
</li>
|
||||
<li id="export-tcx">
|
||||
<a href="/rowers/workout/{{ workout.id }}/emailtcx">
|
||||
TCX
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="has-children" id="data">
|
||||
@@ -87,22 +238,22 @@
|
||||
<label for="group-data">Data</label>
|
||||
<ul>
|
||||
<li id="data-smoothen">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/smoothenpace">
|
||||
<i class="fas fa-magic fa-fw"></i> Smoothen
|
||||
</a>
|
||||
</li>
|
||||
<li id="data-raw">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/undosmoothenpace">
|
||||
<i class="fas fa-undo fa-fw"></i> Restore Raw
|
||||
</a>
|
||||
</li>
|
||||
<li id="data-fusion">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/fusion/{{ workout.id }}/">
|
||||
<i class="fas fa-blender fa-fw"></i> Sensor Fusion
|
||||
</a>
|
||||
</li>
|
||||
<li id="data-split">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/split">
|
||||
<i class="fas fa-cut fa-fw"></i> Split Workout
|
||||
</a>
|
||||
</li>
|
||||
@@ -112,24 +263,27 @@
|
||||
<input type="checkbox" name="group-advanced" id="group-advanced">
|
||||
<label for="group-advanced">Advanced</label>
|
||||
<ul>
|
||||
{% if workout|water %}
|
||||
<li id="advanced-wind">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/wind">
|
||||
<i class="fas fa-pennant fa-fw"></i> Wind
|
||||
</a>
|
||||
</li>
|
||||
<li id="advanced-stream">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/stream">
|
||||
<i class="fas fa-stream fa-fw"></i> Stream
|
||||
</a>
|
||||
</li>
|
||||
<li id="advanced-otwpower">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/otwsetpower">
|
||||
<i class="fas fa-calculator-alt fa-fw"></i> OTW Power
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li id="advanced-instroke">
|
||||
<a href="">
|
||||
<a href="/rowers/workout/{{ workout.id }}/instroke">
|
||||
<i class="fas fa-search-plus fa-fw"></i> In-Stroke Metrics</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul><!-- cd-accordion-menu -->
|
||||
|
||||
@@ -1,28 +1,63 @@
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
<h1>Workouts</h1>
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li id="workouts-list">
|
||||
<a href="#0"><i class="fas fa-clipboard-list fa-fw"></i> Workouts List</a>
|
||||
<a href="/rowers/list-workouts"><i class="fas fa-clipboard-list fa-fw"></i> Workouts List</a>
|
||||
</li>
|
||||
<li id="charts">
|
||||
<a href="#0"><i class="fas fa-chart-pie fa-fw"></i> Charts</a>
|
||||
<a href="/rowers/list-graphs"><i class="fas fa-chart-pie fa-fw"></i> Charts</a>
|
||||
</li>
|
||||
<li id="compare">
|
||||
<a href="#0"><i class="fas fa-balance-scale fa-fw"></i> Compare</a>
|
||||
<a href="/rowers/team-compare-select/team/0/"><i class="fas fa-balance-scale fa-fw"></i> Compare</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#0"><i class="fas fa-file-upload fa-fw"></i> Upload</a>
|
||||
<a href="/rowers/workout/upload/"><i class="fas fa-file-upload fa-fw"></i> Upload</a>
|
||||
</li>
|
||||
<li>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/workouts-join-select">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">Glue Workouts</a>
|
||||
{% endif %}
|
||||
<i class="fas fa-layer-plus fa-fw"></i> Glue Workouts
|
||||
</a>
|
||||
</li>
|
||||
<li class="has-children" id="imports">
|
||||
<input type="checkbox" name ="group-1" id="group-1">
|
||||
<label for="group-1"><i class="fas fa-cloud-download fa-fw"></i> Import</label>
|
||||
|
||||
<ul>
|
||||
<li id="concept2"><a href="#0">Concept2</a></li>
|
||||
<li id="strava"><a href="#0">Strava</a></li>
|
||||
<li id="runkeeper"><a href="#0">RunKeeper</a></li>
|
||||
<li id="sporttracks"><a href="#0">SportTracks</a></li>
|
||||
<li id="mapmyfitness"><a href="#0">MapMyFitness</a></li>
|
||||
<li id="polar"><a href="#0">Polar</a></li>
|
||||
<li id="concept2"><a href="/rowers/workout/c2list">Concept2</a></li>
|
||||
<li id="strava"><a href="/rowers/workout/stravaimport">Strava</a></li>
|
||||
<li id="runkeeper"><a href="/rowers/workout/runkeeperimport">RunKeeper</a></li>
|
||||
<li id="sporttracks"><a href="/rowers/workout/sporttracksimport">SportTracks</a></li>
|
||||
<li id="mapmyfitness"><a href="/rowers/workout/underarmourimport">MapMyFitness</a></li>
|
||||
<li id="polar"><a href="/rowers/workout/polarimport">Polar</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul> <!-- cd-accordion-menu -->
|
||||
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<p> </p>
|
||||
{% if user|team_members %|
|
||||
<ul class="cd-accordion-menu animated">
|
||||
<li class="has-children" id="athletes">
|
||||
<input type="checkbox" name="athlete-selector" id="athlete-selector">
|
||||
<label for="athlete-selector"><i class="fas fa-users fa-fw"></i> Athletes</label>
|
||||
<ul>
|
||||
{% for member in user|team_members %}
|
||||
<a href={{ request.path|userurl:member }}>
|
||||
<i class="fas fa-user fa-fw"></i>
|
||||
{% if member == rower.user %}
|
||||
•
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
{{ member.first_name }} {{ member.last_name }}
|
||||
</a>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}View Comparison {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
@@ -13,58 +13,31 @@
|
||||
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, false, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<h1>Interactive Comparison</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
|
||||
<div>
|
||||
{{ the_div|safe }}
|
||||
</div>
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
<form enctype="multipart/form-data" action="/rowers/multi-compare" method="post">
|
||||
{% csrf_token %}
|
||||
<table>
|
||||
{{ chartform.as_table }}
|
||||
</table>
|
||||
|
||||
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
{% include "teambuttons.html" with teamid=teamid team=team %}
|
||||
</div>
|
||||
<div class="grid_12">
|
||||
<div id="workouts" class="grid_8 alpha">
|
||||
<h1>Interactive Comparison</h1>
|
||||
</div>
|
||||
<div class="grid_4 omega">
|
||||
<form enctype="multipart/form-data" action="/rowers/multi-compare" method="post">
|
||||
{% csrf_token %}
|
||||
<table>
|
||||
{{ chartform.as_table }}
|
||||
</table>
|
||||
<div class="grid_1 prefix_2 suffix_1">
|
||||
<p>
|
||||
<input name='workoutselectform' class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
|
||||
|
||||
|
||||
<div id="theplot" class="grid_12 alpha flexplot">
|
||||
{{ the_div|safe }}
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workouts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}View Comparison {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
@@ -15,58 +15,37 @@
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, false, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<h1>Trend Flex Chart</h1>
|
||||
<div id="workouts" class="grid_8 alpha">
|
||||
<div id="id_chart" class="grid_8 alpha flexplot">
|
||||
<h1>Trend Flex Chart</h1>
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
|
||||
<div id="id_chart" class="flexplot">
|
||||
{{ the_div|safe }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_4 omega">
|
||||
<div class="grid_4">
|
||||
<form enctype="multipart/form-data" action="/rowers/user-multiflex/{{ userid }}" method="post">
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<form enctype="multipart/form-data" action="/rowers/user-multiflex/user/{{ userid }}" method="post">
|
||||
{% csrf_token %}
|
||||
<table>
|
||||
{{ chartform.as_table }}
|
||||
</table>
|
||||
<div class="grid_1 prefix_2 suffix_1">
|
||||
<p>
|
||||
<input name='workoutselectform' class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
<input name='workoutselectform' class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
<div class="grid_4">
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>
|
||||
You can use the form above to change the metric or filter the data.
|
||||
You can use the form to change the metric or filter the data.
|
||||
Set Min SPM and Max SPM to select only strokes in a certain range of
|
||||
stroke rates.
|
||||
Set Work per Stroke to a minimum value to remove "paddle" strokes or turns.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
@@ -93,3 +72,7 @@
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -8,175 +8,109 @@
|
||||
|
||||
{% block title %}Workouts{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{{ interactiveplot |safe }}
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, true, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
{% if theuser %}
|
||||
<h1>{{ theuser.first_name }}'s Ranking Pieces</h1>
|
||||
{% else %}
|
||||
<h1>{{ user.first_name }}'s Ranking Pieces</h1>
|
||||
{% endif %}
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<p>Summary for {{ theuser.first_name }} {{ theuser.last_name }}
|
||||
between {{ startdate|date }} and {{ enddate|date }}</p>
|
||||
|
||||
<div id="title" class="grid_12 alpha">
|
||||
<div class="grid_10 alpha">
|
||||
{% if theuser %}
|
||||
<h3>{{ theuser.first_name }}'s Ranking Pieces</h3>
|
||||
{% else %}
|
||||
<h3>{{ user.first_name }}'s Ranking Pieces</h3>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 alpha dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ theuser.first_name }} {{ theuser.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_members %}
|
||||
{% if workouttype == 'water' %}
|
||||
<a class="button green small" href="/rowers/{{ member.id }}/otw-bests/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">{{ member.first_name }} {{ member.last_name }}</a>
|
||||
{% else %}
|
||||
<a class="button green small" href="/rowers/{{ member.id }}/ote-ranking/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">{{ member.first_name }} {{ member.last_name }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<p>The table gives the efforts you marked as Ranking Piece.
|
||||
The graph shows the best segments from those pieces, plotted as
|
||||
average power (over the segment) vs the duration of the segment/
|
||||
In other words: How long you can hold that power.
|
||||
</p>
|
||||
|
||||
<div id="summary" class="grid_6 alpha">
|
||||
<p>Summary for {{ theuser.first_name }} {{ theuser.last_name }}
|
||||
between {{ startdate|date }} and {{ enddate|date }}</p>
|
||||
<p>Whenever you load or reload the page, a new calculation is started
|
||||
as a background process. The page will reload automatically when the
|
||||
calculation is ready.
|
||||
</p>
|
||||
|
||||
<p>Direct link for other users:
|
||||
{% if workouttype == 'water' %}
|
||||
<a href="/rowers/{{ id }}/otw-bests/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">https://rowsandall.com/rowers/{{ id }}/otw-bests/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}</a>
|
||||
{% else %}
|
||||
<a href="/rowers/{{ id }}/ote-ranking/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">https://rowsandall.com/rowers/{{ id }}/ote-ranking/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p>At the bottom of the page, you will find predictions derived from the model.</p>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>Use this form to select a different date range:</p>
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
|
||||
<p>The table gives the efforts you marked as Ranking Piece.
|
||||
The graph shows the best segments from those pieces, plotted as
|
||||
average power (over the segment) vs the duration of the segment/
|
||||
In other words: How long you can hold that power.
|
||||
</p>
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input name='daterange' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
|
||||
<p>Whenever you load or reload the page, a new calculation is started
|
||||
as a background process. The page will reload automatically when
|
||||
calculation is ready.</p>
|
||||
<p>At the bottom of the page, you will find predictions derived from the model.</p>
|
||||
</div>
|
||||
<div id="form" class="grid_6 omega">
|
||||
<p>Use this form to select a different date range:</p>
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
<div class="grid_4 alpha">
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name='daterange' class="button green" type="submit" value="Submit"> </form>
|
||||
</div>
|
||||
<div class="grid_4 alpha">
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
Or use the last {{ deltaform }} days.
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% csrf_token %}
|
||||
<input name='datedelta' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="theplot" class="grid_12 alpha">
|
||||
|
||||
<h2>Critical Power Plot</h2>
|
||||
<h2>Critical Power Plot</h2>
|
||||
|
||||
{{ the_div|safe }}
|
||||
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<li class="grid_2">
|
||||
|
||||
<h2>Ranking Piece Results</h2>
|
||||
<h2>Ranking Piece Results</h2>
|
||||
|
||||
{% if rankingworkouts %}
|
||||
{% if rankingworkouts %}
|
||||
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
<table width="100%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Distance</th>
|
||||
<th> Duration</th>
|
||||
<th> Avg Power</th>
|
||||
<th> Date</th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
<th> Edit</th>
|
||||
<th> Distance</th>
|
||||
<th> Duration</th>
|
||||
<th> Avg Power</th>
|
||||
<th> Date</th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
<th> Edit</th>
|
||||
<tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for workout in rankingworkouts %}
|
||||
<tr>
|
||||
<td> {{ workout.distance }} m</td>
|
||||
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ avgpower|lookup:workout.id }} W</td>
|
||||
<td> {{ workout.date }} </td>
|
||||
<td> {{ workout.averagehr }} </td>
|
||||
<td> {{ workout.maxhr }} </td>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}/edit">{{ workout.name }}</a> </td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td> {{ workout.distance }} m</td>
|
||||
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ avgpower|lookup:workout.id }} W</td>
|
||||
<td> {{ workout.date }} </td>
|
||||
<td> {{ workout.averagehr }} </td>
|
||||
<td> {{ workout.maxhr }} </td>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}/edit">{{ workout.name }}</a> </td>
|
||||
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p> No ranking workouts found </p>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p> No ranking workouts found </p>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<div id="predictions" class="grid_12 alpha">
|
||||
<h2>Pace predictions for Ranking Pieces</h2>
|
||||
<li class="grid_2">
|
||||
<h2>Pace predictions for Ranking Pieces</h2>
|
||||
|
||||
<p>Add non-ranking piece using the form. The piece will be added in the prediction tables below. </p>
|
||||
<p>Add non-ranking piece using the form. The piece will be added in the prediction tables below. </p>
|
||||
|
||||
|
||||
|
||||
<div id="cpmodel" class="grid_6 alpha">
|
||||
<table width="90%" class="listtable">
|
||||
<table width="100%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Duration</th>
|
||||
@@ -208,25 +142,25 @@
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<div class="grid_3">
|
||||
<li class="grid_2">
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{{ form.value }} {{ form.pieceunit }}
|
||||
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
minutes
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name="piece" class="button green"
|
||||
action=""
|
||||
type="submit" value="Add">
|
||||
</form>
|
||||
</div>
|
||||
<input name="piece" class="button green"
|
||||
action=""
|
||||
type="submit" value="Add">
|
||||
</form>
|
||||
</li>
|
||||
|
||||
|
||||
</div>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,83 +1,50 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}View Workout {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, false, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
|
||||
<div id="workouts" class="grid_12 alpha">
|
||||
<h1>Interactive Plot</h1>
|
||||
|
||||
|
||||
<h1>Interactive Plot</h1>
|
||||
|
||||
{% if user.is_authenticated and mayedit %}
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced Edit</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/wind">Edit Wind Data</a>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/stream">Edit Stream Data</a>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/otwsetpower">OTW Power</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div id="theplot" class="grid_12 alpha flexplot">
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
|
||||
{{ the_div|safe }}
|
||||
</div>
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
<p>
|
||||
<h2>Notes</h2>
|
||||
<ul>
|
||||
<li>
|
||||
Is your erg pace slower than you expected? This may be a sign of room for improvement regarding your technique. An alternative explanation is that your team mates are fatter than they told you! For example, put 80.0 kg if your four consists of 2 70kg guys and 2 90kg guys.
|
||||
</li>
|
||||
<li>
|
||||
In order to speed up the calculation, we are running the calculation only for every 10th datapoint, using interpolation in between. Some very fine pace shifts may disappear.
|
||||
</li>
|
||||
<li>
|
||||
While the wind and stream correction is fairly reliable, the OTW to OTE conversion sometimes throws errors. Those data points are omitted and replaced by interpolated values. We are sorry if this messed up some of your plots.
|
||||
</li>
|
||||
<li>
|
||||
Read more details about the way we calculate things <a href="/rowers/physics">here</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
</li>
|
||||
|
||||
<div class="grid_12">
|
||||
<p>
|
||||
<h3>Notes</h3>
|
||||
<ul>
|
||||
<li>Is your erg pace slower than you expected? This may be a sign of room for improvement regarding your technique. An alternative explanation is that your team mates are fatter than they told you! For example, put 80.0 kg if your four consists of 2 70kg guys and 2 90kg guys.</li>
|
||||
<li>In order to speed up the calculation, we are running the calculation only for every 10th datapoint, using interpolation in between. Some very fine pace shifts may disappear.</li>
|
||||
<li>While the wind and stream correction is fairly reliable, the OTW to OTE conversion sometimes throws errors. Those data points are omitted and replaced by interpolated values. We are sorry if this messed up some of your plots.</li>
|
||||
<li>Read more details about the way we calculate things <a href="/rowers/physics"</a>here</a>.</li>
|
||||
</ul>
|
||||
</p>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% endblock %}
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -8,175 +8,111 @@
|
||||
|
||||
{% block title %}Workouts{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, true, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
|
||||
<div id="title" class="grid_12 alpha">
|
||||
<div class="grid_10 alpha">
|
||||
{% if theuser %}
|
||||
<h3>{{ theuser.first_name }}'s Ranking Pieces</h3>
|
||||
{% else %}
|
||||
<h3>{{ user.first_name }}'s Ranking Pieces</h3>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 alpha dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ theuser.first_name }} {{ theuser.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_members %}
|
||||
{% if workouttype == 'water' %}
|
||||
<a class="button green small" href="/rowers/{{ member.id }}/otw-bests/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">{{ member.first_name }} {{ member.last_name }}</a>
|
||||
{% else %}
|
||||
<a class="button green small" href="/rowers/{{ member.id }}/ote-ranking/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">{{ member.first_name }} {{ member.last_name }}</a>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% if theuser %}
|
||||
<h1>{{ theuser.first_name }}'s Ranking Pieces</h1>
|
||||
{% else %}
|
||||
<h1>{{ user.first_name }}'s Ranking Pieces</h1>
|
||||
{% endif %}
|
||||
|
||||
<div id="summary" class="grid_6 alpha">
|
||||
<p>Summary for {{ theuser.first_name }} {{ theuser.last_name }}
|
||||
between {{ startdate|date }} and {{ enddate|date }}</p>
|
||||
<ul class="main-content">
|
||||
|
||||
<p>Direct link for other users:
|
||||
{% if workouttype == 'water' %}
|
||||
<a href="/rowers/{{ id }}/otw-bests/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">https://rowsandall.com/rowers/{{ id }}/otw-bests/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}</a>
|
||||
{% else %}
|
||||
<a href="/rowers/{{ id }}/ote-ranking/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">https://rowsandall.com/rowers/{{ id }}/ote-ranking/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
<li class="grid_2">
|
||||
<p>Summary for {{ theuser.first_name }} {{ theuser.last_name }}
|
||||
between {{ startdate|date }} and {{ enddate|date }}</p>
|
||||
|
||||
<p>The table gives the efforts you marked as Ranking Piece.
|
||||
The graph shows the best segments from those pieces, plotted as
|
||||
average power (over the segment) vs the duration of the segment/
|
||||
In other words: How long you can hold that power.
|
||||
</p>
|
||||
<p>The table gives the efforts you marked as Ranking Piece.
|
||||
The graph shows the best segments from those pieces, plotted as
|
||||
average power (over the segment) vs the duration of the segment/
|
||||
In other words: How long you can hold that power.
|
||||
</p>
|
||||
|
||||
<p>When you change the date range, the algorithm calculates new
|
||||
parameters in a background process. You may have to reload the
|
||||
page to get an updated prediction.</p>
|
||||
<p>At the bottom of the page, you will find predictions derived from the model.</p>
|
||||
</div>
|
||||
<div id="form" class="grid_6 omega">
|
||||
<p>Use this form to select a different date range:</p>
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
<div class="grid_4 alpha">
|
||||
<p>When you change the date range, the algorithm calculates new
|
||||
parameters in a background process. You may have to reload the
|
||||
page to get an updated prediction.</p>
|
||||
<p>At the bottom of the page, you will find predictions derived from the model.</p>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>Use this form to select a different date range:</p>
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name='daterange' class="button green" type="submit" value="Submit"> </form>
|
||||
</div>
|
||||
<div class="grid_4 alpha">
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
Or use the last {{ deltaform }} days.
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% csrf_token %}
|
||||
<input name='datedelta' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input name='daterange' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
</li>
|
||||
|
||||
|
||||
<li class="grid_4">
|
||||
|
||||
<div id="theplot" class="grid_12 alpha">
|
||||
|
||||
<h2>Critical Power Plot</h2>
|
||||
|
||||
<h2>Critical Power Plot</h2>
|
||||
|
||||
{{ the_div|safe }}
|
||||
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<li class="grid_2">
|
||||
|
||||
<h2>Ranking Piece Results</h2>
|
||||
<h2>Ranking Piece Results</h2>
|
||||
|
||||
{% if rankingworkouts %}
|
||||
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
{% if rankingworkouts %}
|
||||
|
||||
<table width="100%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Distance</th>
|
||||
<th> Duration</th>
|
||||
<th> Avg Power</th>
|
||||
<th> Date</th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
<th> Edit</th>
|
||||
<th> Distance</th>
|
||||
<th> Duration</th>
|
||||
<th> Avg Power</th>
|
||||
<th> Date</th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
<th> Edit</th>
|
||||
<tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for workout in rankingworkouts %}
|
||||
<tr>
|
||||
<td> {{ workout.distance }} m</td>
|
||||
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ avgpower|lookup:workout.id }} W</td>
|
||||
<td> {{ workout.date }} </td>
|
||||
<td> {{ workout.averagehr }} </td>
|
||||
<td> {{ workout.maxhr }} </td>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}/edit">{{ workout.name }}</a> </td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td> {{ workout.distance }} m</td>
|
||||
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ avgpower|lookup:workout.id }} W</td>
|
||||
<td> {{ workout.date }} </td>
|
||||
<td> {{ workout.averagehr }} </td>
|
||||
<td> {{ workout.maxhr }} </td>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}/edit">{{ workout.name }}</a> </td>
|
||||
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p> No ranking workouts found </p>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p> No ranking workouts found </p>
|
||||
{% endif %}
|
||||
|
||||
</li>
|
||||
|
||||
</div>
|
||||
<li class="grid_2">
|
||||
<h2>Pace predictions for Ranking Pieces</h2>
|
||||
|
||||
<div id="predictions" class="grid_12 alpha">
|
||||
<h2>Pace predictions for Ranking Pieces</h2>
|
||||
<p>Add non-ranking piece using the form. The piece will be added in the prediction tables below. </p>
|
||||
|
||||
|
||||
|
||||
<p>Add non-ranking piece using the form. The piece will be added in the prediction tables below. </p>
|
||||
|
||||
|
||||
|
||||
<div id="cpmodel" class="grid_6 alpha">
|
||||
<table width="70%" class="listtable">
|
||||
<table width="100%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Duration</th>
|
||||
@@ -200,25 +136,24 @@
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="grid_3">
|
||||
</li>
|
||||
|
||||
<li class="grid_2">
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{{ form.value }} {{ form.pieceunit }}
|
||||
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
minutes
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name="piece" class="button green"
|
||||
action=""
|
||||
type="submit" value="Add">
|
||||
</form>
|
||||
</div>
|
||||
minutes
|
||||
<input name="piece" class="button green"
|
||||
action=""
|
||||
type="submit" value="Add">
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,75 +1,74 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Advanced Features {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div id="workouts" class="grid_6 alpha">
|
||||
{% block main %}
|
||||
|
||||
<h1>Run OTW Power Calculations</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
<p>
|
||||
For the advanced OTW power and wind correction calculation,
|
||||
we need to know the boat type and the average weight per crew member.
|
||||
Currently only 1x (single) is implemented. Setting the value to
|
||||
2x (double) will still run the calculations for a single.
|
||||
We use FISA minimum boat weight and standard rigging for our calculations.
|
||||
</p>
|
||||
|
||||
<h1>Run OTW Power Calculations</h1>
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/workflow">Workflow View</a>
|
||||
</p>
|
||||
<p>The Quick calculation option potentially speeds up the calculation,
|
||||
at the cost of a slight reduction in accuracy. It is recommended
|
||||
to keep this option selected.</p>
|
||||
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced Edit</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="grid_6 alpha">
|
||||
<p>
|
||||
For the advanced OTW power and wind correction calculation,
|
||||
we need to know the boat type and the average weight per crew member.
|
||||
Currently only 1x (single) is implemented. Setting the value to
|
||||
2x (double) will still run the calculations for a single.
|
||||
We use FISA minimum boat weight and standard rigging for our calculations.
|
||||
</p>
|
||||
|
||||
<p>The Quick calculation option potentially speeds up the calculation,
|
||||
at the cost of a slight reduction in accuracy. It is recommended
|
||||
to keep this option selected.</p>
|
||||
<p>
|
||||
The power calculations take wind and stream as inputs.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="/rowers/workout/{{ workout.id }}/wind">Set wind strength and direction</a>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="/rowers/workout/{{ workout.id }}/stream">
|
||||
Set river stream strength
|
||||
</a>
|
||||
</p>
|
||||
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div id="formbutton" class="grid_2 prefix_2 suffix_2 tooltip">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div id="formbutton" class="tooltip">
|
||||
<p><input class="button green" type="submit" value="Update & Run"></p>
|
||||
<span class="tooltiptext">Start the calculations to get power values for your row.</span>
|
||||
<span class="tooltiptext">Start the calculations to get power values for your row.</span>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="advancedplots" class="grid_6 omega">
|
||||
<div>
|
||||
<img src="/static/img/rivercurrent.jpg" width="400">
|
||||
</div>
|
||||
<div>
|
||||
The Rowsandall Physics Department at work.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<div>
|
||||
<img src="/static/img/rivercurrent.jpg" width="400">
|
||||
</div>
|
||||
<div>
|
||||
The Rowsandall Physics Department at work.
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,31 +1,29 @@
|
||||
{% load rowerfilters %}
|
||||
{% load tz %}
|
||||
<div class="grid_6 suffix_3 alpha">
|
||||
<table width=100%>
|
||||
<tr>
|
||||
{% localtime on %}
|
||||
<th>Date/Time:</th><td>{{ workout.startdatetime|localtime}}</td>
|
||||
{% endlocaltime %}
|
||||
</tr><tr>
|
||||
<th>Distance:</th><td>{{ workout.distance }}m</td>
|
||||
</tr><tr>
|
||||
<th>Duration:</th><td>{{ workout.duration |durationprint:"%H:%M:%S.%f" }}</td>
|
||||
</tr><tr>
|
||||
<th>Public link to this workout</th>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<th>Comments</th>
|
||||
<td>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<table width=100%>
|
||||
<tr>
|
||||
{% localtime on %}
|
||||
<th>Date/Time:</th><td>{{ workout.startdatetime|localtime}}</td>
|
||||
{% endlocaltime %}
|
||||
</tr><tr>
|
||||
<th>Distance:</th><td>{{ workout.distance }}m</td>
|
||||
</tr><tr>
|
||||
<th>Duration:</th><td>{{ workout.duration |durationprint:"%H:%M:%S.%f" }}</td>
|
||||
</tr><tr>
|
||||
<th>Public link to this workout</th>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<th>Comments</th>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}/comment">Comment ({{ aantalcomments }})</a>
|
||||
</td>
|
||||
|
||||
</tr><tr>
|
||||
<th>Public link to interactive chart</th>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}/interactiveplot">https://rowsandall.com/rowers/workout/{{ workout.id }}/interactiveplot</a>
|
||||
<td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
<div style="height:100%;" id="theplot" class="grid_9 alpha flexplot">
|
||||
{{ mapdiv|safe }}
|
||||
|
||||
|
||||
{{ mapscript|safe }}
|
||||
</div>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<div class="mapdiv">
|
||||
{{ mapdiv|safe }}
|
||||
|
||||
|
||||
{{ mapscript|safe }}
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
<div class="grid_9">
|
||||
<div class="grid_1 alpha">
|
||||
<p>
|
||||
<div class="fb-share-button" data-href="https://rowsandall.com/rowers/workout/{{ workout.id }}" data-layout="button" data-size="small" data-mobile-iframe="false">
|
||||
<a class="fb-xfbml-parse-ignore" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/workout/{{ workout.id }}">Share</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_1 suffix_7 omega">
|
||||
<a class="twitter-share-button"
|
||||
</p>
|
||||
<p>
|
||||
<a class="twitter-share-button"
|
||||
href="https://twitter.com/intent/tweet"
|
||||
data-url="https://rowsandall.com/rowers/workout/{{ workout.id }}"
|
||||
data-text="@rowsandall #rowingdata">Tweet</a>
|
||||
</div>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{% load rowerfilters %}
|
||||
{% load tz %}
|
||||
<div class="grid_6 suffix_3 alpha">
|
||||
<ul class="main-content">
|
||||
<li>
|
||||
<table width=100%>
|
||||
<tr>
|
||||
<th>Comments</th>
|
||||
@@ -10,4 +11,5 @@
|
||||
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
{% if statcharts %}
|
||||
<h2>Static Charts</h2>
|
||||
{% for graph in statcharts %}
|
||||
<div id="thumb-container" class="grid_3 alpha">
|
||||
<a href="/rowers/graph/{{ graph.id }}/">
|
||||
<img src="/{{ graph.filename }}"
|
||||
onerror="this.src='/static/img/rowingtimer.gif'"
|
||||
alt="{{ graph.filename }}" width="180" height="150"></a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<ul class="main-content">
|
||||
{% for graph in statcharts %}
|
||||
<li>
|
||||
<a href="/rowers/graph/{{ graph.id }}/">
|
||||
<img src="/{{ graph.filename }}"
|
||||
onerror="this.src='/static/img/rowingtimer.gif'"
|
||||
alt="{{ graph.filename }}" width="180" height="150">
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
<div class="grid_2 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/stats">Workout Stats</a>
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/stats">Workout Stats</a>
|
||||
</p>
|
||||
|
||||
+134
-136
@@ -1,166 +1,164 @@
|
||||
{% extends "newbase.html" %}
|
||||
{% block title %}About us{% endblock title %}
|
||||
{% block main %}
|
||||
|
||||
{% extends "base.html" %}
|
||||
{% block title %}About us{% endblock title %}
|
||||
{% block content %}
|
||||
<h1>How we calculate things</h1>
|
||||
|
||||
<div class="grid_6 alpha">
|
||||
<h3>How we calculate things</h3>
|
||||
<p>You are reading this because you want to understand how the wind/stream conversion and the conversion from OTW pace to OTE pace works.</p>
|
||||
|
||||
<p>The conversions are done using a one-dimensional mechanical model that is
|
||||
introduced <a href="https://sanderroosendaal.wordpress.com/index/">here</a>.
|
||||
The model takes into account, among others, the following parameters:
|
||||
<ul>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<p>You are reading this because you want to understand how the wind/stream conversion and the conversion from OTW pace to OTE pace works.</p>
|
||||
|
||||
<p>The conversions are done using a one-dimensional mechanical model that is
|
||||
introduced <a href="https://sanderroosendaal.wordpress.com/index/">here</a>.
|
||||
The model takes into account, among others, the following parameters:
|
||||
<ul>
|
||||
<li>Stroke rate</li>
|
||||
<li>Stroke length</li>
|
||||
<li>Rigging parameters</li>
|
||||
<li>Rower and boat weight</li>
|
||||
</ul>
|
||||
For this site, we use "standard" rigging parameters, blade shapes, and FISA minimum boat weights. For the eight, I add the weight of a cox (at the FISA minimum weight). The stroke length is also set at a fixed value, but in the future I
|
||||
will allow you to adjust to your own stroke length.
|
||||
</p>
|
||||
<p>
|
||||
Knowing boat type (rigging), pace and stroke rate, and taking into account
|
||||
the influence of wind and stream (if provided), I am able to find the
|
||||
mechanical power that you provide to the rowing system by a reverse
|
||||
calculation. That is, I vary the input force until I find the one that
|
||||
corresponds to your actual pace at that stroke rate.
|
||||
</p>
|
||||
<p>
|
||||
Knowing the power, I can calculate how fast you would have gone without
|
||||
external wind and stream influences by running the calculation in a forward
|
||||
way, using the power and force profile found. This is the wind/stream
|
||||
corrected pace, which I think is useful to know and be able to compare
|
||||
from training to training and between different rowing venues.
|
||||
</p>
|
||||
</ul>
|
||||
For this site, we use "standard" rigging parameters, blade shapes, and FISA minimum boat weights. For the eight, I add the weight of a cox (at the FISA minimum weight). The stroke length is also set at a fixed value, but in the future I
|
||||
will allow you to adjust to your own stroke length.
|
||||
</p>
|
||||
<p>
|
||||
Knowing boat type (rigging), pace and stroke rate, and taking into account
|
||||
the influence of wind and stream (if provided), I am able to find the
|
||||
mechanical power that you provide to the rowing system by a reverse
|
||||
calculation. That is, I vary the input force until I find the one that
|
||||
corresponds to your actual pace at that stroke rate.
|
||||
</p>
|
||||
<p>
|
||||
Knowing the power, I can calculate how fast you would have gone without
|
||||
external wind and stream influences by running the calculation in a forward
|
||||
way, using the power and force profile found. This is the wind/stream
|
||||
corrected pace, which I think is useful to know and be able to compare
|
||||
from training to training and between different rowing venues.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Using another algorithm to calculate total mechanical power on an erg, I can
|
||||
calculate what the erg display would show you if you rowed on the erg with
|
||||
the same average power, at the same stroke rate. The calculations are done
|
||||
for a statical Concept2 erg with a fairly standard drag factor. I cannot
|
||||
take into account the fact that you may use different technique or would
|
||||
row at a different stroke rate on the erg.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Using another algorithm to calculate total mechanical power on an erg, I can
|
||||
calculate what the erg display would show you if you rowed on the erg with
|
||||
the same average power, at the same stroke rate. The calculations are done
|
||||
for a statical Concept2 erg with a fairly standard drag factor. I cannot
|
||||
take into account the fact that you may use different technique or would
|
||||
row at a different stroke rate on the erg.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
It is important to understand that the Power display on the erg is not showing
|
||||
you the complete picture. In my calculations, I use my proprietary algorithms
|
||||
to calculate the additional power that goes into moving your body weight up
|
||||
and down the slide on a static erg. To get the most accurate results, it is
|
||||
important to be honest about your weight and set it independently for each
|
||||
workout.
|
||||
</p>
|
||||
|
||||
<p>Not taken into account are the following factors:
|
||||
<ul>
|
||||
<p>
|
||||
It is important to understand that the Power display on the erg is not showing
|
||||
you the complete picture. In my calculations, I use my proprietary algorithms
|
||||
to calculate the additional power that goes into moving your body weight up
|
||||
and down the slide on a static erg. To get the most accurate results, it is
|
||||
important to be honest about your weight and set it independently for each
|
||||
workout.
|
||||
</p>
|
||||
|
||||
<p>Not taken into account are the following factors:
|
||||
<ul>
|
||||
<li>Water Temperature</li>
|
||||
<li>Heavier/shorter/wider boats than the ones used by the elite</li>
|
||||
<li>Bungees, weed, or other artefacts slowing down the boat</li>
|
||||
<li>Boat stopping technique flaws</li>
|
||||
<li>Effect of wave height or cross-wind</li>
|
||||
</ul>
|
||||
The water temperature has a small but measurable effect on the water density
|
||||
(and thus on the drag). I am using the value at 20 degrees C, which is a
|
||||
good average over the OTW season for a lake in a temperate climate. All
|
||||
the other elements result in an equivalent erg pace that is probably slower
|
||||
than what you can achieve on the erg. So look at it as an incentive to
|
||||
improve your technique (big effect) and/or buy a faster boat (minor effect).
|
||||
If your OTW to OTE pace conversion results in numbers close to what you
|
||||
normally achieve on the erg, you are rowing like an elite rower (but possibly
|
||||
at a lower power)! When I get around it, I will try to model the effect of cross-wind.
|
||||
</p>
|
||||
</ul>
|
||||
The water temperature has a small but measurable effect on the water density
|
||||
(and thus on the drag). I am using the value at 20 degrees C, which is a
|
||||
good average over the OTW season for a lake in a temperate climate. All
|
||||
the other elements result in an equivalent erg pace that is probably slower
|
||||
than what you can achieve on the erg. So look at it as an incentive to
|
||||
improve your technique (big effect) and/or buy a faster boat (minor effect).
|
||||
If your OTW to OTE pace conversion results in numbers close to what you
|
||||
normally achieve on the erg, you are rowing like an elite rower (but possibly
|
||||
at a lower power)! When I get around it, I will try to model the effect of cross-wind.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
I have checked the model both from a Physics perspective (I have a degree in
|
||||
Physics, if you are interested) and compared with the data available.
|
||||
An important data set has been published <a href="http://www.biorow.com/RBN_en_2007_files/App2007RowBiomNews08.pdf">here</a> by Dr Kleshnev. For sculling,
|
||||
my algorithms are extremely close in reproducing that data set. For sweep
|
||||
rowing, I am still fine tuning some parameters, but I am close for a pair and
|
||||
a four. I had to make assumptions about Kleshnev's data, especially about the
|
||||
stroke rate, but as I got realistic stroke rates (35 and higher) for world
|
||||
record performance, I am quite confident.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
On top of that I am constantly comparing the model's results to my own sculling
|
||||
and rowing, and I will be the first to admit flaws and correct them. So please
|
||||
contact me if there are any inconsistencies, suspicions, questions or simply
|
||||
if you want to chat about Rowing Physics.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
I have checked the model both from a Physics perspective (I have a degree in
|
||||
Physics, if you are interested) and compared with the data available.
|
||||
An important data set has been published <a href="http://www.biorow.com/RBN_en_2007_files/App2007RowBiomNews08.pdf">here</a> by Dr Kleshnev. For sculling,
|
||||
my algorithms are extremely close in reproducing that data set. For sweep
|
||||
rowing, I am still fine tuning some parameters, but I am close for a pair and
|
||||
a four. I had to make assumptions about Kleshnev's data, especially about the
|
||||
stroke rate, but as I got realistic stroke rates (35 and higher) for world
|
||||
record performance, I am quite confident.
|
||||
</p>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<h2>Manual</h2>
|
||||
|
||||
<p>
|
||||
On top of that I am constantly comparing the model's results to my own sculling
|
||||
and rowing, and I will be the first to admit flaws and correct them. So please
|
||||
contact me if there are any inconsistencies, suspicions, questions or simply
|
||||
if you want to chat about Rowing Physics.
|
||||
</p>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
<h3>Manual</h3>
|
||||
|
||||
<p>Here's the best way - in my mind - to use the Rowing Physics
|
||||
functionality. I am assuming you have successfully uploaded or imported
|
||||
a rowing workout. You must have position data (lat/long) with your row. A
|
||||
TCX from CrewNerd or RiM or a workout imported from SportTracks or Strava
|
||||
(where you see a map of your workout on those sites) should have those
|
||||
data. I am working on adding the FIT file format that is used by SpeedCoach
|
||||
GPS. For now, export the data to Strava and then import them here.
|
||||
</p>
|
||||
|
||||
<p>Recipe for success:
|
||||
<ol>
|
||||
<p>Here's the best way - in my mind - to use the Rowing Physics
|
||||
functionality. I am assuming you have successfully uploaded or imported
|
||||
a rowing workout. You must have position data (lat/long) with your row. A
|
||||
TCX from CrewNerd or RiM or a workout imported from SportTracks or Strava
|
||||
(where you see a map of your workout on those sites) should have those
|
||||
data. I am working on adding the FIT file format that is used by SpeedCoach
|
||||
GPS. For now, export the data to Strava and then import them here.
|
||||
</p>
|
||||
|
||||
<p>Recipe for success:
|
||||
<ol>
|
||||
<li>Click on the workout. This will bring you to the workout Edit view</li>
|
||||
<li>Click on the "Advanced" button</li>
|
||||
<li>Click on "Geeky Stuff"</li>
|
||||
<li>Look for three buttons labelled "Edit Wind Data", "Edit Stream
|
||||
<li>Look for three menu items labelled "Edit Wind Data", "Edit Stream
|
||||
Data" and "OTW Power"</li>
|
||||
<li>If you have wind or stream data, click on the appropriate
|
||||
button and enter your data.</li>
|
||||
<li>If you have both wind and stream, click the shortcut button
|
||||
on the respective page to take you to the other parameter</li>
|
||||
menu item and enter your data.</li>
|
||||
<li>Click on OTW Power</li>
|
||||
<li>Select the boat type and enter the average weight
|
||||
per crew member.
|
||||
Do not use the crew total weight.</li>
|
||||
<li>Click "Update & Run"</li>
|
||||
<li>Go do something else. You will receive an email when the calculations are finished. The calculation itself will take about 10 minutes for an
|
||||
hour long row, but there may be other people's calculations in the queue, so
|
||||
hour long row, but there may be other people's calculations in the queue, so
|
||||
it may take longer.</li>
|
||||
<li>Progress can be monitored by clicking on "here" in the message
|
||||
at the top of the page advising that the calculation has
|
||||
begun.</li>
|
||||
<li>
|
||||
When the calculation is complete, go back to the "Geeky Stuff" page
|
||||
and click on "Corrected Pace Plot" to see the result. From here, you can re-run the calculation with different parameters.</li>
|
||||
</ol>
|
||||
</p>
|
||||
</ol>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Once you have run the calculation, the boat type, average crew weight,
|
||||
Power and corrected pace data are stored permanently on the site. If you would
|
||||
export the data to Strava or SportTracks now, those sites will have the
|
||||
Power data.
|
||||
</p>
|
||||
|
||||
<h2>Why does the calculation take so much time?</h2>
|
||||
|
||||
<p>
|
||||
Once you have run the calculation, the boat type, average crew weight,
|
||||
Power and corrected pace data are stored permanently on the site. If you would
|
||||
export the data to Strava or SportTracks now, those sites will have the
|
||||
Power data.
|
||||
</p>
|
||||
<p>I am running the calculations from a first principles base, so for
|
||||
each data point that I am calculating, I am finding the stroke average
|
||||
force, then calculating corrected pace (wind/stream) and finding the
|
||||
corresponding erg power. I am not taking any shortcuts. The advantage
|
||||
of this approach is that I can give you numbers irrespective of your
|
||||
weight, speed, stroke rate, sex, etc. The model can deal with circumstances
|
||||
it has not encountered before. The downside is that it takes time.</p>
|
||||
|
||||
<p>
|
||||
A much faster approach would be to simply take pre-calculated data from
|
||||
a table and interpolate. The advantage of this approach is is speed. The
|
||||
disadvantage is that extrapolation outside the limits of the available
|
||||
data is dangerous and will lead to erroneous results.</p>
|
||||
|
||||
<p>Future versions of this site will use a hybrid approach
|
||||
but only for pace/wind/stream/stroke rate/weight combinations that I consider
|
||||
well validated. For that, I need to collect data, so keep the workouts coming!
|
||||
</p>
|
||||
|
||||
<img src="/static/img/validation.png" width="450">
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>Why does the calculation take so much time?</h3>
|
||||
{% endblock %}
|
||||
|
||||
<p>I am running the calculations from a first principles base, so for
|
||||
each data point that I am calculating, I am finding the stroke average
|
||||
force, then calculating corrected pace (wind/stream) and finding the
|
||||
corresponding erg power. I am not taking any shortcuts. The advantage
|
||||
of this approach is that I can give you numbers irrespective of your
|
||||
weight, speed, stroke rate, sex, etc. The model can deal with circumstances
|
||||
it has not encountered before. The downside is that it takes time.</p>
|
||||
|
||||
<p>
|
||||
A much faster approach would be to simply take pre-calculated data from
|
||||
a table and interpolate. The advantage of this approach is is speed. The
|
||||
disadvantage is that extrapolation outside the limits of the available
|
||||
data is dangerous and will lead to erroneous results.</p>
|
||||
|
||||
<p>Future versions of this site will use a hybrid approach
|
||||
but only for pace/wind/stream/stroke rate/weight combinations that I consider
|
||||
well validated. For that, I need to collect data, so keep the workouts coming!
|
||||
</p>
|
||||
|
||||
<img src="/static/img/validation.png" width="450">
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
{% block sidebar %}
|
||||
{% include 'menu_help.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,118 +1,65 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Plan entire microcycle{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
</div>
|
||||
{% block main %}
|
||||
<h1>Create Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>Create Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
</div>
|
||||
<div id="timeperiod" class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||
<div class="dropdown-content">
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multicreate/today/rower/{{ rower.id }}">
|
||||
Today
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multicreate/thisweek/rower/{{ rower.id }}">
|
||||
This Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multicreate/thismonth/rower/{{ rower.id }}">
|
||||
This Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multicreate/lastweek/rower/{{ rower.id }}">
|
||||
Last Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multicreate/lastmonth/rower/{{ rower.id }}">
|
||||
Last Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multicreate/nextweek/rower/{{ rower.id }}">
|
||||
Next Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multicreate/nextmonth/rower/{{ rower.id }}">
|
||||
Next Month
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ rower.user.first_name }} {{ rower.user.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_rowers %}
|
||||
<a class="button green small" href="/rowers/sessions/multicreate/{{ timeperiod }}/rower/{{ member.id }}">{{ member.user.first_name }} {{ member.user.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<p>
|
||||
On this page, you can create and edit sessions for an entire time
|
||||
period. You see a list of the current sessions planned for the
|
||||
selected time period. Each row in the table is a session. You can
|
||||
remove a session by clicking "remove" at the end of a row.
|
||||
You can edit the date in the forms. If you need to add a new session,
|
||||
click the "Add More" button to add a new session. Use the "Submit"
|
||||
button to commit any changes you made.
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
<p>
|
||||
On this page, you can create and edit sessions for an entire time
|
||||
period. You see a list of the current sessions planned for the
|
||||
selected time period. Each row in the table is a session. You can
|
||||
remove a session by clicking "remove" at the end of a row.
|
||||
You can edit the date in the forms. If you need to add a new session,
|
||||
click the "Add More" button to add a new session. Use the "Submit"
|
||||
button to commit any changes you made.
|
||||
</p>
|
||||
<form id="ps-form-table" method="post">
|
||||
{% csrf_token %}
|
||||
{{ ps_formset.management_form }}
|
||||
<table width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
{% for field in ps_formset.0.visible_fields %}
|
||||
<td>{{ field.label_tag }}</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for form in ps_formset %}
|
||||
<tr class="session_form_row">
|
||||
<td> {{ forloop.counter }}
|
||||
{% if form.instance.pk %}{{ form.DELETE }}{% endif %}
|
||||
{{ form.id }}
|
||||
{% for field in form.hidden_fields %}
|
||||
{{ field }}
|
||||
<form id="ps-form-table" method="post">
|
||||
{% csrf_token %}
|
||||
{{ ps_formset.management_form }}
|
||||
<table width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
{% for field in ps_formset.0.visible_fields %}
|
||||
<td>{{ field.label_tag }}</td>
|
||||
{% endfor %}
|
||||
{% for field in form.visible_fields %}
|
||||
<td>
|
||||
{{ field }}
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for form in ps_formset %}
|
||||
<tr class="session_form_row">
|
||||
<td> {{ forloop.counter }}
|
||||
{% if form.instance.pk %}{{ form.DELETE }}{% endif %}
|
||||
{{ form.id }}
|
||||
{% for field in form.hidden_fields %}
|
||||
{{ field }}
|
||||
{% endfor %}
|
||||
{% for field in form.visible_fields %}
|
||||
<td>
|
||||
{{ field }}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<a class="button gray small grid_2 alpha" href="/rowers/sessions/multicreate/{{ timeperiod }}/rower/{{ rower.id }}/extra/{{ extrasessions }}">Add More</a>
|
||||
<button class="button green small grid_2" type="submit">Submit</button>
|
||||
<a class="button blue small grid_2" href="/rowers/sessions/multiclone/{{ timeperiod }}/rower/{{ rower.id }}">Clone multiple sessions</a>
|
||||
</tbody>
|
||||
</table>
|
||||
<a href="/rowers/sessions/multicreate/user/{{ rower.user.id }}/extra/{{ extrasessions }}/?when={{ timeperiod }}">
|
||||
Add More
|
||||
</a>
|
||||
or
|
||||
<a href="/rowers/sessions/multiclone/user/{{ rower.user.id }}/?when={{ timeperiod }}">
|
||||
Clone multiple sessions
|
||||
</a>
|
||||
<button class="button green small" type="submit">Submit</button>
|
||||
</form>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="grid_6 prefix_6" id="id_guidance">
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
|
||||
<script src="/static/js/jquery.formset.js"></script>
|
||||
@@ -200,3 +147,7 @@
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,71 +1,14 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}New Planned Session{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
</div>
|
||||
{% block main %}
|
||||
<h1>Create Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>Create Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
</div>
|
||||
<div id="timeperiod" class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||
<div class="dropdown-content">
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/today/rower/{{ rower.id }}">
|
||||
Today
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/thisweek/rower/{{ rower.id }}">
|
||||
This Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/thismonth/rower/{{ rower.id }}">
|
||||
This Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/lastweek/rower/{{ rower.id }}">
|
||||
Last Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/lastmonth/rower/{{ rower.id }}">
|
||||
Last Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/nextweek/rower/{{ rower.id }}">
|
||||
Next Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/nextmonth/rower/{{ rower.id }}">
|
||||
Next Month
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ rower.user.first_name }} {{ rower.user.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_rowers %}
|
||||
<a class="button green small" href="/rowers/sessions/create/{{ timeperiod }}/rower/{{ member.id }}">{{ member.user.first_name }} {{ member.user.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endif %}
|
||||
<div class="grid_2 omega">
|
||||
<a class="button small gray" href="/rowers/list-courses">Courses</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<div id="right" class="grid_6 alpha">
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<h1>Plan</h1>
|
||||
<p>
|
||||
Click on session name to view
|
||||
@@ -100,10 +43,10 @@
|
||||
<td> {{ ps.sessionvalue }} </td>
|
||||
<td> {{ ps.sessionunit }} </td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/edit/{{ timeperiod }}/rower/{{ rower.id }}">Edit</a>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/edit/user/{{ rower.user.id }}/?when={{ timeperiod }}">Edit</a>
|
||||
</td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/clone/{{ timeperiod }}/rower/{{ rower.id }}">Clone</a>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/clone/user/{{ rower.user.id }}/?when={{ timeperiod }}">Clone</a>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
@@ -113,11 +56,8 @@
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="grid_6 omega">
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<h1>New Session</h1>
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% if form.errors %}
|
||||
@@ -130,15 +70,12 @@
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div id="formbutton" class="grid_1 prefix_4 suffix_1">
|
||||
<input class="button green" type="submit" value="Save">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_6 prefix_6" id="id_guidance">
|
||||
<input class="button green" type="submit" value="Save">
|
||||
</form>
|
||||
<div class="padded" id="id_guidance">
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
@@ -240,3 +177,7 @@
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,45 +1,43 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
|
||||
{% block title %}Planned Session{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
|
||||
</div>
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>Confirm Delete</h1>
|
||||
<p>This will permanently delete the planned session</p>
|
||||
{% block main %}
|
||||
<h1>Confirm Delete</h1>
|
||||
<p>This will permanently delete the planned session</p>
|
||||
|
||||
|
||||
<div class="grid_2 alpha">
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<p>
|
||||
<a class="button green small" href="/rowers/sessions/">Cancel</a>
|
||||
</div>
|
||||
|
||||
<div class="grid_2">
|
||||
<p>
|
||||
<a class="button red small" href="/rowers/sessions/{{ ps.id }}/delete">Delete</a>
|
||||
<form action="" method="post">
|
||||
{% csrf_token %}
|
||||
<p>Are you sure you want to delete <em>{{ object }}</em>?</p>
|
||||
<input class="button red" type="submit" value="Confirm">
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
</div>
|
||||
<div id="right" class="grid_6 omega">
|
||||
<h1>Session {{ psdict.name.1 }}</h1>
|
||||
<table class="listtable shortpadded">
|
||||
{% for attr in attrs %}
|
||||
{% for key,value in psdict.items %}
|
||||
{% if key == attr %}
|
||||
<tr>
|
||||
<td><b>{{ value.0 }}</b></td><td>{{ value.1 }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
<li class="grid_2">
|
||||
<h2>Session {{ psdict.name.1 }}</h2>
|
||||
<table class="listtable shortpadded">
|
||||
{% for attr in attrs %}
|
||||
{% for key,value in psdict.items %}
|
||||
{% if key == attr %}
|
||||
<tr>
|
||||
<td><b>{{ value.0 }}</b></td><td>{{ value.1 }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,65 +1,21 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Update Planned Session{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>Edit Session</h1>
|
||||
</div>
|
||||
<div id="timeperiod" class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||
<div class="dropdown-content">
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/today/rower/{{ rower.id }}">
|
||||
Today
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/thisweek/rower/{{ rower.id }}">
|
||||
This Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/thismonth/rower/{{ rower.id }}">
|
||||
This Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/lastweek/rower/{{ rower.id }}">
|
||||
Last Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/lastmonth/rower/{{ rower.id }}">
|
||||
Last Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/nextweek/rower/{{ rower.id }}">
|
||||
Next Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/nextmonth/rower/{{ rower.id }}">
|
||||
Next Month
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% block main %}
|
||||
<h1>Edit Session</h1>
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2">
|
||||
<a class="button green small alpha" href="/rowers/sessions/teamedit/{{ thesession.id }}/{{ timeperiod}}">
|
||||
Assign to my Teams
|
||||
<p>
|
||||
<a href="/rowers/sessions/teamedit/{{ thesession.id }}/">
|
||||
Assign to my Teams
|
||||
</a>
|
||||
</div>
|
||||
</p>
|
||||
{% endif %}
|
||||
<div class="grid_2 omega">
|
||||
<a class="button small gray" href="/rowers/list-courses">Courses</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div id="right" class="grid_6 alpha">
|
||||
<h1>Plan</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<h2>Plan</h2>
|
||||
<p>
|
||||
Click on session name to view
|
||||
</p>
|
||||
@@ -93,11 +49,11 @@
|
||||
<td> {{ ps.sessionvalue }} </td>
|
||||
<td> {{ ps.sessionunit }} </td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/edit/{{ timeperiod }}/rower/{{ rower.id }}">Edit</a>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/edit/user/{{ rower.user.id }}">Edit</a>
|
||||
</td>
|
||||
<td>
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}/clone/{{ timeperiod }}/rower/{{ rower.id }}">Clone</a>
|
||||
href="/rowers/sessions/{{ ps.id }}/clone/user/{{ rower.user.id }}">Clone</a>
|
||||
</td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm">Delete</a>
|
||||
@@ -106,41 +62,42 @@
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="grid_6 omega">
|
||||
<h1>{{ thesession.name }}</h1>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<h2>{{ thesession.name }}</h2>
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<p>
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
</p>
|
||||
{% csrf_token %}
|
||||
<div class="grid_1 prefix_2 alpha">
|
||||
<a class="red button small" href="/rowers/sessions/{{ thesession.id }}/deleteconfirm">Delete</a>
|
||||
<div id="id_guidance">
|
||||
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
<a class="gray button small" href="/rowers/sessions/{{ thesession.id }}/clone">Clone</a>
|
||||
</div>
|
||||
<div id="formbutton" class="grid_1 suffix_1 omega">
|
||||
<input class="button green" action="/rowers/sessions/{{ thesession.id }}/edit/{{ timeperiod }}/rower/{{ rower.id }}" type="submit" value="Save">
|
||||
</div>
|
||||
<div class="grid_6" id="id_guidance">
|
||||
<p>
|
||||
<a href="/rowers/sessions/{{ thesession.id }}/deleteconfirm">Delete</a>
|
||||
<a href="/rowers/sessions/{{ thesession.id }}/clone/?when={{ timeperiod }}">Clone</a>
|
||||
</p>
|
||||
<input class="button green"
|
||||
action="/rowers/sessions/{{ thesession.id }}/edit/user/{{ rower.user.id }}" type="submit" value="Save">
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block scripts %}
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
|
||||
<script>
|
||||
|
||||
@@ -1,181 +1,137 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Planned Sessions{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
</div>
|
||||
<div class="grid_6 alpha">
|
||||
<h1>Plan for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
</div>
|
||||
<div id="timeperiod" class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||
<div class="dropdown-content">
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/today/rower/{{ rower.id }}">
|
||||
Today
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/thisweek/rower/{{ rower.id }}">
|
||||
This Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/thismonth/rower/{{ rower.id }}">
|
||||
This Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/lastweek/rower/{{ rower.id }}">
|
||||
Last Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/lastmonth/rower/{{ rower.id }}">
|
||||
Last Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/nextweek/rower/{{ rower.id }}">
|
||||
Next Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/nextmonth/rower/{{ rower.id }}">
|
||||
Next Month
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ rower.user.first_name }} {{ rower.user.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_rowers %}
|
||||
<a class="button green small" href="/rowers/sessions/{{ timeperiod }}/rower/{{ member.id }}">{{ member.user.first_name }} {{ member.user.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="grid_2 omega">
|
||||
<a class="button small gray" href="/rowers/list-courses">Courses</a>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
{% if plannedsessions %}
|
||||
<p>
|
||||
Click on session name to view, edit to change the session and on the
|
||||
traffic light symbol to add workouts to the session
|
||||
</p>
|
||||
<table width="90%" class="listtable shortpadded">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Status</th>
|
||||
<th>On or After</th>
|
||||
<th>On or Before</th>
|
||||
<th>Name</th>
|
||||
<th>Type</th>
|
||||
<th>Mode</th>
|
||||
<th>Edit</th>
|
||||
<th>Planned</th>
|
||||
<th>Actual</th>
|
||||
<th> </th>
|
||||
<th>Completion Date</th>
|
||||
<th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for ps in plannedsessions %}
|
||||
<tr>
|
||||
<td>
|
||||
{% if completeness|lookup:ps.id == 'not done' %}
|
||||
{% if ps.sessiontype != 'race' %}
|
||||
<a class="white dot" href="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ rower.id }}/session/{{ ps.id }}"> </a>
|
||||
{% else %}
|
||||
<a class="white dot" href="/rowers/virtualevent/{{ ps.id }}/submit"> </a>
|
||||
{% endif %}
|
||||
{% elif completeness|lookup:ps.id == 'completed' %}
|
||||
{% if ps.sessiontype != 'race' %}
|
||||
<a class="green dot" href="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ rower.id }}/session/{{ ps.id }}"> </a>
|
||||
{% else %}
|
||||
<a class="green dot" href="/rowers/virtualevent/{{ ps.id }}/submit"> </a>
|
||||
{% endif %}
|
||||
{% elif completeness|lookup:ps.id == 'partial' %}
|
||||
{% if ps.sessiontype != 'race' %}
|
||||
<a class="orange dot" href="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ rower.id }}/session/{{ ps.id }}"> </a>
|
||||
{% else %}
|
||||
<a class="orange dot" href="/rowers/virtualevent/{{ ps.id }}/submit"> </a>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if ps.sessiontype != 'race' %}
|
||||
<a class="red dot" href="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ rower.id }}/session/{{ ps.id }}"> </a>
|
||||
{% else %}
|
||||
<a class="red dot" href="/rowers/virtualevent/{{ ps.id }}/submit"> </a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td> {{ ps.startdate|date:"Y-m-d" }} </td>
|
||||
<td> {{ ps.enddate|date:"Y-m-d" }} </td>
|
||||
<td>
|
||||
{% if ps.sessiontype != 'race' %}
|
||||
{% if ps.name != '' %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}/{{ timeperiod }}/rower/{{ rower.id }}">{{ ps.name }}</a>
|
||||
{% else %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}/{{ timeperiod }}/rower/{{ rower.id }}">Unnamed Session</a>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if ps.name != '' %}
|
||||
<a class="small"
|
||||
href="/rowers/virtualevent/{{ ps.id }}">{{ ps.name }}</a>
|
||||
{% else %}
|
||||
<a class="small"
|
||||
href="/rowers/virtualevent/{{ ps.id }}">Unnamed Race</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td> {{ ps.get_sessiontype_display }} </td>
|
||||
<td> {{ ps.get_sessionmode_display }} </td>
|
||||
<td>
|
||||
{% if ps.manager == request.user %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}/edit/{{ timeperiod }}/rower/{{ rower.id }} ">Edit</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</td>
|
||||
<td> {{ ps.sessionvalue }} </td>
|
||||
<td> {{ actualvalue|lookup:ps.id }}</td>
|
||||
<td> {{ ps.sessionunit }} </td>
|
||||
{% if completeness|lookup:ps.id == 'partial' %}
|
||||
<td style="color:darkgray"><i> {{ completiondate|lookup:ps.id|date:"Y-m-d" }}</i></td>
|
||||
{% block main %}
|
||||
|
||||
<h1>Planned Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
|
||||
{% if plannedsessions %}
|
||||
<p>
|
||||
Click on session name to view, edit to change the session and on the
|
||||
traffic light symbol to add workouts to the session
|
||||
</p>
|
||||
<table width="90%" class="listtable shortpadded">
|
||||
<thead>
|
||||
<tr>
|
||||
<th align="left">Status</th>
|
||||
<th align="left">On or After</th>
|
||||
<th align="left">On or Before</th>
|
||||
<th align="left">Name</th>
|
||||
<th align="left">Type</th>
|
||||
<th align="left">Mode</th>
|
||||
<th align="left">Edit</th>
|
||||
<th align="left">Planned</th>
|
||||
<th align="left">Actual</th>
|
||||
<th align="left"> </th>
|
||||
<th align="left">Completion Date</th>
|
||||
<th align="left">
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for ps in plannedsessions %}
|
||||
<tr>
|
||||
<td>
|
||||
{% if completeness|lookup:ps.id == 'not done' %}
|
||||
{% if ps.sessiontype != 'race' %}
|
||||
<a class="white dot"
|
||||
href="/rowers/sessions/manage/session/{{ ps.id }}/user/{{ rower.user.id }}/?when={{ timeperiod }}">
|
||||
</a>
|
||||
{% else %}
|
||||
<td> {{ completiondate|lookup:ps.id|date:"Y-m-d" }}</td>
|
||||
<a class="white dot" href="/rowers/virtualevent/{{ ps.id }}/submit"> </a>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
You have no planned workouts for this period. Planned workouts are created
|
||||
by your coach if you are part of a team. You can create your own
|
||||
planned workouts by purchasing the "Coach" or "Self-Coach" plans.
|
||||
{% endif %}
|
||||
<p>
|
||||
<a class="grid_2 button gray" href="/rowers/sessions/print/{{ timeperiod }}/rower/{{ rower.id }}">Print View</a>
|
||||
<p>
|
||||
{% if unmatchedworkouts %}
|
||||
<h1>Workouts that are not linked to any session</h1>
|
||||
{% elif completeness|lookup:ps.id == 'completed' %}
|
||||
{% if ps.sessiontype != 'race' %}
|
||||
<a class="green dot"
|
||||
href="/rowers/sessions/manage/session/{{ ps.id }}/user/{{ rower.user.id }}/?when={{ timeperiod }}"> </a>
|
||||
{% else %}
|
||||
<a class="green dot" href="/rowers/virtualevent/{{ ps.id }}/submit"> </a>
|
||||
{% endif %}
|
||||
{% elif completeness|lookup:ps.id == 'partial' %}
|
||||
{% if ps.sessiontype != 'race' %}
|
||||
<a class="orange dot"
|
||||
href="/rowers/sessions/manage/session/{{ ps.id }}/user/{{ rower.user.id }}?when={{ timeperiod }}"> </a>
|
||||
{% else %}
|
||||
<a class="orange dot" href="/rowers/virtualevent/{{ ps.id }}/submit"> </a>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if ps.sessiontype != 'race' %}
|
||||
<a class="red dot"
|
||||
href="/rowers/sessions/manage/session/{{ ps.id }}/user/{{ rower.user.id }}?when={{ timeperiod }}"> </a>
|
||||
{% else %}
|
||||
<a class="red dot" href="/rowers/virtualevent/{{ ps.id }}/submit"> </a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td> {{ ps.startdate|date:"Y-m-d" }} </td>
|
||||
<td> {{ ps.enddate|date:"Y-m-d" }} </td>
|
||||
<td>
|
||||
{% if ps.sessiontype != 'race' %}
|
||||
{% if ps.name != '' %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}/user/{{ rower.user.id }}">{{ ps.name }}</a>
|
||||
{% else %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}/user/{{ rower.user.id }}">Unnamed Session</a>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if ps.name != '' %}
|
||||
<a class="small"
|
||||
href="/rowers/virtualevent/{{ ps.id }}">{{ ps.name }}</a>
|
||||
{% else %}
|
||||
<a class="small"
|
||||
href="/rowers/virtualevent/{{ ps.id }}">Unnamed Race</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td> {{ ps.get_sessiontype_display }} </td>
|
||||
<td> {{ ps.get_sessionmode_display }} </td>
|
||||
<td>
|
||||
{% if ps.manager == request.user %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}/edit/user/{{ rower.user.id }}/?when={{ timeperiod }}">Edit</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</td>
|
||||
<td> {{ ps.sessionvalue }} </td>
|
||||
<td> {{ actualvalue|lookup:ps.id }}</td>
|
||||
<td> {{ ps.sessionunit }} </td>
|
||||
{% if completeness|lookup:ps.id == 'partial' %}
|
||||
<td style="color:darkgray"><i> {{ completiondate|lookup:ps.id|date:"Y-m-d" }}</i></td>
|
||||
{% else %}
|
||||
<td> {{ completiondate|lookup:ps.id|date:"Y-m-d" }}</td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
You have no planned workouts for this period. Planned workouts are created
|
||||
by your coach if you are part of a team. You can create your own
|
||||
planned workouts by purchasing the "Coach" or "Self-Coach" plans.
|
||||
{% endif %}
|
||||
<p>
|
||||
<a class="grid_2 button gray"
|
||||
href="/rowers/sessions/print/user/{{ rower.user.id }}/?when={{ timeperiod }}">
|
||||
Print View</a>
|
||||
</p>
|
||||
{% if unmatchedworkouts %}
|
||||
<h2>Workouts that are not linked to any session</h2>
|
||||
<p>
|
||||
<table width="90%" class="listtable shortpadded">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:80"> Date</th>
|
||||
<th> Time</th>
|
||||
<th> Name</th>
|
||||
<th> Type</th>
|
||||
<th> Distance </th>
|
||||
<th> Duration </th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
<th style="width:80"> Date</th>
|
||||
<th align="left"> Time</th>
|
||||
<th align="left"> Name</th>
|
||||
<th align="left"> Type</th>
|
||||
<th align="left"> Distance </th>
|
||||
<th align="left"> Duration </th>
|
||||
<th align="left"> Avg HR </th>
|
||||
<th align="left"> Max HR </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -211,12 +167,16 @@
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Workouts{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script>
|
||||
function toggle(source) {
|
||||
@@ -64,123 +64,46 @@
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
</div>
|
||||
<div class="grid_6 alpha">
|
||||
<h1>Clone Multiple Sessions</h1>
|
||||
</div>
|
||||
<div id="timeperiod" class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||
<div class="dropdown-content">
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multiclone/today">
|
||||
Today
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multiclone/thisweek">
|
||||
This Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multiclone/thismonth">
|
||||
This Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multiclone/lastweek">
|
||||
Last Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multiclone/lastmonth">
|
||||
Last Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multiclone/nextweek">
|
||||
Next Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/multiclone/nextmonth">
|
||||
Next Month
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
Select Rower
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_rowers %}
|
||||
<a class="button green small" href="/rowers/sessions/multiclone/{{ timeperiod }}/rower/{{ member.id }}">{{ member.user.first_name }} {{ member.user.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<form enctype="multipart/form-data" method="post">
|
||||
{% endif %}
|
||||
<div class="grid_4 alpha">
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name='daterange' class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="grid_5 prefix_1 omega">
|
||||
<form id="searchform" method="get" accept-charset="utf-8">
|
||||
<div class="grid_3 prefix_1 alpha">
|
||||
<input class="searchfield" id="searchbox" name="q" type="text" placeholder="Search">
|
||||
</div>
|
||||
<div class="grid_1 omega">
|
||||
<button class="button blue small" type="submit">
|
||||
Search
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<h1>Clone Multiple Sessions for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
|
||||
|
||||
<form enctype="multipart/form-data" method="post">
|
||||
<div id="workouts_table" class="grid_8 alpha">
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
|
||||
|
||||
{% if plannedsessions %}
|
||||
|
||||
<input type="checkbox" onClick="toggle(this)" /> Toggle All<br/>
|
||||
|
||||
<table width="100%" class="listtable">
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
<p> No sessions found </p>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div id="form_settings" class="grid_4 alpha">
|
||||
<p>Select one or more planned sessions on the left,
|
||||
select the date when the new cycle starts below
|
||||
and press submit</p>
|
||||
{% csrf_token %}
|
||||
<table>
|
||||
{{ dateshiftform.as_table }}
|
||||
</table>
|
||||
<div class="grid_1 prefix_2 suffix_1">
|
||||
<p>
|
||||
<input name='workoutselectform' class="button green" type="submit" value="Submit">
|
||||
{% if plannedsessions %}
|
||||
|
||||
<input type="checkbox" onClick="toggle(this)" /> Toggle All<br/>
|
||||
|
||||
<table width="100%" class="listtable">
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
<p> No sessions found </p>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>Select one or more planned sessions on the left,
|
||||
select the date when the new cycle starts below
|
||||
and press submit</p>
|
||||
{% csrf_token %}
|
||||
<table>
|
||||
{{ dateshiftform.as_table }}
|
||||
</table>
|
||||
<p>
|
||||
<input name='workoutselectform' class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_4">
|
||||
<p>You can use the date and search forms above to search through all
|
||||
<p>You can use the date and search forms above to search through all
|
||||
sessions.</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</form>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,100 +1,47 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Planned Sessions{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
</div>
|
||||
<div class="grid_6 alpha">
|
||||
<h1>Plan for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
<p>
|
||||
From {{ startdate }} to {{ enddate }}
|
||||
</p>
|
||||
</div>
|
||||
<div id="timeperiod" class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||
<div class="dropdown-content">
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/print/today/rower/{{ rower.id }}">
|
||||
Today
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/print/thisweek/rower/{{ rower.id }}">
|
||||
This Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/print/thismonth/rower/{{ rower.id }}">
|
||||
This Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/print/lastweek/rower/{{ rower.id }}">
|
||||
Last Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/print/lastmonth/rower/{{ rower.id }}">
|
||||
Last Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/print/nextweek/rower/{{ rower.id }}">
|
||||
Next Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/print/nextmonth/rower/{{ rower.id }}">
|
||||
Next Month
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ rower.user.first_name }} {{ rower.user.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_rowers %}
|
||||
<a class="button green small" href="/rowers/sessions/print/{{ timeperiod }}/rower/{{ member.id }}">{{ member.user.first_name }} {{ member.user.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="grid_2 omega">
|
||||
<a class="button small gray" href="/rowers/list-courses">Courses</a>
|
||||
</div>
|
||||
{% block main %}
|
||||
<h1>Plan for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
|
||||
{% for ps in plannedsessions %}
|
||||
<div class="grid_12 alpha" style="page-break-before: always, page-break-inside: avoid">
|
||||
<h1><a href="/rowers/sessions/{{ ps.id }}">Session {{ ps.name }}</a></h1>
|
||||
<h2><a href="/rowers/sessions/{{ ps.id }}">Session {{ ps.name }}</a></h2>
|
||||
<table class="listtable shortpadded" width="80%">
|
||||
<tr>
|
||||
<th>On or after</th><td>{{ ps.startdate }}</td>
|
||||
<th align="left">On or after</th><td>{{ ps.startdate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>On or before</th><td>{{ ps.enddate }}</td>
|
||||
<th align="left">On or before</th><td>{{ ps.enddate }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Session Type</th><td>{{ ps.sessiontype }}</td>
|
||||
<th align="left">Session Type</th><td>{{ ps.sessiontype }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Session Mode</th><td>{{ ps.sessionmode }}</td>
|
||||
<th align="left">Session Mode</th><td>{{ ps.sessionmode }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Criteria</th><td>{{ ps.criterium }}</td>
|
||||
<th align="left">Criteria</th><td>{{ ps.criterium }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Value</th><td>{{ ps.sessionvalue }}</td>
|
||||
<th align="left">Value</th><td>{{ ps.sessionvalue }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Unit</th><td>{{ ps.sessionunit }}</td>
|
||||
<th align="left">Unit</th><td>{{ ps.sessionunit }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Comment</th><td>{{ ps.comment|linebreaks }}</td>
|
||||
<th align="left">Comment</th><td>{{ ps.comment|linebreaks }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,197 +1,136 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Planned Sessions{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
</div>
|
||||
<div class="grid_4 alpha">
|
||||
{% if theteam %}
|
||||
<h1>Coach Overview. Team {{ theteam.name }}</h1>
|
||||
{% else %}
|
||||
<h1>Coach Overview</h1>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div id="timeperiod" class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||
<div class="dropdown-content">
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/coach/today">
|
||||
Today
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/coach/thisweek">
|
||||
This Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/coach/thismonth">
|
||||
This Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/coach/lastweek">
|
||||
Last Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/coach/lastmonth">
|
||||
Last Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/coach/nextweek">
|
||||
Next Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/coach/nextmonth">
|
||||
Next Month
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
Select Rower Individual Plan
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_rowers %}
|
||||
<a class="button green small" href="/rowers/sessions/{{ timeperiod }}/rower/{{ member.id }}">{{ member.user.first_name }} {{ member.user.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
Select Team
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
<a class="button green small" href="/rowers/sessions/coach/{{ timeperiod }}">
|
||||
All Teams
|
||||
</a>
|
||||
|
||||
{% for team in myteams %}
|
||||
<a class="button green small" href="/rowers/sessions/coach/{{ timeperiod }}/team/{{ team.id }}">{{ team.name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% block main %}
|
||||
{% if theteam %}
|
||||
<h1>Coach Overview. Team {{ theteam.name }}</h1>
|
||||
{% else %}
|
||||
<h1>Coach Overview</h1>
|
||||
{% endif %}
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<table width="90%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>On or after</th>
|
||||
<th>On or before</th>
|
||||
<th>Preferred date</th>
|
||||
<th>Name</th>
|
||||
{% for r in rowers %}
|
||||
<th class="rotate"><div><span>
|
||||
{{ r.user.first_name }} {{ r.user.last_name }}
|
||||
|
||||
<table width="90%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th align="left">On or after</th>
|
||||
<th align="left">On or before</th>
|
||||
<th align="left">Preferred date</th>
|
||||
<th align="left">Name</th>
|
||||
{% for r in rowers %}
|
||||
<th class="rotate"><div><span>
|
||||
{{ r.user.first_name }} {{ r.user.last_name }}
|
||||
</span></div></th>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for thedict in statusdict %}
|
||||
<tr>
|
||||
<td>
|
||||
{{ thedict|lookup:'startdate'|date:"Y-m-d" }}
|
||||
</td>
|
||||
<td>
|
||||
{{ thedict|lookup:'enddate'|date:"Y-m-d" }}
|
||||
</td>
|
||||
<td>
|
||||
{{ thedict|lookup:'preferreddate'|date:"Y-m-d" }}
|
||||
</td>
|
||||
<td>
|
||||
<a href="/rowers/sessions/{{ thedict|lookup:"id" }}">
|
||||
{% if thedict|lookup:'name' %}
|
||||
{{ thedict|lookup:'name' }}
|
||||
{% else %}
|
||||
Unnamed Session
|
||||
{% endif %}
|
||||
</a>
|
||||
</td>
|
||||
{% for r in rowers %}
|
||||
<td>
|
||||
{% if thedict|lookup:'results'|lookup:r.id == 'completed' %}
|
||||
<a class="green dot"
|
||||
href="{% url 'plannedsession_view' id=thedict|lookup:"id" rowerid=r.id %}"> </a>
|
||||
{% elif thedict|lookup:'results'|lookup:r.id == 'partial' %}
|
||||
<a class="orange dot"
|
||||
href="{% url 'plannedsession_view' id=thedict|lookup:"id" rowerid=r.id %}"> </a>
|
||||
{% elif thedict|lookup:'results'|lookup:r.id == 'not done' %}
|
||||
<a class="white dot"
|
||||
href="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ r.id }}/session/{{ thedict|lookup:"id" }}"> </a>
|
||||
{% elif thedict|lookup:'results'|lookup:r.id == 'not assigned' %}
|
||||
|
||||
{% else %}
|
||||
<a class="red dot"
|
||||
href="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ r.id }}/session/{{ thedict|lookup:"id" }}"> </a>
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% if unmatchedworkouts %}
|
||||
<h1>Workouts that are not linked to any session</h1>
|
||||
<table width="90%" class="listtable shortpadded">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Rower</th>
|
||||
<th style="width:80"> Date</th>
|
||||
<th> Time</th>
|
||||
<th> Name</th>
|
||||
<th> Type</th>
|
||||
<th> Distance </th>
|
||||
<th> Duration </th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for workout in unmatchedworkouts %}
|
||||
<tr>
|
||||
<td> {{ workout.user.user.first_name }} {{ workout.user.user.last_name }} </td>
|
||||
<td> {{ workout.date|date:"Y-m-d" }} </td>
|
||||
<td> {{ workout.starttime|date:"H:i" }} </td>
|
||||
{% if workout.user.user == user or user == team.manager %}
|
||||
{% if workout.name != '' %}
|
||||
<td>
|
||||
<a href={% url rower.defaultlandingpage id=workout.id %}>
|
||||
{{ workout.name }}
|
||||
</a>
|
||||
</td>
|
||||
{% else %}
|
||||
<td>
|
||||
<a href={% url rower.defaultlandingpage id=workout.id %}>No Name
|
||||
</a></td>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if workout.name != '' %}
|
||||
<td><a href="/rowers/workout/{{ workout.id }}/">{{ workout.name }}</a></td>
|
||||
{% else %}
|
||||
<td><a href="/rowers/workout/{{ workout.id }}/">No Name</a> </td>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<td> {{ workout.workouttype }} </td>
|
||||
<td> {{ workout.distance }}m</td>
|
||||
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ workout.averagehr }} </td>
|
||||
<td> {{ workout.maxhr }} </td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for thedict in statusdict %}
|
||||
<tr>
|
||||
<td>
|
||||
{{ thedict|lookup:'startdate'|date:"Y-m-d" }}
|
||||
</td>
|
||||
<td>
|
||||
{{ thedict|lookup:'enddate'|date:"Y-m-d" }}
|
||||
</td>
|
||||
<td>
|
||||
{{ thedict|lookup:'preferreddate'|date:"Y-m-d" }}
|
||||
</td>
|
||||
<td>
|
||||
<a href="/rowers/sessions/{{ thedict|lookup:"id" }}">
|
||||
{% if thedict|lookup:'name' %}
|
||||
{{ thedict|lookup:'name' }}
|
||||
{% else %}
|
||||
Unnamed Session
|
||||
{% endif %}
|
||||
</a>
|
||||
</td>
|
||||
{% for r in rowers %}
|
||||
<td>
|
||||
{% if thedict|lookup:'results'|lookup:r.id == 'completed' %}
|
||||
<a class="green dot"
|
||||
href="{% url 'plannedsession_view' id=thedict|lookup:"id" rowerid=r.id %}"> </a>
|
||||
{% elif thedict|lookup:'results'|lookup:r.id == 'partial' %}
|
||||
<a class="orange dot"
|
||||
href="{% url 'plannedsession_view' id=thedict|lookup:"id" rowerid=r.id %}"> </a>
|
||||
{% elif thedict|lookup:'results'|lookup:r.id == 'not done' %}
|
||||
<a class="white dot"
|
||||
href="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ r.id }}/session/{{ thedict|lookup:"id" }}"> </a>
|
||||
{% elif thedict|lookup:'results'|lookup:r.id == 'not assigned' %}
|
||||
|
||||
{% else %}
|
||||
<a class="red dot"
|
||||
href="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ r.id }}/session/{{ thedict|lookup:"id" }}"> </a>
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% if unmatchedworkouts %}
|
||||
<h1>Workouts that are not linked to any session</h1>
|
||||
<table width="90%" class="listtable shortpadded">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Rower</th>
|
||||
<th style="width:80"> Date</th>
|
||||
<th> Time</th>
|
||||
<th> Name</th>
|
||||
<th> Type</th>
|
||||
<th> Distance </th>
|
||||
<th> Duration </th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for workout in unmatchedworkouts %}
|
||||
<tr>
|
||||
<td> {{ workout.user.user.first_name }} {{ workout.user.user.last_name }} </td>
|
||||
<td> {{ workout.date|date:"Y-m-d" }} </td>
|
||||
<td> {{ workout.starttime|date:"H:i" }} </td>
|
||||
{% if workout.user.user == user or user == team.manager %}
|
||||
{% if workout.name != '' %}
|
||||
<td>
|
||||
<a href={% url rower.defaultlandingpage id=workout.id %}>
|
||||
{{ workout.name }}
|
||||
</a>
|
||||
</td>
|
||||
{% else %}
|
||||
<td>
|
||||
<a href={% url rower.defaultlandingpage id=workout.id %}>No Name
|
||||
</a></td>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if workout.name != '' %}
|
||||
<td><a href="/rowers/workout/{{ workout.id }}/">{{ workout.name }}</a></td>
|
||||
{% else %}
|
||||
<td><a href="/rowers/workout/{{ workout.id }}/">No Name</a> </td>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<td> {{ workout.workouttype }} </td>
|
||||
<td> {{ workout.distance }}m</td>
|
||||
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ workout.averagehr }} </td>
|
||||
<td> {{ workout.maxhr }} </td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
|
||||
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -16,119 +16,71 @@
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<h1>Manage Plan Execution for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
</div>
|
||||
{% block main %}
|
||||
<h1>Manage Plan Execution for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
|
||||
<div id="timeperiod" class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||
<div class="dropdown-content">
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/manage/today/rower/{{ rower.id }}">
|
||||
Today
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/manage/thisweek/rower/{{ rower.id }}">
|
||||
This Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/manage/thismonth/rower/{{ rower.id }}">
|
||||
This Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/manage/lastweek/rower/{{ rower.id }}">
|
||||
Last Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/manage/lastmonth/rower/{{ rower.id }}">
|
||||
Last Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/manage/nextweek/rower/{{ rower.id }}">
|
||||
Next Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/manage/nextmonth/rower/{{ rower.id }}">
|
||||
Next Month
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ rower.user.first_name }} {{ rower.user.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_rowers %}
|
||||
<a class="button green small" href="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ member.id }}">{{ member.user.first_name }} {{ member.user.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<p>Select one session on the left, and one or more workouts on the right
|
||||
to match the workouts to the session. For tests and training sessions,
|
||||
the selected workouts must be done on the same date. For all sessions,
|
||||
the workout dates must be between the start and end date for the
|
||||
session.
|
||||
</p>
|
||||
<p>
|
||||
If you select a workout that has already been matched to another session,
|
||||
it will change to match this session.
|
||||
</p>
|
||||
<p>
|
||||
Workouts marked with a red check mark (<span style="color:red"><b>✔</b></span>)
|
||||
are currently linked to one of your sessions. A workout can only be assigned to
|
||||
one session at a time.
|
||||
</p>
|
||||
</div>
|
||||
<form id="session_form" action="/rowers/sessions/manage/{{ timeperiod }}/rower/{{ rower.id }}"
|
||||
<p>Select one session on the left, and one or more workouts on the right
|
||||
to match the workouts to the session. For tests and training sessions,
|
||||
the selected workouts must be done on the same date. For all sessions,
|
||||
the workout dates must be between the start and end date for the
|
||||
session.
|
||||
</p>
|
||||
<p>
|
||||
If you select a workout that has already been matched to another session,
|
||||
it will change to match this session.
|
||||
</p>
|
||||
<p>
|
||||
Workouts marked with a red check mark (<span style="color:red"><b>✔</b></span>)
|
||||
are currently linked to one of your sessions. A workout can only be assigned to
|
||||
one session at a time.
|
||||
</p>
|
||||
|
||||
<form id="session_form" action="/rowers/sessions/manage/user/{{ rower.user.id }}/?when={{ timeperiod }}"
|
||||
method="post">
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<p>Planned Sessions</p>
|
||||
<table width="100%">
|
||||
<tr>
|
||||
{% for field in ps_form.hidden_fields %}
|
||||
{{ field }}
|
||||
{% endfor %}
|
||||
{% for field in ps_form.visible_fields %}
|
||||
<td> {{ field }}</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<h2>Planned Sessions</h2>
|
||||
<table width="100%">
|
||||
<tr>
|
||||
{% for field in ps_form.hidden_fields %}
|
||||
{{ field }}
|
||||
{% endfor %}
|
||||
{% for field in ps_form.visible_fields %}
|
||||
<td> {{ field }}</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
<p>Workouts</p>
|
||||
<table width="100%">
|
||||
<tr>
|
||||
{% for field in w_form.hidden_fields %}
|
||||
{{ field }}
|
||||
{% endfor %}
|
||||
{% for field in w_form.visible_fields %}
|
||||
<td>
|
||||
{{ field }}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_2 prefix_2 suffix_8">
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<h2>Workouts</h2>
|
||||
<table width="100%">
|
||||
<tr>
|
||||
{% for field in w_form.hidden_fields %}
|
||||
{{ field }}
|
||||
{% endfor %}
|
||||
{% for field in w_form.visible_fields %}
|
||||
<td>
|
||||
{{ field }}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
{% csrf_token %}
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block scripts %}
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
|
||||
<script>
|
||||
@@ -144,13 +96,13 @@
|
||||
function getURL() {
|
||||
var url = window.location.pathname;
|
||||
var selectedsession = $("input:radio[name='plannedsession']:checked").val();
|
||||
|
||||
if (url.indexOf("/session/") >= 0) {
|
||||
url = url.replace(/\/session\/\d+/g, "/session/"+selectedsession);
|
||||
} else {
|
||||
url += "/session/"+selectedsession
|
||||
url = url.replace("manage","manage/session/"+selectedsession);
|
||||
};
|
||||
|
||||
url += '?when={{ timeperiod }}'
|
||||
|
||||
return url};
|
||||
|
||||
function loadJSON( url ) {
|
||||
|
||||
@@ -1,134 +1,90 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}New Planned Session{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
</div>
|
||||
{% block main %}
|
||||
<h1>Create Team Session</h1>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>Create Team Session</h1>
|
||||
</div>
|
||||
<div id="timeperiod" class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||
<div class="dropdown-content">
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/today/rower/{{ rower.id }}">
|
||||
Today
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/thisweek/rower/{{ rower.id }}">
|
||||
This Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/thismonth/rower/{{ rower.id }}">
|
||||
This Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/lastweek/rower/{{ rower.id }}">
|
||||
Last Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/lastmonth/rower/{{ rower.id }}">
|
||||
Last Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/nextweek/rower/{{ rower.id }}">
|
||||
Next Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/nextmonth/rower/{{ rower.id }}">
|
||||
Next Month
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
{% csrf_token %}
|
||||
|
||||
<div id="right" class="grid_6 alpha">
|
||||
<h1>Select Team</h1>
|
||||
<p>
|
||||
<table>
|
||||
{{ teamform.as_table }}
|
||||
</table></p>
|
||||
{% if plannedsessions %}
|
||||
<h1>Team Plan Sessions</h1>
|
||||
<p>
|
||||
<table class="listtable shortpadded" width="80%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>After</th>
|
||||
<th>Before</th>
|
||||
<th>Name</th>
|
||||
<th>Value</th>
|
||||
<th> </th>
|
||||
<th>Edit</th>
|
||||
<th>Clone</th>
|
||||
<th>Delete</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for ps in plannedsessions %}
|
||||
<tr>
|
||||
<td> {{ ps.startdate|date:"Y-m-d" }} </td>
|
||||
<td> {{ ps.enddate|date:"Y-m-d" }} </td>
|
||||
<td>
|
||||
{% if ps.name != '' %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}">{{ ps.name }}</a>
|
||||
{% else %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}">Unnamed Session</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td> {{ ps.sessionvalue }} </td>
|
||||
<td> {{ ps.sessionunit }} </td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/edit">Edit</a>
|
||||
</td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/clone">Clone</a>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm">Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="grid_6 omega">
|
||||
<h1>New Session</h1>
|
||||
<h1>Select Team</h1>
|
||||
<p>
|
||||
<table>
|
||||
{{ teamform.as_table }}
|
||||
</table></p>
|
||||
{% if plannedsessions %}
|
||||
<h1>Team Plan Sessions</h1>
|
||||
<p>
|
||||
<table class="listtable shortpadded" width="80%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>After</th>
|
||||
<th>Before</th>
|
||||
<th>Name</th>
|
||||
<th>Value</th>
|
||||
<th> </th>
|
||||
<th>Edit</th>
|
||||
<th>Clone</th>
|
||||
<th>Delete</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for ps in plannedsessions %}
|
||||
<tr>
|
||||
<td> {{ ps.startdate|date:"Y-m-d" }} </td>
|
||||
<td> {{ ps.enddate|date:"Y-m-d" }} </td>
|
||||
<td>
|
||||
{% if ps.name != '' %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}">{{ ps.name }}</a>
|
||||
{% else %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}">Unnamed Session</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td> {{ ps.sessionvalue }} </td>
|
||||
<td> {{ ps.sessionunit }} </td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/edit">Edit</a>
|
||||
</td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/clone">Clone</a>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm">Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<h1>New Session</h1>
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
<div id="formbutton" class="grid_1 prefix_4 suffix_1">
|
||||
<input class="button green" type="submit" value="Save">
|
||||
<input class="button green" type="submit" value="Save">
|
||||
<div id="id_guidance" class="padded">
|
||||
|
||||
</div>
|
||||
</form>
|
||||
<div class="grid_6" id="id_guidance">
|
||||
</li>
|
||||
</ul>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
@@ -234,3 +190,7 @@
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,151 +1,106 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}New Planned Session{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
</div>
|
||||
{% block main %}
|
||||
<h1>Edit Team Session</h1>
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
{% csrf_token %}
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>Edit Team Session</h1>
|
||||
</div>
|
||||
<div id="timeperiod" class="grid_2 dropdown">
|
||||
<button class="grid_2 alpha button gray small dropbtn">Select Time Period ({{ timeperiod|verbosetimeperiod }})</button>
|
||||
<div class="dropdown-content">
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/today/rower/{{ rower.id }}">
|
||||
Today
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/thisweek/rower/{{ rower.id }}">
|
||||
This Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/thismonth/rower/{{ rower.id }}">
|
||||
This Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/lastweek/rower/{{ rower.id }}">
|
||||
Last Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/lastmonth/rower/{{ rower.id }}">
|
||||
Last Month
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/nextweek/rower/{{ rower.id }}">
|
||||
Next Week
|
||||
</a>
|
||||
<a class="button gray small alpha"
|
||||
href="/rowers/sessions/create/nextmonth/rower/{{ rower.id }}">
|
||||
Next Month
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
{% csrf_token %}
|
||||
|
||||
<div id="right" class="grid_6 alpha">
|
||||
<h1>Select Team</h1>
|
||||
<p>
|
||||
Selecting a team assigns this session to all members of the team.
|
||||
Unselecting a team does not remove rowers
|
||||
who are already assigned to this session. Use the Rowers selection for that.
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<h1>Select Team</h1>
|
||||
<p>
|
||||
Selecting a team assigns this session to all members of the team.
|
||||
Unselecting a team does not remove rowers
|
||||
who are already assigned to this session. Use the Rowers selection for that.
|
||||
</p><p>
|
||||
<table>
|
||||
{{ teamform.as_table }}
|
||||
</table></p>
|
||||
<h1>Select Rowers</h1>
|
||||
<p>
|
||||
<table>
|
||||
{{ rowersform.as_table }}
|
||||
</table>
|
||||
<table>
|
||||
{{ teamform.as_table }}
|
||||
</table></p>
|
||||
<h1>Select Rowers</h1>
|
||||
<p>
|
||||
<table>
|
||||
{{ rowersform.as_table }}
|
||||
</table>
|
||||
</p>
|
||||
{% if plannedsessions %}
|
||||
<h1>Team Plan Sessions</h1>
|
||||
<p>
|
||||
<table class="listtable shortpadded" width="80%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>After</th>
|
||||
<th>Before</th>
|
||||
<th>Name</th>
|
||||
<th>Value</th>
|
||||
<th> </th>
|
||||
<th>Edit</th>
|
||||
<th>Clone</th>
|
||||
<th>Delete</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for ps in plannedsessions %}
|
||||
<tr>
|
||||
<td> {{ ps.startdate|date:"Y-m-d" }} </td>
|
||||
<td> {{ ps.enddate|date:"Y-m-d" }} </td>
|
||||
<td>
|
||||
{% if ps.name != '' %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}">{{ ps.name }}</a>
|
||||
{% else %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}">Unnamed Session</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td> {{ ps.sessionvalue }} </td>
|
||||
<td> {{ ps.sessionunit }} </td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/edit">Edit</a>
|
||||
</td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/clone">Clone</a>
|
||||
</td>
|
||||
{% if plannedsessions %}
|
||||
<h1>Team Plan Sessions</h1>
|
||||
<p>
|
||||
<table class="listtable shortpadded" width="80%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>After</th>
|
||||
<th>Before</th>
|
||||
<th>Name</th>
|
||||
<th>Value</th>
|
||||
<th> </th>
|
||||
<th>Edit</th>
|
||||
<th>Clone</th>
|
||||
<th>Delete</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for ps in plannedsessions %}
|
||||
<tr>
|
||||
<td> {{ ps.startdate|date:"Y-m-d" }} </td>
|
||||
<td> {{ ps.enddate|date:"Y-m-d" }} </td>
|
||||
<td>
|
||||
{% if ps.name != '' %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}">{{ ps.name }}</a>
|
||||
{% else %}
|
||||
<a class="small"
|
||||
href="/rowers/sessions/{{ ps.id }}">Unnamed Session</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td> {{ ps.sessionvalue }} </td>
|
||||
<td> {{ ps.sessionunit }} </td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/edit">Edit</a>
|
||||
</td>
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/clone">Clone</a>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm">Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
|
||||
<td>
|
||||
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm">Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="grid_6 omega">
|
||||
<h1>Session {{ plannedsession.name }}</h1>
|
||||
<h1>Session {{ plannedsession.name }}</h1>
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
<div class="grid_1 prefix_2 alpha">
|
||||
<a class="red button small" href="/rowers/sessions/{{ plannedsession.id }}/deleteconfirm">Delete</a>
|
||||
</div>
|
||||
<div class="grid_1">
|
||||
<a class="gray button small" href="/rowers/sessions/{{ plannedsession.id }}/clone">Clone</a>
|
||||
</div>
|
||||
<div id="formbutton" class="grid_1 suffix_1 omega">
|
||||
<p>
|
||||
<a href="/rowers/sessions/{{ plannedsession.id }}/deleteconfirm">Delete</a>
|
||||
</p>
|
||||
<p>
|
||||
<a href="/rowers/sessions/{{ plannedsession.id }}/clone">Clone</a>
|
||||
</p>
|
||||
<p>
|
||||
<input class="button green" type="submit" value="Save">
|
||||
</div>
|
||||
</form>
|
||||
<div class="grid_6" id="id_guidance">
|
||||
</p>
|
||||
<div id="id_guidance" class="padded">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
@@ -258,3 +213,7 @@
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -7,158 +7,145 @@
|
||||
|
||||
{% block title %}Planned Session{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
{% include "planningbuttons.html" %}
|
||||
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_2 alpha">
|
||||
{% if user.is_authenticated and psdict.id.1|is_session_manager:user %}
|
||||
<a class="button small gray" href="/rowers/sessions/{{ psdict.id.1 }}/edit/rower/{{ rower.id }}">
|
||||
{% if user.is_authenticated and psdict.id.1|is_session_manager:user %}
|
||||
<p>
|
||||
<a href="/rowers/sessions/{{ psdict.id.1 }}/edit/user/{{ rower.user.id }}">
|
||||
Edit Session</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2">
|
||||
{% if plannedsession.sessiontype == 'coursetest' %}
|
||||
<a class="button small gray" href="/rowers/list-courses">Courses</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>Session {{ psdict.name.1 }}</h1>
|
||||
<table class="listtable shortpadded" width="95%">
|
||||
{% for attr in attrs %}
|
||||
{% for key,value in psdict.items %}
|
||||
{% if key == attr %}
|
||||
<tr>
|
||||
{% if key == 'comment' %}
|
||||
<td><b>{{ value.0 }}</b></td><td class="wrapwords">{{ value.1|linebreaks }}</td>
|
||||
{% else %}
|
||||
<td><b>{{ value.0 }}</b></td><td class="wrapwords">{{ value.1 }}</td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
<div id="right" class="grid_6 omega">
|
||||
{% if plannedsession.sessiontype == 'test' or plannedsession.sessiontype == 'coursetest' %}
|
||||
<h1>Ranking</h1>
|
||||
<table id="rankingtable" class="listtable shortpadded tablesorter" width="80%">
|
||||
<thead>
|
||||
</p>
|
||||
{% endif %}
|
||||
<h1>Session {{ psdict.name.1 }}</h1>
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<table class="listtable shortpadded" width="95%">
|
||||
{% for attr in attrs %}
|
||||
{% for key,value in psdict.items %}
|
||||
{% if key == attr %}
|
||||
<tr>
|
||||
<th>Nr</th>
|
||||
<th>Name</th>
|
||||
<th>Distance</th>
|
||||
<th>Time</th>
|
||||
<th>Date</th>
|
||||
<th>Type</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for result in ranking %}
|
||||
{% if result|lookup:'coursecompleted' %}
|
||||
<tr>
|
||||
<td>{{ forloop.counter }}</td>
|
||||
<td>{{ result|lookup:'name' }}</td>
|
||||
<td>{{ result|lookup:'distance' }}</td>
|
||||
<td>{{ result|lookup:'time'|deltatimeprint }}</td>
|
||||
<td>{{ result|lookup:'date'|date:"Y-m-d" }}</td>
|
||||
<td>{{ result|lookup:'type' }}</td>
|
||||
{% if key == 'comment' %}
|
||||
<td><b>{{ value.0 }}</b></td><td class="wrapwords">{{ value.1|linebreaks }}</td>
|
||||
{% else %}
|
||||
<td><b>{{ value.0 }}</b></td><td class="wrapwords">{{ value.1 }}</td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endif %}
|
||||
<h1>Workouts attached</h1>
|
||||
<table class="listtable shortpadded" width="80%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Date</th>
|
||||
<th>Name</th>
|
||||
<th>Distance</th>
|
||||
<th>Duration</th>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
{% if plannedsession.sessiontype == 'test' or plannedsession.sessiontype == 'coursetest' %}
|
||||
<h2>Ranking</h2>
|
||||
<table id="rankingtable" class="listtable shortpadded tablesorter" width="80%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nr</th>
|
||||
<th>Name</th>
|
||||
<th>Distance</th>
|
||||
<th>Time</th>
|
||||
<th>Date</th>
|
||||
<th>Type</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for result in ranking %}
|
||||
{% if result|lookup:'coursecompleted' %}
|
||||
<tr>
|
||||
<td>{{ forloop.counter }}</td>
|
||||
<td>{{ result|lookup:'name' }}</td>
|
||||
<td>{{ result|lookup:'distance' }}</td>
|
||||
<td>{{ result|lookup:'time'|deltatimeprint }}</td>
|
||||
<td>{{ result|lookup:'date'|date:"Y-m-d" }}</td>
|
||||
<td>{{ result|lookup:'type' }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endif %}
|
||||
<h1>Workouts attached</h1>
|
||||
<table class="listtable shortpadded" width="80%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Date</th>
|
||||
<th>Name</th>
|
||||
<th>Distance</th>
|
||||
<th>Duration</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for workout in workouts %}
|
||||
<tr>
|
||||
<tbody>
|
||||
{% for workout in workouts %}
|
||||
<tr>
|
||||
<td> {{ workout.date|date:"Y-m-d" }} </td>
|
||||
<td>
|
||||
<div class="tooltip">
|
||||
<a href={% url manager.defaultlandingpage id=workout.id %}>
|
||||
{{ workout.name }}
|
||||
</a>
|
||||
<span class="tooltiptext">{{ workout.notes }}</span>
|
||||
<a href={% url manager.defaultlandingpage id=workout.id %}>
|
||||
{{ workout.name }}
|
||||
</a>
|
||||
<span class="tooltiptext">{{ workout.notes }}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td> {{ workout.distance }}m</td>
|
||||
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
<h1>{{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
<p>Status: {{ status }}</p>
|
||||
<p>Percentage complete: {{ ratio }} </p>
|
||||
</div>
|
||||
<div id="right" class="grid_6 omega">
|
||||
<h1>Stats</h1>
|
||||
<table class="listtable shortpadded" width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Minutes</th>
|
||||
<th>Meters</th>
|
||||
<th>rScore</th>
|
||||
<th>TRIMP</th>
|
||||
<th>Complete Date</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for id, value in results.items %}
|
||||
<tr>
|
||||
<td>{{ value|lookup:'first_name' }} {{ value|lookup:'last_name' }}</td>
|
||||
<td>{{ value|lookup:'duration' }}</td>
|
||||
<td>{{ value|lookup:'distance' }}</td>
|
||||
<td>{{ value|lookup:'rscore' }}</td>
|
||||
<td>{{ value|lookup:'trimp' }}</td>
|
||||
<td>{{ value|lookup:'completedate' }}</td>
|
||||
<td>{{ value|lookup:'status' }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div id="left" class="grid_6 alpha">
|
||||
{% if coursescript %}
|
||||
<h1>Course</h1>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<h2>{{ rower.user.first_name }} {{ rower.user.last_name }}</h2>
|
||||
<p>Status: {{ status }}</p>
|
||||
<p>Percentage complete: {{ ratio }} </p>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<h2>Stats</h2>
|
||||
<table class="listtable shortpadded" width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Minutes</th>
|
||||
<th>Meters</th>
|
||||
<th>rScore</th>
|
||||
<th>TRIMP</th>
|
||||
<th>Complete Date</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for id, value in results.items %}
|
||||
<tr>
|
||||
<td>{{ value|lookup:'first_name' }} {{ value|lookup:'last_name' }}</td>
|
||||
<td>{{ value|lookup:'duration' }}</td>
|
||||
<td>{{ value|lookup:'distance' }}</td>
|
||||
<td>{{ value|lookup:'rscore' }}</td>
|
||||
<td>{{ value|lookup:'trimp' }}</td>
|
||||
<td>{{ value|lookup:'completedate' }}</td>
|
||||
<td>{{ value|lookup:'status' }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
{% if coursescript %}
|
||||
<li class="grid_2">
|
||||
<h2>Course</h2>
|
||||
{{ coursediv|safe }}
|
||||
|
||||
|
||||
{{ coursescript|safe }}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
<script type="text/javascript" src="/static/admin/js/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="/static/admin/js/jquery.tablesorter.min.js"></script>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Workouts{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
<h1>New Workouts Imported From Polar Flow</h1>
|
||||
|
||||
<p>Due to a limitation in Polar Flow's API, we can only access new workouts. We
|
||||
@@ -47,3 +47,7 @@
|
||||
<p> No new workouts found </p>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workouts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
+236
-202
@@ -1,211 +1,245 @@
|
||||
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Rowsandall Pro Membership{% endblock title %}
|
||||
{% block content %}
|
||||
{% extends "newbase.html" %}
|
||||
{% block title %}Rowsandall Pro Membership{% endblock title %}
|
||||
{% block main %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
<div class="grid_6 alpha">
|
||||
<h2>Pro Membership</h2>
|
||||
<h1>Paid Membership Plans</h1>
|
||||
|
||||
<p>Donations are welcome to keep this web site going. To help cover the hosting
|
||||
costs, I have created several paid plans offering advanced functionality.
|
||||
Once I process your
|
||||
donation, I will give you access to some <q>special</q> features on this
|
||||
website. </p>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<p>Donations are welcome to keep this web site going. To help cover the hosting
|
||||
costs, I have created several paid plans offering advanced functionality.
|
||||
Once I process your
|
||||
donation, I will give you access to some <q>special</q> features on this
|
||||
website. </p>
|
||||
|
||||
<p>The following table gives an overview of the different plans. As we are
|
||||
constantly developing new functionality, the table might be slightly outdated. Don't
|
||||
hesitate to contact us. </p>
|
||||
<p>The following table gives an overview of the different plans. As we are
|
||||
constantly developing new functionality, the table might be slightly outdated. Don't
|
||||
hesitate to contact us. </p>
|
||||
|
||||
<p>The Pro membership is open for a free 14 day trial</p>
|
||||
<p>The Pro membership is open for a free 14 day trial</p>
|
||||
<p>
|
||||
<table class="listtable paddedtable" width="80%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th>BASIC</th>
|
||||
<th>PRO</th>
|
||||
<th>SELF-COACH</th>
|
||||
<th>COACH</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Basic rowing metrics (spm, time, distance, heart rate, power)</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Manual Import, Export, Synchronization and download of all your data</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Automatic Synchronization with other fitness sites</td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Heart rate and power zones</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ranking Pieces, Stroke Analysis</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Advanced Analysis (Critical Power, Stats, Box Chart, Trend Flex)</td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Compare Workouts</td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Empower Stroke Profile</td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Sensor Fusion, Split Workout, In-stroke metrics</td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create Training plans, tests and challenges for yourself. Track your performance
|
||||
against plan.</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create Training plans, tests and challenges for your athletes. Track their performance
|
||||
against plan. </td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create and manage teams.</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Manage your athlete's workouts</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
<h2>Coach and Self-Coach Membership</h2>
|
||||
|
||||
<p>The Coach plan functionality listed is available to the coach only. Individual athletes
|
||||
can purchase upgrades to "Pro" and "Self-Coach" plans.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<table class="listtable paddedtable" width="80%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<th>BASIC</th>
|
||||
<th>PRO</th>
|
||||
<th>SELF-COACH</th>
|
||||
<th>COACH</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Basic rowing metrics (spm, time, distance, heart rate, power)</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Manual Import, Export, Synchronization and download of all your data</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Automatic Synchronization with other fitness sites</td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Heart rate and power zones</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ranking Pieces, Stroke Analysis</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Advanced Analysis (Critical Power, Stats, Box Chart, Trend Flex)</td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Compare Workouts</td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Empower Stroke Profile</td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Sensor Fusion, Split Workout, In-stroke metrics</td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create Training plans, tests and challenges for yourself. Track your performance
|
||||
against plan.</td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create Training plans, tests and challenges for your athletes. Track their performance
|
||||
against plan. </td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create and manage teams.</a>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Manage your athlete's workouts</a>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td> </td>
|
||||
<td>✔</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<p>The Coach plan functionality listed is available to the coach only. Individual athletes
|
||||
can purchase upgrades to Pro membership.
|
||||
</p>
|
||||
<p>Click on the PayPal button to pay for your Pro membership. Before you pay, please <a href="/rowers/register">register</a> for the free Basic membership and add your user name to the form.
|
||||
Your payment will be valid for one year with automatic renewal which you can stop at any time.
|
||||
You will be taken to the secure PayPal payment site.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid_6 omega">
|
||||
{% if user.rower.rowerplan == 'basic' and user.rower.protrialexpires|date_dif == 1 %}
|
||||
<h2>Free Trial</h2>
|
||||
<p>
|
||||
You qualify for a 14 day free trial. No credit card needed.
|
||||
Try out Pro or Self-Coach membership for two weeks. Click the button below to
|
||||
sign up for the trial. After your trial period expires, you will be
|
||||
automatically reset to the Basic plan, unless you upgrade to Pro.
|
||||
</p>
|
||||
<div class="grid_6"><p><a class="button green small" href="/rowers/starttrial">Yes, I want to try Pro membership for 14 days for free. No strings attached.</a></p></div>
|
||||
<div class="grid_6"> </div>
|
||||
<div class="grid_6"><p><a class="button green small" href="/rowers/startplantrial">Yes, I want to try Self-Coach membership for 14 days for free. No strings attached.</a></p></div>
|
||||
{% endif %}
|
||||
|
||||
<h2>Recurring Payment</h2>
|
||||
<p>You need a Paypal account for this</p>
|
||||
<p>
|
||||
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
|
||||
<input type="hidden" name="cmd" value="_s-xclick">
|
||||
<input type="hidden" name="hosted_button_id" value="964GLEXX3THAW">
|
||||
<table>
|
||||
<tr><td><input type="hidden" name="on0" value="Plans">Plans</td></tr><tr><td><select name="os0">
|
||||
<option value="Pro Membership">Pro Membership : €15.00 EUR - yearly</option>
|
||||
<option value="Self-Coach Membership">Self-Coach Membership : €65.00 EUR - yearly</option>
|
||||
<option value="Coach 4 athletes or less">Coach 4 athletes or less : €90.00 EUR - yearly</option>
|
||||
<option value="Coach 4-10 athletes">Coach 4-10 athletes : €200.00 EUR - yearly</option>
|
||||
<option value="Coach more than 10 athletes">Coach more than 10 athletes : €450.00 EUR - yearly</option>
|
||||
</select> </td></tr>
|
||||
<tr><td><input type="hidden" name="on1" value="Your User Name">Your User Name</td></tr><tr><td><input type="text" name="os1" maxlength="200"></td></tr>
|
||||
</table>
|
||||
<input type="hidden" name="currency_code" value="EUR">
|
||||
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_subscribeCC_LG_global.gif" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
|
||||
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
|
||||
</form>
|
||||
</p>
|
||||
|
||||
<h2>One Year Subscription</h2>
|
||||
<p>Only a credit card needed. Will not automatically renew</p>
|
||||
|
||||
<p>
|
||||
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
|
||||
<input type="hidden" name="cmd" value="_s-xclick">
|
||||
<input type="hidden" name="hosted_button_id" value="2YB32HQTF96QW">
|
||||
<table>
|
||||
<tr><td><input type="hidden" name="on0" value="Plans">Plans</td></tr><tr><td><select name="os0">
|
||||
<option value="Pro Membership">Pro Membership €20.00 EUR</option>
|
||||
<option value="Self-Coach Membership">Self-Coach Membership €75.00 EUR</option>
|
||||
<option value="Coach - 4 athletes or less">Coach - 4 athletes or less €120.00 EUR</option>
|
||||
<option value="Coach - 4-10 athletes">Coach - 4-10 athletes €250.00 EUR</option>
|
||||
<option value="Coach - more than 10 athletes">Coach - more than 10 athletes €500.00 EUR</option>
|
||||
</select> </td></tr>
|
||||
<tr><td><input type="hidden" name="on1" value="Your User Name">Your User Name</td></tr><tr><td><input type="text" name="os1" maxlength="200"></td></tr>
|
||||
</table>
|
||||
<input type="hidden" name="currency_code" value="EUR">
|
||||
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
|
||||
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
|
||||
</form>
|
||||
</p>
|
||||
|
||||
|
||||
<h2>Payment Processing</h2>
|
||||
<p>After you do the payment, we will manually change your membership to
|
||||
"Pro". Depending on our availability, this may take some time
|
||||
(typically one working day). Don't hesitate to contact us
|
||||
if you have any questions at this stage.</p>
|
||||
|
||||
<p>If, for any reason, you are not happy with your Pro membership, please let me know through the contact form. I will contact you as soon as possible to discuss how we can make things better.</p>
|
||||
|
||||
</div>
|
||||
<p>Rowsandall.com's Training Planning functionality
|
||||
is part of the paid "Self-Coach" and "Coach" plans.</p>
|
||||
|
||||
<p>On the "Self-Coach" plan, you can plan your own sessions.</p>
|
||||
|
||||
<p>On the "Coach" plan, you can establish teams, see workouts done by
|
||||
athletes on your team, and plan individual and group sessions for your
|
||||
athletes.
|
||||
</p>
|
||||
|
||||
<p>If you would like to find a coach who helps you plan your training
|
||||
through rowsandall.com, contact me throught the contact form.</p>
|
||||
|
||||
{% if user.rower.rowerplan == 'basic' and user.rower.protrialexpires|date_dif == 1 %}
|
||||
<h2>Free Trial</h2>
|
||||
<p>
|
||||
You qualify for a 14 day free trial. No credit card needed.
|
||||
Try out Pro or Self-Coach membership for two weeks. Click the button below to
|
||||
sign up for the trial. After your trial period expires, you will be
|
||||
automatically reset to the Basic plan, unless you upgrade to Pro.
|
||||
</p>
|
||||
<p><a class="button green small" href="/rowers/starttrial">Yes, I want to try Pro membership for 14 days for free. No strings attached.</a></p>
|
||||
<p><a class="button green small" href="/rowers/startplantrial">Yes, I want to try Self-Coach membership for 14 days for free. No strings attached.</a></p>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>Click on the PayPal button to pay for your Pro membership. Before you pay, please <a href="/rowers/register">register</a> for the free Basic membership and add your user name to the form.
|
||||
Your payment will be valid for one year.
|
||||
You will be taken to the secure PayPal payment site.
|
||||
</p>
|
||||
<h2>Recurring Payment</h2>
|
||||
<p>You need a Paypal account for this. This is plan will automatically renew each year.</p>
|
||||
<p>
|
||||
<form class="paypal" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
|
||||
<input type="hidden" name="cmd" value="_s-xclick">
|
||||
<input type="hidden" name="hosted_button_id" value="964GLEXX3THAW">
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="hidden" name="on0" value="Plans">Plans
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<select name="os0">
|
||||
<option value="Pro Membership">Pro Membership : €15.00 EUR - yearly</option>
|
||||
<option value="Self-Coach Membership">Self-Coach Membership : €65.00 EUR - yearly</option>
|
||||
<option value="Coach 4 athletes or less">Coach 4 athletes or less : €90.00 EUR - yearly</option>
|
||||
<option value="Coach 4-10 athletes">Coach 4-10 athletes : €200.00 EUR - yearly</option>
|
||||
<option value="Coach more than 10 athletes">Coach more than 10 athletes : €450.00 EUR - yearly</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="hidden" name="on1" value="Your User Name">Your User Name
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="text" name="os1" maxlength="200">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<input type="hidden" name="currency_code" value="EUR">
|
||||
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_subscribeCC_LG_global.gif" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
|
||||
<img class="paypalpix" alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
|
||||
</form>
|
||||
</p>
|
||||
<h2>One Year Subscription</h2>
|
||||
<p>Only a credit card needed. Will not automatically renew</p>
|
||||
|
||||
<p>
|
||||
<form class="paypal" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top"
|
||||
>
|
||||
<input type="hidden" name="cmd" value="_s-xclick">
|
||||
<input type="hidden" name="hosted_button_id" value="2YB32HQTF96QW">
|
||||
<table>
|
||||
<tr><td><input type="hidden" name="on0" value="Plans">Plans</td></tr><tr><td><select name="os0">
|
||||
<option value="Pro Membership">Pro Membership €20.00 EUR</option>
|
||||
<option value="Self-Coach Membership">Self-Coach Membership €75.00 EUR</option>
|
||||
<option value="Coach - 4 athletes or less">Coach - 4 athletes or less €120.00 EUR</option>
|
||||
<option value="Coach - 4-10 athletes">Coach - 4-10 athletes €250.00 EUR</option>
|
||||
<option value="Coach - more than 10 athletes">Coach - more than 10 athletes €500.00 EUR</option>
|
||||
</select> </td></tr>
|
||||
<tr><td><input type="hidden" name="on1" value="Your User Name">Your User Name</td></tr><tr><td><input type="text" name="os1" maxlength="200"></td></tr>
|
||||
</table>
|
||||
<input type="hidden" name="currency_code" value="EUR">
|
||||
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
|
||||
<img class="paypalpix" alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
|
||||
</form>
|
||||
</p>
|
||||
<h2>Payment Processing</h2>
|
||||
<p>After you do the payment, we will manually change your membership to
|
||||
"Pro". Depending on our availability, this may take some time
|
||||
(typically one working day). Don't hesitate to contact us
|
||||
if you have any questions at this stage.</p>
|
||||
|
||||
<p>If, for any reason, you are not happy with your Pro membership, please let me know through the contact form. I will contact you as soon as possible to discuss how we can make things better.</p>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
{% endblock content %}
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_help.html' %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -16,36 +16,33 @@
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<h1>Submit Your Result for {{ race.name }}</h1>
|
||||
</div>
|
||||
{% block main %}
|
||||
<h1>Submit Your Result for {{ race.name }}</h1>
|
||||
|
||||
</div>
|
||||
|
||||
<form id="race_submit_form"
|
||||
method="post">
|
||||
<div class="grid_12 alpha">
|
||||
<p>Select one of the following workouts that you rowed within the race window</p>
|
||||
<table width="100%">
|
||||
<tr>
|
||||
{% for field in w_form.hidden_fields %}
|
||||
{{ field }}
|
||||
{% endfor %}
|
||||
{% for field in w_form.visible_fields %}
|
||||
<td>
|
||||
{{ field.label }}
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
<form id="race_submit_form"
|
||||
method="post">
|
||||
<p>Select one of the following workouts that you rowed within the race window</p>
|
||||
<table width="100%">
|
||||
<tr>
|
||||
{% for field in w_form.hidden_fields %}
|
||||
{{ field }}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="grid_2 prefix_2 suffix_8">
|
||||
{% csrf_token %}
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% for field in w_form.visible_fields %}
|
||||
<td>
|
||||
{{ field.label }}
|
||||
{{ field }}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</table>
|
||||
<p>
|
||||
{% csrf_token %}
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
</form>
|
||||
@@ -53,3 +50,7 @@
|
||||
|
||||
{% block scripts %}
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_racing.html' %}
|
||||
{% endblock %}
|
||||
|
||||
+302
-360
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
@@ -11,378 +11,320 @@
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% block main %}
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
<script type="text/javascript" src="/static/js/bokeh-0.12.3.min.js"></script>
|
||||
<script async="true" type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
<script>
|
||||
// Set things up to resize the plot on a window resize. You can play with
|
||||
// the arguments of resize_width_height() to change the plot's behavior.
|
||||
var plot_resize_setup = function () {
|
||||
var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot
|
||||
var plot = Bokeh.index[plotid];
|
||||
var plotresizer = function() {
|
||||
// arguments: use width, use height, maintain aspect ratio
|
||||
plot.resize_width_height(true, true, false);
|
||||
};
|
||||
window.addEventListener('resize', plotresizer);
|
||||
plotresizer();
|
||||
};
|
||||
window.addEventListener('load', plot_resize_setup);
|
||||
</script>
|
||||
<style>
|
||||
/* Need this to get the page in "desktop mode"; not having an infinite height.*/
|
||||
html, body {height: 100%; margin:5px;}
|
||||
</style>
|
||||
{{ interactiveplot |safe }}
|
||||
|
||||
|
||||
<div id="title" class="grid_12 alpha">
|
||||
<div class="grid_10 alpha">
|
||||
{% if theuser %}
|
||||
<h3>{{ theuser.first_name }}'s Ranking Pieces</h3>
|
||||
{% else %}
|
||||
<h3>{{ user.first_name }}'s Ranking Pieces</h3>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% if user.is_authenticated and user|is_manager %}
|
||||
<div class="grid_2 alpha dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ theuser.first_name }} {{ theuser.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for member in user|team_members %}
|
||||
<a class="button green small" href="/rowers/{{ member.id }}/ote-bests2/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">{{ member.first_name }} {{ member.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% if theuser %}
|
||||
<h1>{{ theuser.first_name }}'s Ranking Pieces</h1>
|
||||
{% else %}
|
||||
<h1>{{ user.first_name }}'s Ranking Pieces</h1>
|
||||
{% endif %}
|
||||
|
||||
<div id="summary" class="grid_6 alpha">
|
||||
<p>Summary for {{ theuser.first_name }} {{ theuser.last_name }}
|
||||
between {{ startdate|date }} and {{ enddate|date }}</p>
|
||||
<ul class="main-content">
|
||||
<li class="grid_4">
|
||||
|
||||
<p>Direct link for other users:
|
||||
<a href="/rowers/{{ id }}/ote-bests/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">https://rowsandall.com/rowers/{{ id }}/ote-bests/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}</a>
|
||||
</p>
|
||||
|
||||
<p>The table gives the best efforts achieved on the
|
||||
<a href="https://log.concept2.com/rankings">official Concept2 ranking pieces</a> in the selected date range. Also the percentile scores on the
|
||||
chart are based on the Concept2 rankings.</p>
|
||||
|
||||
|
||||
</div>
|
||||
<div id="form" class="grid_6 omega">
|
||||
<p>Use this form to select a different date range:</p>
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
<div class="grid_4 alpha">
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
<input name='daterange' class="button green" type="submit" value="Submit"> </form>
|
||||
</div>
|
||||
<div class="grid_4 alpha">
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
Or use the last {{ deltaform }} days.
|
||||
</div>
|
||||
<div class="grid_2 omega">
|
||||
{% csrf_token %}
|
||||
<input name='datedelta' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
|
||||
<h2>Ranking Piece Results</h2>
|
||||
|
||||
{% if rankingworkouts %}
|
||||
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Distance</th>
|
||||
<th> Duration</th>
|
||||
<th> Date</th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
<th> Edit</th>
|
||||
<tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for workout in rankingworkouts %}
|
||||
<tr>
|
||||
<td> {{ workout.distance }} </td>
|
||||
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ workout.date }} </td>
|
||||
<td> {{ workout.averagehr }} </td>
|
||||
<td> {{ workout.maxhr }} </td>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}/edit">{{ workout.name }}</a> </td>
|
||||
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p> No ranking workouts found </p>
|
||||
{% endif %}
|
||||
|
||||
<p>Missing your best pieces? Upload stroke data of any Concept2
|
||||
ranking piece and they will be automatically added to this page.</p>
|
||||
<p> Don't have stroke data for official Concept2 ranking pieces?
|
||||
The <a href="/rowers/promembership">PRO membership</a> ranking piece functionality
|
||||
allows you to include your best non ranking pieces and even use
|
||||
parts of workouts for improved calculation accuracy.
|
||||
</p>
|
||||
|
||||
<p>Want to add race results but you don't have stroke data?
|
||||
<a href="/rowers/addmanual">Click here.</a></p>
|
||||
|
||||
<p>Scroll down for the chart and pace predictions for ranking pieces.</p>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div id="theplot" class="grid_12 alpha">
|
||||
|
||||
<h2>Critical Power Plot</h2>
|
||||
<h2>Critical Power Plot</h2>
|
||||
|
||||
{{ the_div|safe }}
|
||||
|
||||
{% if age %}
|
||||
<p>The dashed lines are based on the
|
||||
<a href="https://log.concept2.com/rankings">Concept2</a>
|
||||
rankings for your age, gender
|
||||
and weight category. World class means within 5% of
|
||||
<a href="http://www.concept2.com/indoor-rowers/racing/records/world">
|
||||
World Record</a> in terms
|
||||
of power.
|
||||
The percentile lines are estimates of where the percentiles
|
||||
of the Concept2 rankings historically are for those of exactly
|
||||
your age, gender and weight class.
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div id="predictions" class="grid_12 alpha">
|
||||
<h2>Pace predictions for Ranking Pieces</h2>
|
||||
|
||||
<p>Add non-ranking piece using the form. The piece will be added in the prediction tables below. </p>
|
||||
<div class="grid_4 alpha">
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{{ form.value }} {{ form.pieceunit }}
|
||||
|
||||
{% if age %}
|
||||
<p>The dashed lines are based on the
|
||||
<a href="https://log.concept2.com/rankings">Concept2</a>
|
||||
rankings for your age, gender
|
||||
and weight category. World class means within 5% of
|
||||
<a href="http://www.concept2.com/indoor-rowers/racing/records/world">
|
||||
World Record</a> in terms
|
||||
of power.
|
||||
The percentile lines are estimates of where the percentiles
|
||||
of the Concept2 rankings historically are for those of exactly
|
||||
your age, gender and weight class.
|
||||
</p>
|
||||
{% endif %}
|
||||
</li>
|
||||
<li class="grid_4">
|
||||
<h2>Ranking Piece Results</h2>
|
||||
|
||||
{% if rankingworkouts %}
|
||||
|
||||
<table width="100%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Distance</th>
|
||||
<th> Duration</th>
|
||||
<th> Date</th>
|
||||
<th> Avg HR </th>
|
||||
<th> Max HR </th>
|
||||
<th> Edit</th>
|
||||
<tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for workout in rankingworkouts %}
|
||||
<tr>
|
||||
<td> {{ workout.distance }} </td>
|
||||
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
|
||||
<td> {{ workout.date }} </td>
|
||||
<td> {{ workout.averagehr }} </td>
|
||||
<td> {{ workout.maxhr }} </td>
|
||||
<td>
|
||||
<a href="/rowers/workout/{{ workout.id }}/edit">
|
||||
{{ workout.name }}
|
||||
</a>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
{% csrf_token %}
|
||||
</div>
|
||||
<div class="grid_2 suffix_6 omega">
|
||||
<input name="piece" class="button green"
|
||||
formaction="/rowers/{{ id }}/ote-bests/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}"
|
||||
type="submit" value="Add">
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p> No ranking workouts found </p>
|
||||
{% endif %}
|
||||
|
||||
<p>Missing your best pieces? Upload stroke data of any Concept2
|
||||
ranking piece and they will be automatically added to this page.</p>
|
||||
<p> Don't have stroke data for official Concept2 ranking pieces?
|
||||
The <a href="/rowers/promembership">PRO membership</a> ranking piece functionality
|
||||
allows you to include your best non ranking pieces and even use
|
||||
parts of workouts for improved calculation accuracy.
|
||||
</p>
|
||||
|
||||
<p>Want to add race results but you don't have stroke data?
|
||||
<a href="/rowers/addmanual">Click here.</a></p>
|
||||
|
||||
<p>Scroll down for the chart and pace predictions for ranking pieces.</p>
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
<li class="grid_2">
|
||||
<h2>Pace predictions for Ranking Pieces</h2>
|
||||
|
||||
<p>Add non-ranking piece using the form. The piece will be added in the prediction tables below. </p>
|
||||
<form enctype="multipart/form-data" action="{{ formloc }}" method="post">
|
||||
{{ form.value }} {{ form.pieceunit }}
|
||||
|
||||
{% csrf_token %}
|
||||
|
||||
<input name="piece" class="button green"
|
||||
formaction="/rowers/ote-bests/user/{{ id }}/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}"
|
||||
type="submit" value="Add">
|
||||
</form>
|
||||
</div>
|
||||
</li>/
|
||||
|
||||
|
||||
|
||||
<div id="paul" class="grid_6 alpha">
|
||||
<h3>Paul's Law</h3>
|
||||
{% if nrdata >= 1 %}
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Duration</th>
|
||||
<th> Distance</th>
|
||||
<th> Power </th>
|
||||
<th> Pace </th>
|
||||
<tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for pred in predictions %}
|
||||
<tr>
|
||||
{% for key, value in pred.items %}
|
||||
{% if key == "distance" %}
|
||||
<td> {{ value }} m </td>
|
||||
{% endif %}
|
||||
{% if key == "pace" %}
|
||||
<td> {{ value |paceprint }} </td>
|
||||
{% endif %}
|
||||
{% if key == "power" %}
|
||||
<td> {{ value }} W </td>
|
||||
{% endif %}
|
||||
{% if key == "duration" %}
|
||||
<td> {{ value |deltatimeprint }} </td>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
<p>Insufficient data to make predictions</p>
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
<div id="cpmodel" class="grid_6 omega">
|
||||
<h3>CP Model</h3>
|
||||
{% if nrdata >= 4 %}
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Duration</th>
|
||||
<th> Distance</th>
|
||||
<th> Power </th>
|
||||
<th> Pace </th>
|
||||
<tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for pred in cpredictions %}
|
||||
<tr>
|
||||
{% for key, value in pred.items %}
|
||||
{% if key == "distance" %}
|
||||
<td> {{ value }} m </td>
|
||||
{% endif %}
|
||||
{% if key == "pace" %}
|
||||
<td> {{ value |paceprint }} </td>
|
||||
{% endif %}
|
||||
{% if key == "power" %}
|
||||
<td> {{ value }} W </td>
|
||||
{% endif %}
|
||||
{% if key == "duration" %}
|
||||
<td> {{ value |deltatimeprint }} </td>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
<p>Insufficient data to make predictions</p>
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="grid_6 alpha">
|
||||
{% if age and sex != 'not specified' %}
|
||||
<h1>World Records</h1>
|
||||
<table width = "70%" class="listtable">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/100m">100m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/500m">500m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/1000m">1000m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/2000m">2000m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/5000m">5000m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/6000m">6000m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/10000m">10000m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/21097m">Half Marathon
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/42195m">Full Marathon
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/1min">1 minute
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/4min">4 minutes
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/30min">30 minutes
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/60min">1 hour
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<li class="grid_2">
|
||||
<h2>Paul's Law</h2>
|
||||
{% if nrdata >= 1 %}
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Duration</th>
|
||||
<th> Distance</th>
|
||||
<th> Power </th>
|
||||
<th> Pace </th>
|
||||
<tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for pred in predictions %}
|
||||
<tr>
|
||||
{% for key, value in pred.items %}
|
||||
{% if key == "distance" %}
|
||||
<td> {{ value }} m </td>
|
||||
{% endif %}
|
||||
{% if key == "pace" %}
|
||||
<td> {{ value |paceprint }} </td>
|
||||
{% endif %}
|
||||
{% if key == "power" %}
|
||||
<td> {{ value }} W </td>
|
||||
{% endif %}
|
||||
{% if key == "duration" %}
|
||||
<td> {{ value |deltatimeprint }} </td>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
If you fill in your birth date and gender, you will see World Records for
|
||||
your age group and gender at this place. You can edit your settings
|
||||
<a href="/rowers/me/edit">here</a>.
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<p>Insufficient data to make predictions</p>
|
||||
|
||||
{% endif %}
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<h2>CP Model</h2>
|
||||
{% if nrdata >= 4 %}
|
||||
<table width="70%" class="listtable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Duration</th>
|
||||
<th> Distance</th>
|
||||
<th> Power </th>
|
||||
<th> Pace </th>
|
||||
<tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for pred in cpredictions %}
|
||||
<tr>
|
||||
{% for key, value in pred.items %}
|
||||
{% if key == "distance" %}
|
||||
<td> {{ value }} m </td>
|
||||
{% endif %}
|
||||
{% if key == "pace" %}
|
||||
<td> {{ value |paceprint }} </td>
|
||||
{% endif %}
|
||||
{% if key == "power" %}
|
||||
<td> {{ value }} W </td>
|
||||
{% endif %}
|
||||
{% if key == "duration" %}
|
||||
<td> {{ value |deltatimeprint }} </td>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
<p>Insufficient data to make predictions</p>
|
||||
|
||||
{% endif %}
|
||||
</li>
|
||||
{% if age and sex != 'not specified' %}
|
||||
<li>
|
||||
<h2>World Records</h2>
|
||||
<table width = "100%" class="listtable">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/100m">100m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/500m">500m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/1000m">1000m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/2000m">2000m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/5000m">5000m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/6000m">6000m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/10000m">10000m
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/21097m">Half Marathon
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/42195m">Full Marathon
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/1min">1 minute
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/4min">4 minutes
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/30min">30 minutes
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="/rowers/agegrouprecords/{{ sex }}/{{ weightcategory }}/60min">1 hour
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li class="grid_2">
|
||||
<p>Use this form to select a different date range:</p>
|
||||
<p>
|
||||
Select start and end date for a date range:
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
|
||||
<table>
|
||||
{{ dateform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input name='daterange' class="button green" type="submit" value="Submit">
|
||||
</form>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
<p>Summary for {{ theuser.first_name }} {{ theuser.last_name }}
|
||||
between {{ startdate|date }} and {{ enddate|date }}</p>
|
||||
|
||||
<p>The table gives the best efforts achieved on the
|
||||
<a href="https://log.concept2.com/rankings">official Concept2 ranking pieces</a> in the selected date range. Also the percentile scores on the
|
||||
chart are based on the Concept2 rankings.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_analytics.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -4,10 +4,30 @@
|
||||
|
||||
{% block main %}
|
||||
<h1>Main</h1>
|
||||
<p>Vestibulum consectetur sit amet nisi ut consectetur. Praesent efficitur, nibh vitae fringilla scelerisque, est neque faucibus quam, in iaculis purus libero eget mauris. Curabitur et luctus sapien, ac gravida orci. Aliquam erat volutpat. In hac habitasse platea dictumst. Aenean commodo, arcu a commodo efficitur, libero dolor mollis turpis, non posuere orci leo eget enim. Curabitur sit amet elementum orci, pulvinar dignissim urna. Morbi id ex eu ex congue laoreet. Aenean tincidunt dolor justo, semper pretium libero luctus nec. Ut vulputate metus accumsan leo imperdiet tincidunt. Phasellus nec rutrum dolor. Cras imperdiet sollicitudin arcu, id interdum nibh <a href="">fermentum</a> in.
|
||||
</p>
|
||||
<p>Vestibulum consectetur sit amet nisi ut consectetur. Praesent efficitur, nibh vitae fringilla scelerisque, est neque faucibus quam, in iaculis purus libero eget mauris. Curabitur et luctus sapien, ac gravida orci. Aliquam erat volutpat. In hac habitasse platea dictumst. Aenean commodo, arcu a commodo efficitur, libero dolor mollis turpis, non posuere orci leo eget enim. Curabitur sit amet elementum orci, pulvinar dignissim urna. Morbi id ex eu ex congue laoreet. Aenean tincidunt dolor justo, semper pretium libero luctus nec. Ut vulputate metus accumsan leo imperdiet tincidunt. Phasellus nec rutrum dolor. Cras imperdiet sollicitudin arcu, id interdum nibh <a href="">fermentum</a> in.
|
||||
</p>
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="grid_4"><img src="http://placehold.it/1200x1000" alt="placeholder"></li>
|
||||
<li class="grid_2"><img src="http://placehold.it/350x200" alt="placeholder"></li>
|
||||
<li class="grid_2"><img src="http://placehold.it/350x200" alt="placeholder"></li>
|
||||
<li><img src="http://placehold.it/350x200" alt="placeholder"></li>
|
||||
<li><img src="http://placehold.it/350x200" alt="placeholder"></li>
|
||||
<li><img src="http://placehold.it/200x300" alt="placeholder"></li>
|
||||
<li><img src="http://placehold.it/200x300" alt="placeholder"></li>
|
||||
<li><img src="http://placehold.it/350x200" alt="placeholder"></li>
|
||||
<li><img src="http://placehold.it/200x300" alt="placeholder"></li>
|
||||
<li><img src="http://placehold.it/200x300" alt="placeholder"></li>
|
||||
<li><img src="http://placehold.it/200x300" alt="placeholder"></li>
|
||||
<li class="grid_4">
|
||||
<p>Vestibulum consectetur sit amet nisi ut consectetur. Praesent efficitur, nibh vitae fringilla scelerisque, est neque faucibus quam, in iaculis purus libero eget mauris. Curabitur et luctus sapien, ac gravida orci. Aliquam erat volutpat. In hac habitasse platea dictumst. Aenean commodo, arcu a commodo efficitur, libero dolor mollis turpis, non posuere orci leo eget enim. Curabitur sit amet elementum orci, pulvinar dignissim urna. Morbi id ex eu ex congue laoreet. Aenean tincidunt dolor justo, semper pretium libero luctus nec. Ut vulputate metus accumsan leo imperdiet tincidunt. Phasellus nec rutrum dolor. Cras imperdiet sollicitudin arcu, id interdum nibh <a href="">fermentum</a> in.
|
||||
<ul>
|
||||
<li>One</li>
|
||||
<li>Two</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>Vestibulum consectetur sit amet nisi ut consectetur. Praesent efficitur, nibh vitae fringilla scelerisque, est neque faucibus quam, in iaculis purus libero eget mauris. Curabitur et luctus sapien, ac gravida orci. Aliquam erat volutpat. In hac habitasse platea dictumst. Aenean commodo, arcu a commodo efficitur, libero dolor mollis turpis, non posuere orci leo eget enim. Curabitur sit amet elementum orci, pulvinar dignissim urna. Morbi id ex eu ex congue laoreet. Aenean tincidunt dolor justo, semper pretium libero luctus nec. Ut vulputate metus accumsan leo imperdiet tincidunt. Phasellus nec rutrum dolor. Cras imperdiet sollicitudin arcu, id interdum nibh <a href="">fermentum</a> in.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
</p>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_plan.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
</p>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_racing.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
</p>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workout.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
</p>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_workouts.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,27 +1,18 @@
|
||||
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Contact Us - Thank You{% endblock title %}
|
||||
{% block content %}
|
||||
<h3>Thank you.</h3>
|
||||
<p>Thank you for registering. You can now login using the credential you provided. You can also view some of the videos below to get you started.</p>
|
||||
{% extends "newbase.html" %}
|
||||
{% block title %}Contact Us - Thank You{% endblock title %}
|
||||
{% block main %}
|
||||
<h1>Thank you for registering</h1>
|
||||
<p>Thank you for registering. You can now login using the credentials you provided. </p>
|
||||
<p>Return <a href="/">home</a></p>
|
||||
|
||||
|
||||
<h3>Basic Navigation</h3>
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/-rrTWTS23sM" frameborder="0" allowfullscreen></iframe>
|
||||
|
||||
<h3>Upload Page</h3>
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/IsUtdh30USw" frameborder="0" allowfullscreen></iframe>
|
||||
|
||||
<h3>Integration with Strava, SportTracks or Concept2 logbook</h3>
|
||||
|
||||
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/wF_P6x0uSL4" frameborder="0" allowfullscreen></iframe></p>
|
||||
|
||||
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/rjNwXCh7jKg" frameborder="0" allowfullscreen></iframe></p>
|
||||
|
||||
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/WfccMz3SbAc" frameborder="0" allowfullscreen></iframe></p>
|
||||
|
||||
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/90AXO4dppT4" frameborder="0" allowfullscreen></iframe></p>
|
||||
|
||||
|
||||
{% endblock content %}
|
||||
{% endblock main %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_help.html' %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -1,45 +1,50 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
{% block title %}Contact Us{% endblock title %}
|
||||
{% block meta %}
|
||||
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div id="registrationform" class="grid_6 alpha">
|
||||
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
{% csrf_token %}
|
||||
<table width=100%>
|
||||
{{ form.as_table }}
|
||||
{% block main %}
|
||||
<h1>New User Registration</h1>
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<div id="registrationform">
|
||||
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
{% csrf_token %}
|
||||
<table width=100%>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
<div class="grid_1 alpha">
|
||||
<a class="button gray small" href="/rowers/legal">Terms of Service</a>
|
||||
</div>
|
||||
<div id="formbutton" class="grid_1 prefix_3 suffix_1 omega">
|
||||
<a href="/rowers/legal">Terms of Service</a>
|
||||
<input class="button green" type="submit" value="Submit">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
<p> To use rowsandall, you need to register and agree with the Terms of Service. </p>
|
||||
<p> Registration is free. </p>
|
||||
|
||||
<p>Some of our advanced services only work if you give us your
|
||||
(approximate) birth date, sex and weight category, with 72.5 kg the
|
||||
bounday between heavies and lighties for men, and 59 kg for women.
|
||||
</p>
|
||||
|
||||
<p>Also, we are restricting access to the site to 16 years and older
|
||||
because of EU data protection regulations.</p>
|
||||
|
||||
</div>
|
||||
{% endblock content %}
|
||||
</form>
|
||||
</div>
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
|
||||
<p> To use rowsandall, you need to register and agree with the Terms of Service. </p>
|
||||
<p> Registration is free. </p>
|
||||
|
||||
<p>Some of our advanced services only work if you give us your
|
||||
(approximate) birth date, sex and weight category, with 72.5 kg the
|
||||
bounday between heavies and lighties for men, and 59 kg for women.
|
||||
</p>
|
||||
|
||||
<p>Also, we are restricting access to the site to 16 years and older
|
||||
because of EU data protection regulations.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
{% endblock main %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_help.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,31 +1,28 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
|
||||
{% block title %}Change Rower Export Settings{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 suffix_6 alpha">
|
||||
<p>
|
||||
<h2>Export Settings</h2>
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
{% block main %}
|
||||
<h1>Import and Export Settings for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div class="grid_2 prefix_2 suffix_2">
|
||||
<input class="button green" type="submit" value="Save">
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<input class="button green" type="submit" value="Save">
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_profile.html' %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,117 +1,25 @@
|
||||
{% extends "base.html" %}
|
||||
{% extends "newbase.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
|
||||
{% block title %}Change Rower {% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_8 alpha">
|
||||
<h1>User Settings for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
<p><a href="http://analytics.rowsandall.com/2017/11/02/rowsandall-settings-page-tutorial/">Need help? Click to read the tutorial</a></p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega dropdown">
|
||||
<button class="grid_2 alpha button green small dropbtn">
|
||||
{{ rower.user.first_name }} {{ rower.user.last_name }}
|
||||
</button>
|
||||
<div class="dropdown-content">
|
||||
{% for rower in user|team_rowers %}
|
||||
<a class="button green small" href="/rowers/rower/edit/{{ rower.id }}">{{ rower.user.first_name }} {{ rower.user.last_name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_6 alpha">
|
||||
{% block main %}
|
||||
<h1>User Settings for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||
|
||||
<p><a href="http://analytics.rowsandall.com/2017/11/02/rowsandall-settings-page-tutorial/">Need help? Click to read the tutorial</a></p>
|
||||
|
||||
<ul class="main-content">
|
||||
<li class="grid_2">
|
||||
<h2>Account Information</h2>
|
||||
<p>
|
||||
<h2>Heart Rate Zones</h2>
|
||||
<p>Set your heart rate zones with this form.</p>
|
||||
{% if form.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
{% if rower.user == user %}
|
||||
<a class="button blue small" href="/password_change/">Password Change</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div class="grid_2 prefix_2 suffix_2">
|
||||
<input class="button green" type="submit" value="Save">
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
<p>
|
||||
<h2>Power Zones</h2>
|
||||
<p>The power zones are defined relative to power as measured by the
|
||||
indoor rower.</p>
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
{% if powerzonesform.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ powerzonesform.errors|pluralize }} below.
|
||||
{{ powerzonesform.non_field_errors }}
|
||||
|
||||
</p>
|
||||
{% endif %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th><th>Zone Name</th><th>Lower Boundary (Watt)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td><td>{{ powerzonesform.ut3name }}</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td><td>{{ powerzonesform.ut2name }}</td>
|
||||
<td>{{ powerzonesform.pw_ut2 }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td><td>{{ powerzonesform.ut1name }}</td>
|
||||
<td>{{ powerzonesform.pw_ut1 }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>4</td><td>{{ powerzonesform.atname }}</td>
|
||||
<td>{{ powerzonesform.pw_at }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>5</td><td>{{ powerzonesform.trname }}</td>
|
||||
<td>{{ powerzonesform.pw_tr }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>6</td><td>{{ powerzonesform.anname }}</td>
|
||||
<td>{{ powerzonesform.pw_an }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div class="grid_2 prefix_2 suffix_2">
|
||||
<input class="button green" type="submit" value="Save">
|
||||
</div>
|
||||
</form>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<p>
|
||||
<h2>Account Information</h2>
|
||||
<div class="grid_6 alpha">
|
||||
<div class="grid_2 suffix_4 alpha">
|
||||
<p>
|
||||
{% if rower.user == user %}
|
||||
<a class="button gray small" href="/password_change/">Password Change</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</p>
|
||||
{% if userform.errors %}
|
||||
{% if userform.errors %}
|
||||
<p style="color: red;">
|
||||
Please correct the error{{ form.errors|pluralize }} below.
|
||||
</p>
|
||||
@@ -133,137 +41,59 @@
|
||||
</tr>
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div class="grid_2 alpha">
|
||||
{% if rower.rowerplan == 'basic' and rower.user == user %}
|
||||
<a class="button blue" href="/rowers/promembership">Upgrade</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="grid_2 suffix_2 omega">
|
||||
<input class="button green" type="submit" value="Save">
|
||||
{% if rower.rowerplan == 'basic' and rower.user == user %}
|
||||
<a class="button blue" href="/rowers/promembership">Upgrade</a>
|
||||
{% else %}
|
||||
|
||||
{% endif %}
|
||||
<input class="button green" type="submit" value="Save">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
</li>
|
||||
{% if rower.user == user %}
|
||||
<li class="grid_2">
|
||||
<h2>GDPR - Data Protection</h2>
|
||||
<p>
|
||||
<h2>Functional Threshold Power and OTW Slack</h2>
|
||||
<p>Use this form to quickly change your zones based on the power of a
|
||||
recent
|
||||
full out 60 minutes effort on the ergometer.
|
||||
It will update all zones defined above.</p>
|
||||
<p>The OTW Power Slack is the percentage drop of your On-the-water
|
||||
rowing power
|
||||
vs the erg power. Typical values are around 15%. This will lower
|
||||
the power zones for your OTW workouts.</p>
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<table>
|
||||
{{ powerform.as_table }}
|
||||
</table>
|
||||
{% csrf_token %}
|
||||
<div class="grid_2 prefix_2 suffix_2">
|
||||
<input class="button green" type="submit" value="Save">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% if rower.user == user %}
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<p>
|
||||
<h2>Teams</h2>
|
||||
<div class="grid_2 suffix_4 alpha">
|
||||
<a class="button gray small" href="/rowers/me/teams">Manage Teams</a>
|
||||
</div>
|
||||
<a class="button blue small" href="/rowers/exportallworkouts">Download your data</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid_6 omega">
|
||||
<p>
|
||||
<h2>Favorite Charts</h2>
|
||||
<div class="grid_2 suffix_4 alpha">
|
||||
<a class="button gray small" href="/rowers/me/favoritecharts">Manage Favorite Charts</a>
|
||||
</div>
|
||||
<a class="button blue small" href="/rowers/me/deactivate">Deactivate Account</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<p>
|
||||
<h2>Export Settings</h2>
|
||||
<div class="grid_2 suffix_4 alpha">
|
||||
<a class="button gray small" href="/rowers/me/exportsettings">Manage Export Settings</a>
|
||||
</div>
|
||||
<a class="button red small" href="/rowers/me/delete">Delete Account</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
<p>
|
||||
<h2>Configure Workflow Layout</h2>
|
||||
<div class="grid_2 suffix_4 alpha">
|
||||
<a class="button gray small" href="/rowers/me/workflowconfig2">Manage Workflow Layout</a>
|
||||
</div>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="grid_12 alpha">
|
||||
<div class="grid_6 alpha">
|
||||
<p>
|
||||
<h2>GDPR - Data Protection</h2>
|
||||
<div class="grid_2 suffix_4 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/exportallworkouts">Download your data</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_4 alpha">
|
||||
<p>
|
||||
<a class="button gray small" href="/rowers/me/deactivate">Deactivate Account</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_2 suffix_4 alpha">
|
||||
<p>
|
||||
<a class="button red small" href="/rowers/me/delete">Delete Account</a>
|
||||
</p>
|
||||
</div>
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid_6 omega">
|
||||
</li>
|
||||
<li class="grid_2">
|
||||
{% if grants %}
|
||||
<p>
|
||||
<h2>Applications</h2>
|
||||
<table width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Application</th>
|
||||
<th>Scope</th>
|
||||
<th>Revoke</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for grant in grants %}
|
||||
<tr>
|
||||
<td>{{ grant.application }}</td>
|
||||
<td>{{ grant.scope }}</td>
|
||||
<td>
|
||||
<a class="button red small" href="/rowers/me/revokeapp/{{ grant.application.id }}">Revoke</a>
|
||||
<h2>Applications</h2>
|
||||
<table width="100%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Application</th>
|
||||
<th>Scope</th>
|
||||
<th>Revoke</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for grant in grants %}
|
||||
<tr>
|
||||
<td>{{ grant.application }}</td>
|
||||
<td>{{ grant.scope }}</td>
|
||||
<td>
|
||||
<a class="button red small" href="/rowers/me/revokeapp/{{ grant.application.id }}">Revoke</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</p>
|
||||
{% else %}
|
||||
<p> </p>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'menu_profile.html' %}
|
||||
{% endblock %}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user