playing with gauges
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user