Private
Public Access
1
0

Merge branch 'release/v2.81'

This commit is contained in:
Sander Roosendaal
2017-05-15 20:33:36 +02:00
16 changed files with 324 additions and 83 deletions
+53 -3
View File
@@ -103,6 +103,22 @@ def interactive_boxchart(datadf,fieldname):
plot.yaxis.axis_label = axlabels[fieldname]
# add watermark
plot.extra_y_ranges = {"watermark": watermarkrange}
plot.extra_x_ranges = {"watermark": watermarkrange}
plot.image_url([watermarkurl],watermarkx,watermarky,
watermarkw,watermarkh,
global_alpha=watermarkalpha,
w_units='screen',
h_units='screen',
anchor=watermarkanchor,
dilate=True,
x_range_name = "watermark",
y_range_name = "watermark",
)
plot.xaxis.formatter = DatetimeTickFormatter(
days=["%d %B %Y"],
months=["%d %B %Y"],
@@ -1024,6 +1040,23 @@ def interactive_cum_flex_chart2(theworkouts,promember=0,
datadf.dropna(axis=1,how='all',inplace=True)
datadf.dropna(axis=0,how='any',inplace=True)
# test if we have drive energy
nowork = 1
try:
test = datadf['driveenergy'].mean()
nowork = 0
except KeyError:
datadf['driveenergy'] = 500.
# test if we have power
nopower = 1
try:
test = datadf['power'].mean()
nopower = 0
except KeyError:
datadf['power'] = 50.
yparamname1 = axlabels[yparam1]
if yparam2 != 'None':
yparamname2 = axlabels[yparam2]
@@ -1336,8 +1369,7 @@ def interactive_flex_chart2(id=0,promember=0,
'time','pace','workoutstate','time']
rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True,
workstrokesonly=workstrokesonly,
convertnewtons=False)
workstrokesonly=workstrokesonly)
try:
tests = rowdata[yparam2]
@@ -1352,6 +1384,22 @@ def interactive_flex_chart2(id=0,promember=0,
rowdata.dropna(axis=1,how='all',inplace=True)
rowdata.dropna(axis=0,how='any',inplace=True)
# test if we have drive energy
nowork = 1
try:
test = rowdata['driveenergy'].mean()
nowork = 0
except KeyError:
rowdata['driveenergy'] = 500.
# test if we have power
nopower = 1
try:
test = rowdata['power'].mean()
nopower = 0
except KeyError:
rowdata['power'] = 50.
row = Workout.objects.get(id=id)
if rowdata.empty:
return "","No valid data"
@@ -1437,6 +1485,7 @@ def interactive_flex_chart2(id=0,promember=0,
else:
rowdata['yname2'] = axlabels[yparam1]
# prepare data
source = ColumnDataSource(
rowdata
@@ -1611,6 +1660,7 @@ def interactive_flex_chart2(id=0,promember=0,
hover.mode = 'mouse'
callback = CustomJS(args = dict(source=source,source2=source2,
x1means=x1means,
y1means=y1means,
@@ -1626,13 +1676,13 @@ def interactive_flex_chart2(id=0,promember=0,
var y1 = data['y1']
var y2 = data['y2']
var spm1 = data['spm']
var driveenergy1 = data['driveenergy']
var time1 = data['time']
var pace1 = data['pace']
var hr1 = data['hr']
var fpace1 = data['fpace']
var distance1 = data['distance']
var power1 = data['power']
var driveenergy1 = data['driveenergy']
var xname = data['xname'][0]
var yname1 = data['yname1'][0]
var yname2 = data['yname2'][0]
+22 -1
View File
@@ -24,7 +24,28 @@
<div id="title" class="grid_12 alpha">
<h1>Stroke Analysis</h1>
<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">
Change Rower
</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 %}
&nbsp;
{% endif %}
</div>
</div>
<div class="grid_12 alpha">
+22 -5
View File
@@ -35,11 +35,28 @@
<div class="grid_12 alpha">
<h1>Workout Statistics</h1>
<p>
This is an experimental page which just lists a bunch of statistics for
your workouts. This page is under rapid development.
</p>
<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">
Change Rower
</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 %}
&nbsp;
{% endif %}
</div>
</div>
<div class="grid_12 alpha">
<div id="summary" class="grid_6 alpha">
+22 -1
View File
@@ -35,7 +35,28 @@
<div id="title" class="grid_12 alpha">
<h1>Indoor Rower Power Histogram</h1>
<div class="grid_10 alpha">
{% if theuser %}
<h3>{{ theuser.first_name }}'s Indoor Rower Power Histogram</h3>
{% else %}
<h3>{{ user.first_name }}'s Indoor Rower Power Histogram</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">
Change Rower
</button>
<div class="dropdown-content">
{% for member in user|team_members %}
<a class="button green small" href="/rowers/{{ member.id }}/histo/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">{{ member.first_name }} {{ member.last_name }}</a>
{% endfor %}
</div>
{% else %}
&nbsp;
{% endif %}
</div>
</div>
<div id="summary" class="grid_6 alpha">
+14 -9
View File
@@ -33,11 +33,15 @@
</div>
<div id="workouts_table" class="grid_8 alpha">
{% 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">
{% if team %}
<div class="grid_8 alpha">
{% include "teambuttons.html" with teamid=team.id %}
</div>
<h3>{{ team.name }} Team Workouts</h3>
{% else %}
<h3>My Workouts</h3>
@@ -78,10 +82,10 @@
<a href="/rowers/workout/{{ workout.id }}/edit">No Name</a> </td>
{% endif %}
{% else %}
{% if workout.name != '' %}
<a href="/rowers/workout/{{ workout.id }}/">{{ workout.name }}</a> </td>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/">No Name</a> </td>
{% if workout.name != '' %}
<a href="/rowers/workout/{{ workout.id }}/">{{ workout.name }}</a> </td>
{% else %}
<a href="/rowers/workout/{{ workout.id }}/">No Name</a> </td>
{% endif %}
{% endif %}
<td> {{ workout.workouttype }} </td>
@@ -114,6 +118,7 @@
{% endif %}
</div>
<div class="grid_4 omega">
{% if team %}
<div class="grid_4" id="teambuttons">
@@ -152,7 +157,7 @@
</div>
</div>
</div>
</div>
<div class="grid_5 alpha">
+5 -3
View File
@@ -34,11 +34,12 @@
</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 class="grid_8 alpha">
{% include "teambuttons.html" with teamid=teamid%}
</div>
</div>
<div class="grid_4 omega">
<form enctype="multipart/form-data" action="/rowers/multi-compare" method="post">
@@ -53,6 +54,7 @@
</div>
</form>
</div>
</div>
<div class="grid_12 alpha">
+22 -1
View File
@@ -35,7 +35,28 @@
<div id="title" class="grid_12 alpha">
<h1>Ranking Pieces (Indoor Rower)</h1>
<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">
Change Rower
</button>
<div class="dropdown-content">
{% for member in user|team_members %}
<a class="button green small" href="/rowers/{{ member.id }}/ote-bests/{{ startdate|date:"Y-m-d" }}/{{ enddate|date:"Y-m-d" }}">{{ member.first_name }} {{ member.last_name }}</a>
{% endfor %}
</div>
{% else %}
&nbsp;
{% endif %}
</div>
</div>
<div id="summary" class="grid_6 alpha">
+6 -4
View File
@@ -3,11 +3,13 @@
{% block title %}Team {% endblock %}
{% block content %}
<div class="grid_12 alpha">
<h1>{{ team.name }}</h1>
<div class="grid_8 alpha">
<div class="grid_12 alpha">
{% include "teambuttons.html" with teamid=team.id %}
</div>
<div class="grid_12">
<div class="grid_8 alpha">
<h1>{{ team.name }}</h1>
<div class="grid_4 omega">
<p>{{ team.notes }}</p>
<p><b>Manager:</b> {{ team.manager.first_name }} {{ team.manager.last_name }}</p>
@@ -90,7 +92,7 @@
{% endif %}
</div>
</div>
</div>
+1 -3
View File
@@ -8,9 +8,7 @@
<div class="grid_12 alpha">
<div class="grid_8 suffix_4 alpha">
{% include "teambuttons.html" with teamid=team.id %}
</div>
{% include "teambuttons.html" with teamid=team.id team=team %}
</div>
<div class="grid_12 alpha">
<h3>{{ team.name }} Team Workouts</h3>
+12 -1
View File
@@ -14,7 +14,7 @@
<a class="button gray small" href="/rowers/team/{{ teamid }}/">Team Page</a>
</p>
</div>
<div class="grid_2 omega">
<div class="grid_2">
{% if user|is_manager and user|has_teams %}
<p>
<a class="button gray small" href="/rowers/workout/upload/team/">Upload Workout</a>
@@ -23,3 +23,14 @@
<p>&nbsp;</p>
{% endif %}
</div>
<div class="grid_2 omega">
{% if team and team.manager == user %}
<p>
<a class="button gray small" href="/rowers/team/{{ teamid }}/memberstats">
Team Stats
</a>
</p>
{% else %}
&nbsp;
{% endif %}
</div>
+33
View File
@@ -0,0 +1,33 @@
{% extends "base.html" %}
{% block title %}Team {% endblock %}
{% block content %}
<div class="grid_12 alpha">
{% include "teambuttons.html" with teamid=team.id team=team %}
</div>
<div class="grid_12 alpha">
<h1>{{ team.name }} Stats</h1>
<p>
Links to the cumulative statistics pages for your team's members
</p>
<table width="70%" class="listtable shortpadded">
<tbody>
{% for u in theusers %}
<tr>
<td>{{ u.first_name }} {{ u.last_name }}</td>
<td><a href="/rowers/{{ u.id }}/ote-bests">Ranking Pieces</a></td>
<td><a href="/rowers/flexall/u/{{ u.id }}">Stroke Analysis</a></td>
<td><a href="/rowers/histo/u/{{ u.id }}">Power Histogram</a></td>
<td><a href="/rowers/cumstats/u/{{ u.id }}">Stats</a></td>
<td><a href="/rowers/user-boxplot-select/user/{{ u.id }}/">Box Chart</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
+20 -3
View File
@@ -7,17 +7,34 @@
{% block content %}
{% if team %}
<div class="grid_12 alpha">
<div class="grid_8 suffix_4 alpha">
{% include "teambuttons.html" with teamid=team.id %}
</div>
{% include "teambuttons.html" with teamid=team.id team=team %}
</div>
{% endif %}
<div class="grid_12 alpha">
<div class="grid_4 alpha">
{% if theuser %}
<h3>{{ theuser.first_name }}'s Workouts</h3>
{% else %}
<h3>{{ user.first_name }}'s Workouts</h3>
{% endif %}
</div>
<div class="grid_2 prefix_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">
Change Rower
</button>
<div class="dropdown-content">
{% for member in user|team_members %}
<a class="button green small" href="/rowers/user-boxplot-select/user/{{ member.id }}/">{{ member.first_name }} {{ member.last_name }}</a>
{% endfor %}
</div>
{% else %}
&nbsp;
{% endif %}
</div>
</div>
<div class="grid_12 alpha">
<div class="grid_4 alpha">
+14
View File
@@ -125,3 +125,17 @@ def has_teams(user):
return False
return False
@register.filter
def team_members(user):
try:
therower = Rower.objects.get(user=user)
if therower.rowerplan != 'coach':
return []
teams = Team.objects.filter(manager=user)
members = Rower.objects.filter(team__in=teams)
return [rower.user for rower in members]
except TypeError:
return []
return []
+1 -1
View File
@@ -311,7 +311,7 @@ def workout_tp_upload(user,w):
tcxfile = createtpworkoutdata(w)
if tcxfile:
res,reason,status_code,headers = uploadactivity(
r.tptoken,tcxfile,
thetoken,tcxfile,
name=w.name
)
if res == 0:
+6 -2
View File
@@ -124,7 +124,7 @@ urlpatterns = [
url(r'^team-compare-select/team/(?P<teamid>\d+)/$',views.team_comparison_select),
url(r'^team-compare-select/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.team_comparison_select),
url(r'^team-compare-select/$',views.team_comparison_select),
url(r'^user-boxplot-select/team/(?P<userid>\d+)/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.user_boxplot_select),
url(r'^user-boxplot-select/user/(?P<userid>\d+)/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.user_boxplot_select),
url(r'^user-boxplot-select/user/(?P<userid>\d+)/$',views.user_boxplot_select),
url(r'^user-boxplot-select/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.user_boxplot_select),
url(r'^user-boxplot-select/$',views.user_boxplot_select),
@@ -135,16 +135,19 @@ urlpatterns = [
url(r'^ote-bests/(?P<deltadays>\d+)$',views.rankings_view),
url(r'^ote-bests/$',views.rankings_view),
url(r'^(?P<theuser>\d+)/ote-bests/$',views.rankings_view),
url(r'^(?P<theuser>\d+)/flexall/(?P<xparam>\w+.*)/(?P<yparam1>\w+.*)/(?P<yparam2>\w+.*)/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.cum_flex),
url(r'^flexall/(?P<xparam>\w+.*)/(?P<yparam1>\w+.*)/(?P<yparam2>\w+.*)/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.cum_flex),
url(r'^flexall/(?P<xparam>\w+.*)/(?P<yparam1>\w+.*)/(?P<yparam2>\w+.*)$',views.cum_flex),
url(r'^flexall/$',views.cum_flex),
url(r'^histo/u/(?P<theuser>\d+)$',views.histo),
url(r'^flexall/u/(?P<theuser>\d+)$',views.cum_flex),
url(r'^(?P<theuser>\d+)/histo/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.histo),
url(r'^(?P<theuser>\d+)/histo/(?P<deltadays>\d+)$',views.histo),
url(r'^histo/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.histo),
url(r'^histo/(?P<deltadays>\d+)$',views.histo),
url(r'^histo/$',views.histo),
url(r'^cumstats/u/(?P<theuser>\d+)$',views.cumstats),
url(r'^cumstats/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)/p/(?P<plotfield>\w+.*)$',views.cumstats),
url(r'^(?P<theuser>\d+)/cumstats/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)/p/(?P<plotfield>\w+.*)$',views.cumstats),
url(r'^(?P<theuser>\d+)/cumstats/(?P<startdatestring>\w+.*)/(?P<enddatestring>\w+.*)$',views.cumstats),
@@ -227,6 +230,7 @@ urlpatterns = [
url(r'^user-boxplot$',views.boxplot_view),
url(r'^me/teams/$',views.rower_teams_view),
url(r'^team/(?P<id>\d+)/$',views.team_view),
url(r'^team/(?P<id>\d+)/memberstats$',views.team_members_stats_view),
url(r'^team/(?P<id>\d+)/edit$',views.team_edit_view),
url(r'^team/(?P<id>\d+)/leaveconfirm/$',views.team_leaveconfirm_view),
url(r'^team/(?P<id>\d+)/leave/$',views.team_leave_view),
+27 -2
View File
@@ -2004,8 +2004,8 @@ def cum_flex(request,theuser=0,
if result:
promember=1
if not promember:
return HttpResponseRedirect("/rowers/about/")
#if not promember:
#return HttpResponseRedirect("/rowers/about/")
# get all indoor rows of in date range
@@ -7706,3 +7706,28 @@ def team_delete_view(request,id):
url = reverse(rower_teams_view)
response = HttpResponseRedirect(url)
return response
@user_passes_test(iscoachmember,login_url="/",redirect_field_name=None)
def team_members_stats_view(request,id):
r = Rower.objects.get(user=request.user)
try:
t = Team.objects.get(id=id)
except Team.DoesNotExist:
raise Http404("This team doesn't exist")
if t.manager != request.user:
raise PermissionDenied("You are not allowed to see this page")
members = Rower.objects.filter(team=t).order_by("user__last_name","user__first_name")
theusers = [member.user for member in members]
response = render(request,'teamstats.html',
{
'teams':get_my_teams(request.user),
'team':t,
'theusers':theusers,
})
return response