Private
Public Access
1
0

playing with gauges

This commit is contained in:
Sander Roosendaal
2019-12-10 22:07:19 +01:00
parent db7c224beb
commit 557a7fa6e2
3 changed files with 136 additions and 46 deletions

View File

@@ -254,7 +254,7 @@ function copyText() {
// catchangle = ctch[Math.round(datatime)]; // catchangle = ctch[Math.round(datatime)];
{% for id, metric in metrics.items %} {% for id, metric in metrics.items %}
{{ id }}_now = {{ id }}_values[Math.round(datatime)]; {{ id }}_now = {{ id }}_values[Math.round(datatime)];
// console.log(datatime,{{ id }}_now, "{{ metric.name }}") // console.log(datatime,{{ id }},{{ id }}_now, "{{ metric.name }}")
{% endfor %} {% endfor %}
@@ -374,11 +374,21 @@ function copyText() {
</span> {{ metric.unit }} </span> {{ metric.unit }}
</li> </li>
{% endfor %} {% endfor %}
{% for group in metricsgroups %} </ul>
<li class="grid_2"> <ul class="main-content">
<div id="{{ group }}"></div> {% if 'basic' in metricsgroups %}
<li class="grid_1">
<div id="basic_spm"></div>
</li> </li>
{% endfor %} <li class="grid_1">
<div id="basic_boatspeed"></div>
</li>
{% endif %}
{% if 'forcepower' in metricsgroups %}
<li class="grid_1">
<div id="forcepower_power"></div>
</li>
{% endif %}
</ul> </ul>
</li> </li>
<li class="grid_2"> <li class="grid_2">
@@ -394,6 +404,22 @@ function copyText() {
<script> <script>
$(document).ready( function() { $(document).ready( function() {
// gauge settings
{% if workout.workouttype != 'water' %}
speedoptions.max = 7;
speedoptions.redTo = 7;
speedoptions.majorTicks = ['0','1','2','3','4','5','6','7'];
{% endif %}
{% if 'forcepower' in metricsgroups %}
poweroptions.max = {{ rower.pw_an|add:100|round100 }};
poweroptions.greenFrom = {{ rower.pw_ut2 }};
poweroptions.greenTo = {{ rower.pw_at }};
poweroptions.yellowFrom = {{ rower.pw_at }};
poweroptions.yellowTo = {{ rower.pw_an }};
poweroptions.redFrom = {{ rower.pw_an }};
poweroptions.redTo = {{ rower.pw_an|add:200|round100 }};
{% endif %}
// cookie reader // cookie reader
function createCookie(name,value,days) { function createCookie(name,value,days) {
if (days) { if (days) {

View File

@@ -48,7 +48,7 @@ def sigdig(value, digits = 3):
# return integers as is # return integers as is
if value % 1 == 0: if value % 1 == 0:
return value return value
places = digits - order - 1 places = digits - order - 1
if places > 0: if places > 0:
fmtstr = "%%.%df" % (places) fmtstr = "%%.%df" % (places)
@@ -83,7 +83,7 @@ def strfdelta(tdelta):
seconds=seconds, seconds=seconds,
tenths=tenths, tenths=tenths,
) )
return res return res
from rowers.teams import rower_get_managers from rowers.teams import rower_get_managers
@@ -91,13 +91,13 @@ from rowers.teams import rower_get_managers
@register.filter @register.filter
def alertstatspercentage(list,i): def alertstatspercentage(list,i):
alertstats = list[i-1] alertstats = list[i-1]
return alertstats["percentage"] return alertstats["percentage"]
@register.filter @register.filter
def alertstartdate(list,i): def alertstartdate(list,i):
alertstats = list[i-1] alertstats = list[i-1]
return alertstats["startdate"] return alertstats["startdate"]
@register.filter @register.filter
@@ -109,7 +109,7 @@ def alertnperiod(list,i):
@register.filter @register.filter
def alertenddate(list,i): def alertenddate(list,i):
alertstats = list[i-1] alertstats = list[i-1]
return alertstats["enddate"] return alertstats["enddate"]
@register.filter @register.filter
@@ -121,6 +121,8 @@ def is_coach(rower,rowers):
return True return True
def strfdeltah(tdelta): def strfdeltah(tdelta):
hours, rest = divmod(tdelta.seconds,3600) hours, rest = divmod(tdelta.seconds,3600)
minutes,seconds = divmod(rest,60) minutes,seconds = divmod(rest,60)
@@ -131,7 +133,7 @@ def strfdeltah(tdelta):
seconds=seconds, seconds=seconds,
tenths=tenths, tenths=tenths,
) )
return res return res
def secondstotimestring(tdelta): def secondstotimestring(tdelta):
@@ -142,7 +144,7 @@ def secondstotimestring(tdelta):
minutes=minutes, minutes=minutes,
seconds=seconds, seconds=seconds,
) )
return res return res
@register.filter @register.filter
@@ -218,7 +220,7 @@ def nextperiodstart(timeperiod):
newenddate = newstartdate+timedelta newenddate = newstartdate+timedelta
return newstartdate.strftime("%Y-%m-%d") return newstartdate.strftime("%Y-%m-%d")
@register.filter @register.filter
def previousperiodend(timeperiod): def previousperiodend(timeperiod):
startdate,enddate = getstartenddate(timeperiod) startdate,enddate = getstartenddate(timeperiod)
@@ -243,7 +245,7 @@ def previousperiodstart(timeperiod):
newstartdate = startdate-timedelta-datetime.timedelta(days=1) newstartdate = startdate-timedelta-datetime.timedelta(days=1)
return newstartdate.strftime("%Y-%m-%d") return newstartdate.strftime("%Y-%m-%d")
@register.filter @register.filter
def paceprint(d): def paceprint(d):
if (d == None): if (d == None):
@@ -288,11 +290,11 @@ def rkuserid(user):
rkuserid = runkeeperstuff.get_userid(thetoken) rkuserid = runkeeperstuff.get_userid(thetoken)
return rkuserid return rkuserid
@register.filter @register.filter
def courselength(course): def courselength(course):
return course_length(course) return course_length(course)
@register.filter(is_safe=True) @register.filter(is_safe=True)
def jsdict(dict,key): def jsdict(dict,key):
s = dict.get(key) s = dict.get(key)
@@ -306,7 +308,7 @@ def lookup(dict, key):
s = dict.get(key) s = dict.get(key)
except KeyError: except KeyError:
return None return None
if isinstance(s,string_types) and len(s) > 22: if isinstance(s,string_types) and len(s) > 22:
s = s[:22] s = s[:22]
return s return s
@@ -317,7 +319,7 @@ def lookuplong(dict, key):
s = dict.get(key) s = dict.get(key)
except KeyError: except KeyError:
return None return None
return s return s
@register.filter @register.filter
@@ -329,11 +331,11 @@ def ualookup(dict, key):
if key=='duration': if key=='duration':
s = secondstotimestring(int(s)) s = secondstotimestring(int(s))
if key=='starttime': if key=='starttime':
s = dateutil.parser.parse(s) s = dateutil.parser.parse(s)
return s return s
from rowers.models import PlannedSession from rowers.models import PlannedSession
@@ -343,7 +345,7 @@ def is_session_manager(id,user):
ps = PlannedSession.objects.get(id=id) ps = PlannedSession.objects.get(id=id)
except PlannedSession.DoesNotExist: except PlannedSession.DoesNotExist:
return False return False
return ps.manager == user return ps.manager == user
from rowers.models import checkworkoutuser from rowers.models import checkworkoutuser
@@ -358,7 +360,7 @@ def may_edit(workout,request):
return mayedit return mayedit
@register.filter @register.filter
def mayeditplan(obj,request): def mayeditplan(obj,request):
@@ -376,11 +378,11 @@ def mayeditplan(obj,request):
rr = Rower.objects.get(user=request.user) rr = Rower.objects.get(user=request.user)
if checkaccessuser(request.user,obj.rower) and rr.rowerplan not in ['basic','pro']: if checkaccessuser(request.user,obj.rower) and rr.rowerplan not in ['basic','pro']:
mayedit = True mayedit = True
return mayedit return mayedit
@register.filter(name='times') @register.filter(name='times')
def times(number): def times(number):
return range(number) return range(number)
@@ -480,7 +482,7 @@ def team_members(user):
@register.filter @register.filter
def openactions(user): def openactions(user):
myteams = Team.objects.filter(manager=user) myteams = Team.objects.filter(manager=user)
invites = TeamInvite.objects.filter(user=user).count() invites = TeamInvite.objects.filter(user=user).count()
requests = TeamRequest.objects.filter(user=user).count() requests = TeamRequest.objects.filter(user=user).count()
myrequests = TeamRequest.objects.filter(team__in=myteams).count() myrequests = TeamRequest.objects.filter(team__in=myteams).count()
@@ -491,7 +493,7 @@ def openactions(user):
coachrequests = CoachRequest.objects.filter(coach=user.rower).count() coachrequests = CoachRequest.objects.filter(coach=user.rower).count()
return invites+requests+myrequests+myinvites+mycoachoffers+coachoffers+mycoachrequests+coachrequests return invites+requests+myrequests+myinvites+mycoachoffers+coachoffers+mycoachrequests+coachrequests
@register.filter @register.filter
def team_rowers(user): def team_rowers(user):
@@ -518,7 +520,7 @@ def coach_rowers(user):
else: else:
thelist = [c for c in coach_getcoachees(user.rower)] thelist = [c for c in coach_getcoachees(user.rower)]
return thelist return thelist
@register.filter @register.filter
def verbosetimeperiod(timeperiod): def verbosetimeperiod(timeperiod):
@@ -538,7 +540,7 @@ def verbosetimeperiod(timeperiod):
verbose = timeperiod verbose = timeperiod
return verbose return verbose
from datetime import date from datetime import date
@ register.filter @ register.filter
@@ -557,8 +559,8 @@ def is_future_date(the_date):
def amount(value): def amount(value):
vs = '{v}.00'.format(v=int(value)) vs = '{v}.00'.format(v=int(value))
return vs return vs
@register.filter @register.filter
def date_dif(the_date): def date_dif(the_date):
@@ -569,7 +571,7 @@ def date_dif(the_date):
else: else:
return 1 return 1
@register.filter @register.filter
def can_register(race,r): def can_register(race,r):
return race_can_register(r,race) return race_can_register(r,race)
@@ -618,7 +620,7 @@ def userurl(path,member):
tpattern = re.compile('team\/\d+/') tpattern = re.compile('team\/\d+/')
if tpattern.search(path) is not None: if tpattern.search(path) is not None:
path = tpattern.sub('',path) path = tpattern.sub('',path)
if pattern.search(path) is not None: if pattern.search(path) is not None:
replaced = pattern.sub(userstring,path) replaced = pattern.sub(userstring,path)
else: else:
@@ -635,7 +637,7 @@ def teamurl(path,team):
upattern = re.compile('\/user\/\d+/') upattern = re.compile('\/user\/\d+/')
if upattern.search(path) is not None: if upattern.search(path) is not None:
path = upattern.sub('/',path) path = upattern.sub('/',path)
if pattern.search(path) is not None: if pattern.search(path) is not None:
replaced = pattern.sub(teamstring,path) replaced = pattern.sub(teamstring,path)
@@ -726,13 +728,13 @@ def nextworkout(workout,user):
).exclude(id=workout.id) ).exclude(id=workout.id)
except ValueError: except ValueError:
return 0 return 0
if ws: if ws:
return encoder.encode_hex(ws[0].id) return encoder.encode_hex(ws[0].id)
else: else:
return 0 return 0
@register.filter @register.filter
def previousworkout(workout,user): def previousworkout(workout,user):
@@ -762,6 +764,3 @@ def previousworkout(workout,user):
return encoder.encode_hex(ws[0].id) return encoder.encode_hex(ws[0].id)
else: else:
return 0 return 0

View File

@@ -1,12 +1,23 @@
google.charts.load('current', {'packages':['gauge']}); google.charts.load('current', {'packages':['gauge']});
google.charts.setOnLoadCallback(drawSPMChart); google.charts.setOnLoadCallback(drawSPMChart);
google.charts.setOnLoadCallback(drawSpeedChart);
google.charts.setOnLoadCallback(drawPowerChart);
var spmdata = [ var spmdata = [
['Label', 'Value'], ['Label', 'Value'],
['SPM', 21.0], ['SPM', 21.0],
]; ];
var speeddata = [
['Label', 'Value'],
['V m/s', 0.0],
];
var powerdata = [
['Label','Value'],
['PWR',150],
]
var spmoptions = { var spmoptions = {
min:0, max: 50, min:0, max: 50,
width: 400, height: 120, width: 400, height: 120,
@@ -17,17 +28,42 @@ var spmoptions = {
minorTicks: 10 minorTicks: 10
}; };
var data = null; var speedoptions = {
min:0, max: 6,
width: 400, height: 120,
greenFrom: 2, greenTo: 4,
yellowFrom: 4,yellowTo: 5,
redFrom: 5, redTo: 6,
majorTicks: ['0','1','2','3','4','5','6'],
minorTicks: 10
};
var poweroptions = {
min: 0, max: 1000,
width: 400, height: 120,
greenFrom: 100, greenTo: 200,
yellowFrom: 200,yellowTo: 400,
redFrom: 400, redTo: 1000,
majorTicks: ['0','200','400','600','800','1000'],
minorTicks: 5
};
var dataspm = null;
var dataspeed = null;
var spmchart = null; var spmchart = null;
var speedchart = null;
var powerchart = null;
var datapower = null;
// SPM chart // SPM chart
function drawSPMChart() { function drawSPMChart() {
data = new google.visualization.arrayToDataTable(spmdata); dataspm = new google.visualization.arrayToDataTable(spmdata);
spmchart = new google.visualization.Gauge(document.getElementById('basic')); spmchart = new google.visualization.Gauge(document.getElementById('basic_spm'));
// spmchart.draw(data, spmoptions); // spmchart.draw(data, spmoptions);
@@ -35,8 +71,37 @@ function drawSPMChart() {
}; };
var spmchart; // Speed Chart
function set_basic() { function drawSpeedChart() {
data.setCell(0,1,spm_now); dataspeed = new google.visualization.arrayToDataTable(speeddata);
spmchart.draw(data, spmoptions)
speedchart = new google.visualization.Gauge(document.getElementById('basic_boatspeed'));
}
// Power chart
function drawPowerChart() {
datapower = new google.visualization.arrayToDataTable(powerdata);
powerchart = new google.visualization.Gauge(document.getElementById('forcepower_power'));
}
function set_basic() {
dataspm.setCell(0,1,spm_now);
spmchart.draw(dataspm, spmoptions);
dataspeed.setCell(0,1,boatspeed_now);
speedchart.draw(dataspeed,speedoptions);
}
function set_athlete() {
}
function set_stroke() {
}
function set_forcepower() {
datapower.setCell(0,1,power_now);
powerchart.draw(datapower,poweroptions);
} }