added workflow view
This commit is contained in:
@@ -2499,25 +2499,64 @@ def interactive_flex_chart2(id=0,promember=0,
|
|||||||
|
|
||||||
return [script,div,js_resources,css_resources,workstrokesonly]
|
return [script,div,js_resources,css_resources,workstrokesonly]
|
||||||
|
|
||||||
def thumbnail_flex_chart(id=0,promember=0,
|
def thumbnails_set(r,id,favorites):
|
||||||
xparam='time',
|
charts = []
|
||||||
yparam1='pace',
|
|
||||||
yparam2='hr',
|
|
||||||
plottype='line',
|
|
||||||
workstrokesonly=False):
|
|
||||||
|
|
||||||
|
columns = [f.xparam for f in favorites]
|
||||||
|
columns += [f.yparam1 for f in favorites]
|
||||||
|
columns += [f.yparam2 for f in favorites]
|
||||||
|
|
||||||
#rowdata,row = dataprep.getrowdata_db(id=id)
|
columns += ['time']
|
||||||
columns = [xparam,yparam1,yparam2,'time']
|
rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True)
|
||||||
|
rowdata.dropna(axis=1,how='all',inplace=True)
|
||||||
rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True,
|
|
||||||
workstrokesonly=workstrokesonly)
|
|
||||||
|
|
||||||
if rowdata.empty:
|
if rowdata.empty:
|
||||||
rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True,
|
return [
|
||||||
workstrokesonly=False)
|
{'script':"",
|
||||||
workstrokesonly=False
|
'div':"",
|
||||||
|
'notes':""
|
||||||
|
}]
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
rowdata.sort_values(by='time',ascending=True,inplace=True)
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
l = len(rowdata)
|
||||||
|
maxlength = 50
|
||||||
|
if l > maxlength:
|
||||||
|
bins = np.linspace(rowdata['time'].min(),rowdata['time'].max(),maxlength)
|
||||||
|
groups = rowdata.groupby(np.digitize(rowdata['time'],bins))
|
||||||
|
rowdata = groups.mean()
|
||||||
|
|
||||||
|
for f in favorites:
|
||||||
|
workstrokesonly = not f.reststrokes
|
||||||
|
script,div = thumbnail_flex_chart(
|
||||||
|
rowdata,
|
||||||
|
id=id,
|
||||||
|
xparam=f.xparam,
|
||||||
|
yparam1=f.yparam1,
|
||||||
|
yparam2=f.yparam2,
|
||||||
|
plottype=f.plottype,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
charts.append({
|
||||||
|
'script':script,
|
||||||
|
'div':div,
|
||||||
|
'notes':f.notes})
|
||||||
|
|
||||||
|
return charts
|
||||||
|
|
||||||
|
|
||||||
|
def thumbnail_flex_chart(rowdata,id=0,promember=0,
|
||||||
|
xparam='time',
|
||||||
|
yparam1='pace',
|
||||||
|
yparam2='hr',
|
||||||
|
plottype='line',
|
||||||
|
workstrokesonly=False):
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
tests = rowdata[yparam2]
|
tests = rowdata[yparam2]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -2528,25 +2567,7 @@ def thumbnail_flex_chart(id=0,promember=0,
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
yparam1 = 'None'
|
yparam1 = 'None'
|
||||||
|
|
||||||
rowdata.dropna(axis=1,how='all',inplace=True)
|
|
||||||
|
|
||||||
if rowdata.empty:
|
|
||||||
return "","No valid data"
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
rowdata.sort_values(by='time',ascending=True,inplace=True)
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
workoutstateswork = [1,4,5,8,9,6,7]
|
|
||||||
workoutstatesrest = [3]
|
|
||||||
workoutstatetransition = [0,2,10,11,12,13]
|
|
||||||
|
|
||||||
if workstrokesonly:
|
|
||||||
try:
|
|
||||||
rowdata = rowdata[~rowdata['workoutstate'].isin(workoutstatesrest)]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
tseconds = rowdata.ix[:,'time']
|
tseconds = rowdata.ix[:,'time']
|
||||||
@@ -2620,11 +2641,6 @@ def thumbnail_flex_chart(id=0,promember=0,
|
|||||||
plot.yaxis.axis_label_text_font_size = "7pt"
|
plot.yaxis.axis_label_text_font_size = "7pt"
|
||||||
plot.xaxis.major_label_text_font_size = "7pt"
|
plot.xaxis.major_label_text_font_size = "7pt"
|
||||||
plot.yaxis.major_label_text_font_size = "7pt"
|
plot.yaxis.major_label_text_font_size = "7pt"
|
||||||
# add watermark
|
|
||||||
plot.extra_y_ranges = {"watermark": watermarkrange}
|
|
||||||
plot.extra_x_ranges = {"watermark": watermarkrange}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if plottype=='line':
|
if plottype=='line':
|
||||||
plot.line('x1','y1',source=source)
|
plot.line('x1','y1',source=source)
|
||||||
|
|||||||
11
rowers/templates/flexthumbnails.html
Normal file
11
rowers/templates/flexthumbnails.html
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{% for chart in charts %}
|
||||||
|
<div class="grid_3 alpha">
|
||||||
|
<h4>{{ forloop.counter }}</h4>
|
||||||
|
<div class="grid_3 tooltip">
|
||||||
|
<a href="/rowers/workout/{{ workout.id }}/flexchart?favoritechart={{ forloop.counter |add:"-1" }}">
|
||||||
|
{{ chart.div | safe }}
|
||||||
|
</a>
|
||||||
|
<span class="tooltiptext">{{ chart.notes }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
15
rowers/templates/panel_editbuttons.html
Normal file
15
rowers/templates/panel_editbuttons.html
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<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 alpha">
|
||||||
|
<p>
|
||||||
|
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/advanced">Advanced</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid_2 alpha">
|
||||||
|
<p>
|
||||||
|
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/editintervals">Edit Intervals</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
8
rowers/templates/panel_statcharts.html
Normal file
8
rowers/templates/panel_statcharts.html
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{% 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/waiting.png'"
|
||||||
|
alt="{{ graph.filename }}" width="180" height="150"></a>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
20
rowers/templates/panel_staticchart.html
Normal file
20
rowers/templates/panel_staticchart.html
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<div class="grid_2 alpha">
|
||||||
|
<p>
|
||||||
|
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/addtimeplot">Add Time Plot</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid_2 alpha">
|
||||||
|
<p>
|
||||||
|
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/adddistanceplot">Add Distance Plot</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid_2 alpha">
|
||||||
|
<p>
|
||||||
|
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/addpiechart">Add Pie Chart</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid_2 alpha">
|
||||||
|
<p>
|
||||||
|
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/addpowerpiechart">Add Power Pie Chart</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
5
rowers/templates/panel_stats.html
Normal file
5
rowers/templates/panel_stats.html
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<div class="grid_2 alpha">
|
||||||
|
<p>
|
||||||
|
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/stats">Workout Stats</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
5
rowers/templates/panel_summary.html
Normal file
5
rowers/templates/panel_summary.html
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<p>
|
||||||
|
<pre>
|
||||||
|
{{ workout.summary }}
|
||||||
|
</pre>
|
||||||
|
</p>
|
||||||
@@ -25,17 +25,29 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div id="workouts" class="grid_12 alpha">
|
<div id="page" class="grid_12 alpha">
|
||||||
{% for chart in charts %}
|
<div class="grid_10 prefix_2 alpha">
|
||||||
<div class="grid_3 alpha">
|
<h1>{{ workout.name }}</h1>
|
||||||
<h2>{{ forloop.counter }}</h2>
|
|
||||||
<div class="grid_3 tooltip">
|
|
||||||
<a href="/rowers/workout/{{ workout.id }}/flexchart?favoritechart={{ forloop.counter |add:"-1" }}">
|
|
||||||
{{ chart.div | safe }}
|
|
||||||
</a>
|
|
||||||
<span class="tooltiptext">{{ chart.notes }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
<div id="leftpanel" class="grid_2 alpha">
|
||||||
|
{% block left_panel %}
|
||||||
|
{% for templateName in leftTemplates %}
|
||||||
|
{% include templateName %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
<div id="middlepanel" class="grid_9">
|
||||||
|
{% block middle_panel %}
|
||||||
|
{% for templateName in middleTemplates %}
|
||||||
|
<div class="grid_9">
|
||||||
|
{% include templateName %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
<div id="rightpanel" class="grid_1">
|
||||||
|
{% block right_panel %}
|
||||||
|
<p> </p>
|
||||||
|
{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -5850,6 +5850,8 @@ def workout_comparison_view2(request,id1=0,id2=0,xparam='distance',
|
|||||||
# Flex thumbnails
|
# Flex thumbnails
|
||||||
@login_required()
|
@login_required()
|
||||||
def workout_workflow_view(request,id):
|
def workout_workflow_view(request,id):
|
||||||
|
request.session['referer'] = absolute(request)['PATH']
|
||||||
|
request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE
|
||||||
try:
|
try:
|
||||||
row = Workout.objects.get(id=id)
|
row = Workout.objects.get(id=id)
|
||||||
except Workout.DoesNotExist:
|
except Workout.DoesNotExist:
|
||||||
@@ -5876,28 +5878,28 @@ def workout_workflow_view(request,id):
|
|||||||
|
|
||||||
charts = []
|
charts = []
|
||||||
|
|
||||||
if favorites:
|
if favorites:
|
||||||
for f in favorites:
|
charts = thumbnails_set(r,id,favorites)
|
||||||
workstrokesonly = not f.reststrokes
|
|
||||||
script,div = thumbnail_flex_chart(id=id,promember=promember,
|
|
||||||
xparam=f.xparam,
|
|
||||||
yparam1=f.yparam1,
|
|
||||||
yparam2=f.yparam2,
|
|
||||||
plottype=f.plottype,
|
|
||||||
workstrokesonly=workstrokesonly)
|
|
||||||
|
|
||||||
charts.append({
|
|
||||||
'script':script,
|
|
||||||
'div':div,
|
|
||||||
'notes':f.notes})
|
|
||||||
|
|
||||||
|
statcharts = GraphImage.objects.filter(workout=row)
|
||||||
|
|
||||||
|
# This will be user configurable in the future
|
||||||
|
middleTemplates = ['panel_statcharts.html','flexthumbnails.html',
|
||||||
|
'panel_summary.html']
|
||||||
|
leftTemplates = [
|
||||||
|
'panel_editbuttons.html','panel_staticchart.html',
|
||||||
|
'panel_stats.html'
|
||||||
|
]
|
||||||
|
|
||||||
return render(request,
|
return render(request,
|
||||||
'workflow.html',
|
'workflow.html',
|
||||||
{
|
{
|
||||||
|
'middleTemplates':middleTemplates,
|
||||||
|
'leftTemplates':leftTemplates,
|
||||||
'charts':charts,
|
'charts':charts,
|
||||||
'workout':row,
|
'workout':row,
|
||||||
})
|
'statcharts':statcharts,
|
||||||
|
})
|
||||||
|
|
||||||
# The famous flex chart
|
# The famous flex chart
|
||||||
def workout_flexchart3_view(request,*args,**kwargs):
|
def workout_flexchart3_view(request,*args,**kwargs):
|
||||||
@@ -6810,7 +6812,10 @@ def workout_add_chart_view(request,id,plotnr=1):
|
|||||||
imagename=imagename)
|
imagename=imagename)
|
||||||
|
|
||||||
|
|
||||||
url = "/rowers/workout/"+str(w.id)+"/edit"
|
try:
|
||||||
|
url = request.session['referer']
|
||||||
|
except KeyError:
|
||||||
|
url = "/rowers/workout/"+str(w.id)+"/edit"
|
||||||
return HttpResponseRedirect(url)
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user