Private
Public Access
1
0

Added histogram for single workout

This commit is contained in:
Sander Roosendaal
2016-11-22 16:31:47 +01:00
parent 93bd2d26bf
commit 55ee7e1d53
5 changed files with 217 additions and 100 deletions

View File

@@ -7,115 +7,132 @@
{% block content %} {% block content %}
<div id="workouts" class="grid_6 alpha"> <div id="workouts" class="grid_6 alpha">
{% if form.errors %} {% if form.errors %}
<p style="color: red;"> <p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below. Please correct the error{{ form.errors|pluralize }} below.
</p> </p>
{% endif %} {% endif %}
<h1>Advanced Workout Editor</h1> <h1>Advanced Workout Editor</h1>
{% if user.rower.rowerplan == 'basic' %} {% if user.rower.rowerplan == 'basic' %}
<p>This is a preview of the page with advanced functionality for Pro users. See <a href="/rowers/promembership">the page about Pro membership</a> for more information and to sign up for Pro Membership</a> <p>This is a preview of the page with advanced functionality for Pro users.
{% endif %} See
<div class="grid_2 alpha"> <a href="/rowers/promembership">the page about Pro membership</a> for more information and to sign up for Pro Membership</a>
<p> {% endif %}
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a> <div class="grid_2 alpha">
</p> <p>
</div> <a class="button gray small" href="/rowers/workout/{{ workout.id }}/edit">Edit Workout</a>
<div class="grid_2 suffix_2 omega"> </p>
<p> </div>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export</a> <div class="grid_2 suffix_2 omega">
</p> <p>
<a class="button gray small" href="/rowers/workout/{{ workout.id }}/export">Export</a>
</p>
</div> </div>
<div class="grid_6 alpha"> <div class="grid_6 alpha">
<table width=100%> <table width=100%>
<tr> <tr>
<th>Date:</th><td>{{ workout.date }}</td> <th>Date:</th><td>{{ workout.date }}</td>
</tr><tr> </tr><tr>
<th>Time:</th><td>{{ workout.starttime }}</td> <th>Time:</th><td>{{ workout.starttime }}</td>
</tr><tr> </tr><tr>
<th>Distance:</th><td>{{ workout.distance }}m</td> <th>Distance:</th><td>{{ workout.distance }}m</td>
</tr><tr> </tr><tr>
<th>Duration:</th><td>{{ workout.duration |durationprint:"%H:%M:%S.%f" }}</td> <th>Duration:</th><td>{{ workout.duration |durationprint:"%H:%M:%S.%f" }}</td>
</tr> </tr>
<th>Public link to this workout</th> <th>Public link to this workout</th>
<td> <td>
<a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a> <a href="/rowers/workout/{{ workout.id }}">https://rowsandall.com/rowers/workout/{{ workout.id }}</a>
<td> <td>
</table> </table>
</div> </div>
<div class="grid_6 alpha"> <div class="grid_6 alpha">
<div class="grid_2 alpha"> <div class="grid_2 alpha">
{% if user.rower.rowerplan == 'pro' %} {% if user.rower.rowerplan == 'pro' %}
<a class="button blue small" href="/rowers/workout/compare/{{ workout.id }}">Compare Workouts</a> <a class="button blue small" href="/rowers/workout/compare/{{ workout.id }}">Compare Workouts</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/promembership/">Compare Workouts</a> <a class="button blue small" href="/rowers/promembership/">Compare Workouts</a>
{% endif %} {% endif %}
<p> <p>
Compare this workout to other workouts. Plot HR, SPM, or pace vs time or distance for the two workouts. Compare this workout to other workouts. Plot HR, SPM, or pace vs time or distance for the two workouts.
</p> </p>
</div> </div>
<div class="grid_2"> <div class="grid_2">
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/flexchart"> <a class="button blue small" href="/rowers/workout/{{ workout.id }}/flexchart">
Flexible Interactive Plot Flexible Interactive Plot
</a> </a>
<p> <p>
Flexible Interactive plot. Pick your own X and Y axis parameters. Flexible Interactive plot. Pick your own X and Y axis parameters.
</p> </p>
</div> </div>
<div class="grid_2 omega tooltip"> <div class="grid_2 omega tooltip">
<p> <p>
{% if user.rower.rowerplan == 'pro' %} {% if user.rower.rowerplan == 'pro' %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/editintervals">Edit Intervals</a> <a class="button blue small" href="/rowers/workout/{{ workout.id }}/editintervals">Edit Intervals</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/promembership">Edit Intervals</a> <a class="button blue small" href="/rowers/promembership">Edit Intervals</a>
{% endif %} {% endif %}
</p> </p>
<span class="tooltiptext">Enter or change the interval and summary data for your workout</span> <span class="tooltiptext">Enter or change the interval and summary data for your workout</span>
<p> <p>
Enter or change the interval and summary data for your workout Enter or change the interval and summary data for your workout
</p> </p>
</div> </div>
</div> </div>
<div class="grid_6 alpha"> <div class="grid_6 alpha">
<div class="grid_2 alpha"> <div class="grid_2 alpha">
<p> <p>
{% if user.rower.rowerplan == 'pro' %} {% if user.rower.rowerplan == 'pro' %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/adddistanceplot2">Dist Metrics Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id }}/adddistanceplot2">Dist Metrics Plot</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/promembership">Dist Metrics Plot</a> <a class="button blue small" href="/rowers/promembership">Dist Metrics Plot</a>
{% endif %} {% endif %}
</p> </p>
<p> <p>
Various advanced stroke metrics plotted versus distance. Various advanced stroke metrics plotted versus distance.
</p> </p>
</div> </div>
<div class="grid_2"> <div class="grid_2">
<p> <p>
{% if user.rower.rowerplan == 'pro' %} {% if user.rower.rowerplan == 'pro' %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/addtimeplot2">Time Metrics Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id }}/addtimeplot2">Time Metrics Plot</a>
{% else %} {% else %}
<a class="button blue small" href="/rowers/promembership">Time Metrics Plot</a> <a class="button blue small" href="/rowers/promembership">Time Metrics Plot</a>
{% endif %} {% endif %}
</p> </p>
<p> <p>
Various advanced stroke metrics plotted versus time. Various advanced stroke metrics plotted versus time.
</p> </p>
</div> </div>
<div class="grid_2 omega"> <div class="grid_2 omega">
<p> <p>
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/interactiveplot">Big Interactive Plot</a> <a class="button blue small" href="/rowers/workout/{{ workout.id }}/interactiveplot">Big Interactive Plot</a>
</p> </p>
<p> <p>
See (and save) the big interactive plot See (and save) the big interactive plot
</p> </p>
</div> </div>
</div>
<div class="grid_6 alpha">
<div class="grid_2 suffix_4 alpha">
<p>
{% if user.rower.rowerplan == 'pro' %}
<a class="button blue small" href="/rowers/workout/{{ workout.id }}/histo">Power Histogram</a>
{% else %}
<a class="button blue small" href="/rowers/promembership">Dist Metrics Plot</a>
{% endif %}
</p>
<p>
Plot the Power Histogram of this workout
</p>
</div>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,66 @@
{% extends "base.html" %}
{% load staticfiles %}
{% load rowerfilters %}
{% block title %}View Workout {% endblock %}
{% block content %}
<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>
<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">
{{ the_div|safe }}
</div>
{% endblock %}

View File

@@ -425,6 +425,9 @@ class ViewTest(TestCase):
response = self.c.get('/rowers/workout/1/interactiveplot', form_data, follow=True) response = self.c.get('/rowers/workout/1/interactiveplot', form_data, follow=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
response = self.c.get('/rowers/workout/1/histo', form_data, follow=True)
self.assertEqual(response.status_code, 200)
w = Workout.objects.get(id=1) w = Workout.objects.get(id=1)

View File

@@ -56,6 +56,7 @@ urlpatterns = [
url(r'^graph/(\d+)/delete$',views.graph_delete_view), url(r'^graph/(\d+)/delete$',views.graph_delete_view),
url(r'^workout/upload/$',views.workout_upload_view), url(r'^workout/upload/$',views.workout_upload_view),
url(r'^workout/upload/(.+.*)$',views.workout_upload_view), url(r'^workout/upload/(.+.*)$',views.workout_upload_view),
url(r'^workout/(?P<id>\d+)/histo$',views.workout_histo_view),
url(r'^workout/(?P<id>\d+)/export/c/(?P<message>\w+.*)/s/(?P<successmessage>\w+.*)$',views.workout_export_view), url(r'^workout/(?P<id>\d+)/export/c/(?P<message>\w+.*)/s/(?P<successmessage>\w+.*)$',views.workout_export_view),
url(r'^workout/(?P<id>\d+)/export/c/(?P<message>\w+.*)$',views.workout_export_view), url(r'^workout/(?P<id>\d+)/export/c/(?P<message>\w+.*)$',views.workout_export_view),
url(r'^workout/(?P<id>\d+)/export/s/(?P<successmessage>\w+.*)$',views.workout_export_view), url(r'^workout/(?P<id>\d+)/export/s/(?P<successmessage>\w+.*)$',views.workout_export_view),

View File

@@ -1342,6 +1342,36 @@ def cum_flex(request,theuser=0,
'promember':promember, 'promember':promember,
}) })
@login_required()
def workout_histo_view(request,id=0):
row = Workout.objects.get(id=id)
promember=0
mayedit=0
if not request.user.is_anonymous():
r = Rower.objects.get(user=request.user)
result = request.user.is_authenticated() and r.rowerplan=='pro'
if result:
promember=1
if request.user == row.user.user:
mayedit=1
if not promember:
return HttpResponseRedirect("/rowers/about/")
res = interactive_histoall([row])
script = res[0]
div = res[1]
return render(request,
'histo_single.html',
{'interactiveplot':script,
'the_div':div,
'id':id,
'mayedit':mayedit,
})
@login_required() @login_required()
def histo(request,theuser=0, def histo(request,theuser=0,