Merge branch 'develop' of https://bitbucket.org/sanderroosendaal/rowsandall into develop
This commit is contained in:
@@ -232,6 +232,40 @@ def interactive_boxchart(datadf,fieldname,extratitle='',
|
|||||||
|
|
||||||
return script,div
|
return script,div
|
||||||
|
|
||||||
|
|
||||||
|
def interactive_planchart(data,startdate,enddate):
|
||||||
|
source = ColumnDataSource(data)
|
||||||
|
|
||||||
|
hv.extension('bokeh')
|
||||||
|
|
||||||
|
|
||||||
|
yaxmaximum = data['executed'].max()
|
||||||
|
if data['planned'].max() > yaxmaximum:
|
||||||
|
yaxmaximum = data['planned'].max()
|
||||||
|
|
||||||
|
if yaxmaximum == 0:
|
||||||
|
yaxmaximum = 250
|
||||||
|
|
||||||
|
yrange1 = Range1d(start=0,end=1.1*yaxmaximum)
|
||||||
|
|
||||||
|
|
||||||
|
tidy_df = data.melt(id_vars=['startdate'],value_vars=['executed','planned'])
|
||||||
|
bars = hv.Bars(tidy_df,['startdate','variable'],['value'])
|
||||||
|
bars.opts(
|
||||||
|
opts.Bars(show_legend=True,tools=['tap','hover'],legend_position='bottom',show_frame=True))
|
||||||
|
|
||||||
|
p = hv.render(bars)
|
||||||
|
|
||||||
|
p.plot_width=550
|
||||||
|
p.plot_height=350
|
||||||
|
p.y_range = yrange1
|
||||||
|
p.toolbar_location = 'above'
|
||||||
|
p.sizing_mode = 'scale_width'
|
||||||
|
|
||||||
|
script,div = components(p)
|
||||||
|
|
||||||
|
return script,div
|
||||||
|
|
||||||
def interactive_activitychart(workouts,startdate,enddate,stack='type'):
|
def interactive_activitychart(workouts,startdate,enddate,stack='type'):
|
||||||
|
|
||||||
dates = []
|
dates = []
|
||||||
@@ -352,7 +386,7 @@ def interactive_activitychart(workouts,startdate,enddate,stack='type'):
|
|||||||
|
|
||||||
p.plot_width=550
|
p.plot_width=550
|
||||||
p.plot_height=350
|
p.plot_height=350
|
||||||
p.toolbar_location = None
|
p.toolbar_location = 'above'
|
||||||
p.sizing_mode = 'scale_width'
|
p.sizing_mode = 'scale_width'
|
||||||
url = "http://rowsandall.com/rowers/workout/@duration/"
|
url = "http://rowsandall.com/rowers/workout/@duration/"
|
||||||
taptool = p.select(type=TapTool)
|
taptool = p.select(type=TapTool)
|
||||||
|
|||||||
@@ -22,11 +22,14 @@ queue = django_rq.get_queue('default')
|
|||||||
queuelow = django_rq.get_queue('low')
|
queuelow = django_rq.get_queue('low')
|
||||||
queuehigh = django_rq.get_queue('low')
|
queuehigh = django_rq.get_queue('low')
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
from rowers.models import (
|
from rowers.models import (
|
||||||
Rower, Workout,Team,
|
Rower, Workout,Team,
|
||||||
GeoCourse, TrainingMicroCycle,TrainingMesoCycle,TrainingMacroCycle,
|
GeoCourse, TrainingMicroCycle,TrainingMesoCycle,TrainingMacroCycle,
|
||||||
TrainingPlan,PlannedSession,VirtualRaceResult,CourseTestResult,
|
TrainingPlan,PlannedSession,VirtualRaceResult,CourseTestResult,
|
||||||
get_course_timezone, IndoorVirtualRaceResult,VirtualRace
|
get_course_timezone, IndoorVirtualRaceResult,VirtualRace,createmacrofillers,
|
||||||
|
createmesofillers,createmicrofillers,
|
||||||
)
|
)
|
||||||
|
|
||||||
from rowers.courses import get_time_course
|
from rowers.courses import get_time_course
|
||||||
@@ -47,6 +50,212 @@ from rowers.tasks import (
|
|||||||
)
|
)
|
||||||
from rowers.utils import totaltime_sec_to_string
|
from rowers.utils import totaltime_sec_to_string
|
||||||
|
|
||||||
|
def checkscores(r,macrocycles):
|
||||||
|
for m in macrocycles:
|
||||||
|
createmesofillers(m)
|
||||||
|
m.plantime = 0
|
||||||
|
m.actualtime = 0
|
||||||
|
m.plandistance = 0
|
||||||
|
m.actualdistance = 0
|
||||||
|
m.planrscore = 0
|
||||||
|
m.actualrscore = 0
|
||||||
|
m.plantrimp = 0
|
||||||
|
m.actualtrimp = 0
|
||||||
|
|
||||||
|
|
||||||
|
mesocycles = TrainingMesoCycle.objects.filter(
|
||||||
|
plan=m,
|
||||||
|
type='userdefined').order_by("startdate")
|
||||||
|
|
||||||
|
for me in mesocycles:
|
||||||
|
me.plantime = 0
|
||||||
|
me.actualtime = 0
|
||||||
|
me.plandistance = 0
|
||||||
|
me.actualdistance = 0
|
||||||
|
me.planrscore = 0
|
||||||
|
me.actualrscore = 0
|
||||||
|
me.plantrimp = 0
|
||||||
|
me.actualtrimp = 0
|
||||||
|
|
||||||
|
microcycles = TrainingMicroCycle.objects.filter(
|
||||||
|
plan=me,
|
||||||
|
type='userdefined').order_by("startdate")
|
||||||
|
|
||||||
|
for mm in microcycles:
|
||||||
|
sps = get_sessions(r,startdate=mm.startdate,enddate=mm.enddate)
|
||||||
|
|
||||||
|
# sps = PlannedSession.objects.filter(
|
||||||
|
# rower = r,
|
||||||
|
# startdate__lte=mm.enddate,
|
||||||
|
# enddate__gte=mm.startdate)
|
||||||
|
|
||||||
|
|
||||||
|
mm.plantime = 0
|
||||||
|
mm.actualtime = 0
|
||||||
|
mm.plandistance = 0
|
||||||
|
mm.actualdistance = 0
|
||||||
|
mm.planrscore = 0
|
||||||
|
mm.actualrscore = 0
|
||||||
|
mm.plantrimp = 0
|
||||||
|
mm.actualtrimp = 0
|
||||||
|
|
||||||
|
|
||||||
|
if mm.type == 'userdefined':
|
||||||
|
for ps in sps:
|
||||||
|
ratio, status, cdate = is_session_complete(r,ps)
|
||||||
|
if ps.sessionmode == 'time':
|
||||||
|
mm.plantime += ps.sessionvalue
|
||||||
|
mm.actualtime += int(ps.sessionvalue*ratio)
|
||||||
|
elif ps.sessionmode == 'distance' and ps.sessiontype != 'race':
|
||||||
|
mm.plandistance += ps.sessionvalue
|
||||||
|
mm.actualdistance += int(ps.sessionvalue*ratio)
|
||||||
|
elif ps.sessionmode == 'rScore':
|
||||||
|
mm.planrscore += ps.sessionvalue
|
||||||
|
mm.actualrscore += int(ps.sessionvalue*ratio)
|
||||||
|
elif ps.sessionmode == 'TRIMP':
|
||||||
|
mm.plantrimp += ps.sessionvalue
|
||||||
|
mm.actualtrimp += int(ps.sessionvalue*ratio)
|
||||||
|
|
||||||
|
mm.save()
|
||||||
|
|
||||||
|
me.plantime += mm.plantime
|
||||||
|
me.actualtime += mm.actualtime
|
||||||
|
me.plandistance += mm.plandistance
|
||||||
|
me.actualdistance += mm.actualdistance
|
||||||
|
me.planrscore += mm.planrscore
|
||||||
|
me.actualrscore += mm.actualrscore
|
||||||
|
me.plantrimp += mm.plantrimp
|
||||||
|
me.actualtrimp += mm.actualtrimp
|
||||||
|
|
||||||
|
if me.type == 'userdefined':
|
||||||
|
me.save()
|
||||||
|
|
||||||
|
m.plantime += me.plantime
|
||||||
|
m.actualtime += me.actualtime
|
||||||
|
m.plandistance += me.plandistance
|
||||||
|
m.actualdistance += me.actualdistance
|
||||||
|
m.planrscore += me.planrscore
|
||||||
|
m.actualrscore += me.actualrscore
|
||||||
|
m.plantrimp += me.plantrimp
|
||||||
|
m.actualtrimp += me.actualtrimp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if m.type == 'userdefined':
|
||||||
|
m.save()
|
||||||
|
|
||||||
|
|
||||||
|
def get_execution_report(rower,startdate,enddate,plan=None):
|
||||||
|
if plan:
|
||||||
|
macros = TrainingMacroCycle.objects.filter(plan=plan).order_by("startdate")
|
||||||
|
checkscores(rower,macros)
|
||||||
|
mesos = TrainingMesoCycle.objects.filter(plan__in=macros).order_by("startdate")
|
||||||
|
micros = TrainingMicroCycle.objects.filter(plan__in=mesos).order_by("startdate")
|
||||||
|
micros = micros.exclude(enddate__lte=startdate).exclude(startdate__gte=enddate)
|
||||||
|
else:
|
||||||
|
plans = TrainingPlan.objects.filter(startdate__lte=startdate,enddate__gte=startdate)
|
||||||
|
plans2 = TrainingPlan.objects.filter(enddate__lte=enddate,startdate__lte=enddate)
|
||||||
|
plans = plans | plans2
|
||||||
|
|
||||||
|
plans = plans.exclude(status=False).order_by("-enddate")
|
||||||
|
|
||||||
|
if not plans:
|
||||||
|
# make week cycles here
|
||||||
|
# get monday before startdate
|
||||||
|
startdate += timedelta(days=1-startdate.isoweekday())
|
||||||
|
startdate = startdate-timedelta(days=7)
|
||||||
|
micros = []
|
||||||
|
while startdate <= enddate:
|
||||||
|
micro = type('micros',(object,),
|
||||||
|
{
|
||||||
|
'startdate':startdate,
|
||||||
|
'enddate':startdate+timedelta(days=7)
|
||||||
|
})
|
||||||
|
micros.append(micro)
|
||||||
|
startdate += timedelta(days=7)
|
||||||
|
else:
|
||||||
|
plan = plans[0]
|
||||||
|
macros = TrainingMacroCycle.objects.filter(plan=plan).order_by("startdate")
|
||||||
|
checkscores(rower,macros)
|
||||||
|
mesos = TrainingMesoCycle.objects.filter(plan__in=macros).order_by("startdate")
|
||||||
|
micros = TrainingMicroCycle.objects.filter(plan__in=mesos).order_by("startdate")
|
||||||
|
|
||||||
|
# we've got micros, now get sessions
|
||||||
|
startdates = []
|
||||||
|
planned = []
|
||||||
|
executed = []
|
||||||
|
|
||||||
|
for mm in micros:
|
||||||
|
plannedscore = 0
|
||||||
|
actualscore = 0
|
||||||
|
sps = get_sessions(rower,startdate=mm.startdate,enddate=mm.enddate)
|
||||||
|
unmatchedworkouts = Workout.objects.filter(
|
||||||
|
user=rower,
|
||||||
|
plannedsession=None,
|
||||||
|
date__gte=mm.startdate,date__lte=mm.enddate).exclude(duplicate=True)
|
||||||
|
for w in unmatchedworkouts:
|
||||||
|
if w.rscore != 0:
|
||||||
|
actualscore += w.rscore
|
||||||
|
elif w.hrtss != 0:
|
||||||
|
actualscore += w.hrtss
|
||||||
|
else:
|
||||||
|
minutes = w.duration.hour*60+w.duration.minute
|
||||||
|
actualscore += minutes
|
||||||
|
for ps in sps:
|
||||||
|
ratio, status, cdate = is_session_complete(rower,ps)
|
||||||
|
if ps.sessionmode == 'rscore':
|
||||||
|
plannedscore += ps.sessionvalue
|
||||||
|
actualscore += ratio*ps.sessionvalue
|
||||||
|
else:
|
||||||
|
ws = Workout.objects.filter(user=rower,plannedsession=ps)
|
||||||
|
if not ws:
|
||||||
|
if ps.sessionmode == 'time':
|
||||||
|
plannedscore += ps.sessionvalue
|
||||||
|
elif ps.sessionmode == 'distance':
|
||||||
|
plannedscore += 60.
|
||||||
|
elif ps.sessionmode == 'TRIMP':
|
||||||
|
plannedscore += ps.sessionvalue/2.
|
||||||
|
|
||||||
|
for w in ws:
|
||||||
|
if w.rscore != 0:
|
||||||
|
if ratio > 0:
|
||||||
|
plannedscore += w.rscore/ratio
|
||||||
|
actualscore += w.rscore
|
||||||
|
else:
|
||||||
|
plannedscore += 60
|
||||||
|
actualscore += 0
|
||||||
|
elif w.hrtss != 0:
|
||||||
|
if ratio > 0:
|
||||||
|
plannedscore += w.hrtss/ratio
|
||||||
|
actualscore += w.hrtss
|
||||||
|
else:
|
||||||
|
plannedscore += 60
|
||||||
|
actualscore += 0
|
||||||
|
else:
|
||||||
|
minutes = w.duration.hour*60+w.duration.minute
|
||||||
|
if ratio > 0:
|
||||||
|
plannedscore += minutes/ratio
|
||||||
|
else:
|
||||||
|
plannedscore += 60
|
||||||
|
|
||||||
|
actualscore += minutes
|
||||||
|
|
||||||
|
actualscore = int(actualscore)
|
||||||
|
plannedscore = int(plannedscore)
|
||||||
|
|
||||||
|
startdates += [mm.startdate]
|
||||||
|
planned += [plannedscore]
|
||||||
|
executed += [actualscore]
|
||||||
|
|
||||||
|
|
||||||
|
data = pd.DataFrame({
|
||||||
|
'startdate':startdates,
|
||||||
|
'planned':planned,
|
||||||
|
'executed':executed,
|
||||||
|
})
|
||||||
|
|
||||||
|
return(data,'ok')
|
||||||
|
|
||||||
def get_indoorraces(workout):
|
def get_indoorraces(workout):
|
||||||
races1 = VirtualRace.objects.filter(
|
races1 = VirtualRace.objects.filter(
|
||||||
sessiontype='indoorrace',
|
sessiontype='indoorrace',
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
{% extends "newbase.html" %}
|
{% extends "newbase.html" %}
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
{% load rowerfilters %}
|
{% load rowerfilters %}
|
||||||
|
{% load leaflet_tags %}
|
||||||
|
|
||||||
|
{% block meta %}
|
||||||
|
{% leaflet_js %}
|
||||||
|
{% leaflet_css %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
{% include "monitorjobs.html" %}
|
{% include "monitorjobs.html" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -8,6 +15,7 @@
|
|||||||
{% block title %}{{ course.name }} {% endblock %}
|
{% block title %}{{ course.name }} {% endblock %}
|
||||||
{% block og_title %}{{ course.name }} {% endblock %}
|
{% block og_title %}{{ course.name }} {% endblock %}
|
||||||
{% block main %}
|
{% block main %}
|
||||||
|
|
||||||
<h1>{{ course.name }}</h1>
|
<h1>{{ course.name }}</h1>
|
||||||
|
|
||||||
<ul class="main-content">
|
<ul class="main-content">
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
{% extends "newbase.html" %}
|
{% extends "newbase.html" %}
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
{% load rowerfilters %}
|
{% load rowerfilters %}
|
||||||
|
{% load leaflet_tags %}
|
||||||
|
|
||||||
|
{% block meta %}
|
||||||
|
{% leaflet_js %}
|
||||||
|
{% leaflet_css %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
{% include "monitorjobs.html" %}
|
{% include "monitorjobs.html" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -8,6 +15,7 @@
|
|||||||
{% block title %}{{ course.name }} {% endblock %}
|
{% block title %}{{ course.name }} {% endblock %}
|
||||||
{% block og_title %}{{ course.name }} {% endblock %}
|
{% block og_title %}{{ course.name }} {% endblock %}
|
||||||
{% block main %}
|
{% block main %}
|
||||||
|
|
||||||
<h1>Replace {{ course.name }}</h1>
|
<h1>Replace {{ course.name }}</h1>
|
||||||
|
|
||||||
<ul class="main-content">
|
<ul class="main-content">
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
{% extends "newbase.html" %}
|
{% extends "newbase.html" %}
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
{% load rowerfilters %}
|
{% load rowerfilters %}
|
||||||
|
{% load leaflet_tags %}
|
||||||
|
|
||||||
|
{% block meta %}
|
||||||
|
{% leaflet_js %}
|
||||||
|
{% leaflet_css %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
{% include "monitorjobs.html" %}
|
{% include "monitorjobs.html" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -8,6 +15,7 @@
|
|||||||
{% block title %}{{ course.name }} {% endblock %}
|
{% block title %}{{ course.name }} {% endblock %}
|
||||||
{% block og_title %}{{ course.name }} {% endblock %}
|
{% block og_title %}{{ course.name }} {% endblock %}
|
||||||
{% block main %}
|
{% block main %}
|
||||||
|
|
||||||
<h1>{{ course.name }}</h1>
|
<h1>{{ course.name }}</h1>
|
||||||
|
|
||||||
<ul class="main-content">
|
<ul class="main-content">
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
{% extends "newbase.html" %}
|
{% extends "newbase.html" %}
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
{% load rowerfilters %}
|
{% load rowerfilters %}
|
||||||
|
{% load leaflet_tags %}
|
||||||
|
|
||||||
|
{% block meta %}
|
||||||
|
{% leaflet_js %}
|
||||||
|
{% leaflet_css %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
{% include "monitorjobs.html" %}
|
{% include "monitorjobs.html" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -8,6 +15,7 @@
|
|||||||
{% block title %}{{ course.name }} {% endblock %}
|
{% block title %}{{ course.name }} {% endblock %}
|
||||||
{% block og_title %}{{ course.name }} {% endblock %}
|
{% block og_title %}{{ course.name }} {% endblock %}
|
||||||
{% block main %}
|
{% block main %}
|
||||||
|
|
||||||
<h1>{{ course.name }}</h1>
|
<h1>{{ course.name }}</h1>
|
||||||
<div class="mapdiv">
|
<div class="mapdiv">
|
||||||
{{ mapdiv|safe }}
|
{{ mapdiv|safe }}
|
||||||
|
|||||||
@@ -59,10 +59,7 @@
|
|||||||
|
|
||||||
<ul class="main-content">
|
<ul class="main-content">
|
||||||
<li class="grid_2" style="min-height:200px;">
|
<li class="grid_2" style="min-height:200px;">
|
||||||
<script src="https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.js"></script>
|
<script async="true" src="https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.js"></script>
|
||||||
<script async="true" type="text/javascript">
|
|
||||||
Bokeh.set_log_level("info");
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{{ interactiveplot |safe }}
|
{{ interactiveplot |safe }}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,15 @@
|
|||||||
{% extends "newbase.html" %}
|
{% extends "newbase.html" %}
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
{% load rowerfilters %}
|
{% load rowerfilters %}
|
||||||
|
{% load leaflet_tags %}
|
||||||
|
|
||||||
{% block title %}{{ workout.name }} {% endblock %}
|
{% block title %}{{ workout.name }} {% endblock %}
|
||||||
|
|
||||||
|
{% block meta %}
|
||||||
|
{% leaflet_js %}
|
||||||
|
{% leaflet_css %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block main %}
|
{% block main %}
|
||||||
|
|
||||||
<script src="https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.js"></script>
|
<script src="https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.js"></script>
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
{% extends "newbase.html" %}
|
{% extends "newbase.html" %}
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
{% load rowerfilters %}
|
{% load rowerfilters %}
|
||||||
|
{% load leaflet_tags %}
|
||||||
|
|
||||||
{% block meta %}
|
{% block meta %}
|
||||||
|
{% leaflet_js %}
|
||||||
|
{% leaflet_css %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block title %}Planned Session{% endblock %}
|
{% block title %}Planned Session{% endblock %}
|
||||||
|
|||||||
35
rowers/templates/trainingplan_chart.html
Normal file
35
rowers/templates/trainingplan_chart.html
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{% extends "newbase.html" %}
|
||||||
|
{% load staticfiles %}
|
||||||
|
{% load rowerfilters %}
|
||||||
|
|
||||||
|
{% block title %}Rowsandall Training Plans{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
<script src="https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.js"></script>
|
||||||
|
<script src="https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.4.min.js"></script>
|
||||||
|
<script async="true" type="text/javascript">
|
||||||
|
Bokeh.set_log_level("info");
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<h1>Training Plan - {{ plan.name }}</h1>
|
||||||
|
|
||||||
|
{{ the_script | safe }}
|
||||||
|
|
||||||
|
<ul class="main-content">
|
||||||
|
<li class="grid_4">
|
||||||
|
<div id="theplot" class="flexplot">
|
||||||
|
{{ the_div|safe }}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block scripts %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block sidebar %}
|
||||||
|
{% include 'menu_plan.html' %}
|
||||||
|
{% endblock %}
|
||||||
@@ -1,6 +1,12 @@
|
|||||||
{% extends "newbase.html" %}
|
{% extends "newbase.html" %}
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
{% load rowerfilters %}
|
{% load rowerfilters %}
|
||||||
|
{% load leaflet_tags %}
|
||||||
|
|
||||||
|
{% block meta %}
|
||||||
|
{% leaflet_js %}
|
||||||
|
{% leaflet_css %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block title %}Rowsandall Virtual Race{% endblock %}
|
{% block title %}Rowsandall Virtual Race{% endblock %}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
{% extends "newbase.html" %}
|
{% extends "newbase.html" %}
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
{% load rowerfilters %}
|
{% load rowerfilters %}
|
||||||
|
{% load leaflet_tags %}
|
||||||
|
|
||||||
|
{% block meta %}
|
||||||
|
{% leaflet_js %}
|
||||||
|
{% leaflet_css %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block title %}Rowsandall Virtual Race{% endblock %}
|
{% block title %}Rowsandall Virtual Race{% endblock %}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
{% extends "newbase.html" %}
|
{% extends "newbase.html" %}
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
{% load rowerfilters %}
|
{% load rowerfilters %}
|
||||||
|
{% load leaflet_tags %}
|
||||||
|
|
||||||
|
{% block meta %}
|
||||||
|
{% leaflet_js %}
|
||||||
|
{% leaflet_css %}
|
||||||
|
{% endblock %}
|
||||||
{% load tz %}
|
{% load tz %}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
{% extends "newbase.html" %}
|
{% extends "newbase.html" %}
|
||||||
{% load staticfiles %}
|
{% load staticfiles %}
|
||||||
{% load rowerfilters %}
|
{% load rowerfilters %}
|
||||||
|
{% load leaflet_tags %}
|
||||||
|
|
||||||
|
{% block meta %}
|
||||||
|
{% leaflet_js %}
|
||||||
|
{% leaflet_css %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
{% include "monitorjobs.html" %}
|
{% include "monitorjobs.html" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -587,6 +587,10 @@ urlpatterns = [
|
|||||||
name='rower_trainingplan_view'),
|
name='rower_trainingplan_view'),
|
||||||
re_path(r'^plan/(?P<id>\d+)/macro/(?P<thismacroid>\d+)/user/(?P<userid>\d+)/$',views.rower_trainingplan_view,
|
re_path(r'^plan/(?P<id>\d+)/macro/(?P<thismacroid>\d+)/user/(?P<userid>\d+)/$',views.rower_trainingplan_view,
|
||||||
name='rower_trainingplan_view'),
|
name='rower_trainingplan_view'),
|
||||||
|
re_path(r'^plan/(?P<id>\d+)/execution/$',views.rower_trainingplan_execution_view,
|
||||||
|
name='rower_trainingplan_execution_view'),
|
||||||
|
re_path(r'^plan/(?P<id>\d+)/execution/user/(?P<userid>\d+)/$',views.rower_trainingplan_execution_view,
|
||||||
|
name='rower_trainingplan_execution_view'),
|
||||||
re_path(r'^macrocycle/(?P<pk>\d+)/$',login_required(
|
re_path(r'^macrocycle/(?P<pk>\d+)/$',login_required(
|
||||||
views.TrainingMacroCycleUpdate.as_view()),
|
views.TrainingMacroCycleUpdate.as_view()),
|
||||||
name='macrocycle_update_view'),
|
name='macrocycle_update_view'),
|
||||||
|
|||||||
@@ -1053,7 +1053,7 @@ def plannedsessions_coach_view(request,
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
from rowers.plannedsessions import cratiocolors
|
from rowers.plannedsessions import cratiocolors,checkscores
|
||||||
|
|
||||||
@login_required()
|
@login_required()
|
||||||
def plannedsessions_view(request,
|
def plannedsessions_view(request,
|
||||||
@@ -2329,6 +2329,97 @@ class MacroCycleDelete(DeleteView):
|
|||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|
||||||
|
@user_passes_test(hasplannedsessions,login_url="/rowers/paidplans",
|
||||||
|
message="This functionality requires a Coach or Self-Coach plan",
|
||||||
|
redirect_field_name=None)
|
||||||
|
def rower_trainingplan_execution_view(request,
|
||||||
|
id=0,
|
||||||
|
userid=0):
|
||||||
|
|
||||||
|
startdate = request.GET.get('startdate')
|
||||||
|
enddate = request.GET.get('enddate')
|
||||||
|
|
||||||
|
r = getrequestrower(request,userid=userid)
|
||||||
|
|
||||||
|
|
||||||
|
if int(id):
|
||||||
|
try:
|
||||||
|
plan = TrainingPlan.objects.get(id=id)
|
||||||
|
except TrainingPlan.DoesNotExist:
|
||||||
|
raise Http404("Training Plan Does Not Exist")
|
||||||
|
if not checkaccessuser(request.user,plan.manager):
|
||||||
|
if request.user.rower not in plan.rowers.all():
|
||||||
|
raise PermissionDenied("Access denied")
|
||||||
|
|
||||||
|
if not startdate or not enddate:
|
||||||
|
if int(id):
|
||||||
|
startdate = plan.startdate
|
||||||
|
enddate = plan.enddate
|
||||||
|
else:
|
||||||
|
startdate,enddate = get_dates_timeperiod(request)
|
||||||
|
else:
|
||||||
|
startdate,enddate = get_dates_timeperiod(request)
|
||||||
|
|
||||||
|
|
||||||
|
if int(id):
|
||||||
|
data,message = get_execution_report(r,startdate,enddate,plan=plan)
|
||||||
|
else:
|
||||||
|
data,message = get_execution_report(r,startdate,enddate)
|
||||||
|
|
||||||
|
if not data.empty:
|
||||||
|
script, div = interactive_planchart(data,startdate,enddate)
|
||||||
|
else:
|
||||||
|
script = ''
|
||||||
|
div = ''
|
||||||
|
messages.error(request,'The plan does not cover this time range')
|
||||||
|
|
||||||
|
if int(id):
|
||||||
|
breadcrumbs = [
|
||||||
|
{
|
||||||
|
'url':reverse(plannedsessions_view,
|
||||||
|
kwargs={'userid':userid}),
|
||||||
|
'name': 'Plan'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'url':reverse(rower_trainingplan_view,
|
||||||
|
kwargs={'userid':userid,
|
||||||
|
'id':id}),
|
||||||
|
'name': plan.name
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'url':reverse(rower_trainingplan_execution_view,
|
||||||
|
kwargs={'userid':userid,
|
||||||
|
'id':id}),
|
||||||
|
'name': 'Execution'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
breadcrumbs = [
|
||||||
|
{
|
||||||
|
'url':reverse(plannedsessions_view,
|
||||||
|
kwargs={'userid':userid}),
|
||||||
|
'name': 'Plan'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'url':reverse(rower_trainingplan_execution_view,
|
||||||
|
kwargs={'userid':userid,
|
||||||
|
'id':id}),
|
||||||
|
'name': 'Execution'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
return render(request,'trainingplan_chart.html',
|
||||||
|
{
|
||||||
|
'todays_date': timezone.now().date(),
|
||||||
|
'active': 'nav-plan',
|
||||||
|
'breadcrumbs':breadcrumbs,
|
||||||
|
'rower':r,
|
||||||
|
'the_script':script,
|
||||||
|
'the_div':div
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@user_passes_test(hasplannedsessions,login_url="/rowers/paidplans",
|
@user_passes_test(hasplannedsessions,login_url="/rowers/paidplans",
|
||||||
message="This functionality requires a Coach or Self-Coach plan",
|
message="This functionality requires a Coach or Self-Coach plan",
|
||||||
redirect_field_name=None)
|
redirect_field_name=None)
|
||||||
@@ -2359,99 +2450,7 @@ def rower_trainingplan_view(request,
|
|||||||
plan=plan,
|
plan=plan,
|
||||||
type='userdefined').order_by("startdate")
|
type='userdefined').order_by("startdate")
|
||||||
|
|
||||||
|
checkscores(r,macrocycles)
|
||||||
for m in macrocycles:
|
|
||||||
createmesofillers(m)
|
|
||||||
m.plantime = 0
|
|
||||||
m.actualtime = 0
|
|
||||||
m.plandistance = 0
|
|
||||||
m.actualdistance = 0
|
|
||||||
m.planrscore = 0
|
|
||||||
m.actualrscore = 0
|
|
||||||
m.plantrimp = 0
|
|
||||||
m.actualtrimp = 0
|
|
||||||
|
|
||||||
|
|
||||||
mesocycles = TrainingMesoCycle.objects.filter(
|
|
||||||
plan=m,
|
|
||||||
type='userdefined').order_by("startdate")
|
|
||||||
|
|
||||||
for me in mesocycles:
|
|
||||||
me.plantime = 0
|
|
||||||
me.actualtime = 0
|
|
||||||
me.plandistance = 0
|
|
||||||
me.actualdistance = 0
|
|
||||||
me.planrscore = 0
|
|
||||||
me.actualrscore = 0
|
|
||||||
me.plantrimp = 0
|
|
||||||
me.actualtrimp = 0
|
|
||||||
|
|
||||||
microcycles = TrainingMicroCycle.objects.filter(
|
|
||||||
plan=me,
|
|
||||||
type='userdefined').order_by("startdate")
|
|
||||||
|
|
||||||
for mm in microcycles:
|
|
||||||
sps = get_sessions(r,startdate=mm.startdate,enddate=mm.enddate)
|
|
||||||
|
|
||||||
# sps = PlannedSession.objects.filter(
|
|
||||||
# rower = r,
|
|
||||||
# startdate__lte=mm.enddate,
|
|
||||||
# enddate__gte=mm.startdate)
|
|
||||||
|
|
||||||
|
|
||||||
mm.plantime = 0
|
|
||||||
mm.actualtime = 0
|
|
||||||
mm.plandistance = 0
|
|
||||||
mm.actualdistance = 0
|
|
||||||
mm.planrscore = 0
|
|
||||||
mm.actualrscore = 0
|
|
||||||
mm.plantrimp = 0
|
|
||||||
mm.actualtrimp = 0
|
|
||||||
|
|
||||||
|
|
||||||
if mm.type == 'userdefined':
|
|
||||||
for ps in sps:
|
|
||||||
ratio, status, cdate = is_session_complete(r,ps)
|
|
||||||
if ps.sessionmode == 'time':
|
|
||||||
mm.plantime += ps.sessionvalue
|
|
||||||
mm.actualtime += int(ps.sessionvalue*ratio)
|
|
||||||
elif ps.sessionmode == 'distance' and ps.sessiontype != 'race':
|
|
||||||
mm.plandistance += ps.sessionvalue
|
|
||||||
mm.actualdistance += int(ps.sessionvalue*ratio)
|
|
||||||
elif ps.sessionmode == 'rScore':
|
|
||||||
mm.planrscore += ps.sessionvalue
|
|
||||||
mm.actualrscore += int(ps.sessionvalue*ratio)
|
|
||||||
elif ps.sessionmode == 'TRIMP':
|
|
||||||
mm.plantrimp += ps.sessionvalue
|
|
||||||
mm.actualtrimp += int(ps.sessionvalue*ratio)
|
|
||||||
|
|
||||||
mm.save()
|
|
||||||
|
|
||||||
me.plantime += mm.plantime
|
|
||||||
me.actualtime += mm.actualtime
|
|
||||||
me.plandistance += mm.plandistance
|
|
||||||
me.actualdistance += mm.actualdistance
|
|
||||||
me.planrscore += mm.planrscore
|
|
||||||
me.actualrscore += mm.actualrscore
|
|
||||||
me.plantrimp += mm.plantrimp
|
|
||||||
me.actualtrimp += mm.actualtrimp
|
|
||||||
|
|
||||||
if me.type == 'userdefined':
|
|
||||||
me.save()
|
|
||||||
|
|
||||||
m.plantime += me.plantime
|
|
||||||
m.actualtime += me.actualtime
|
|
||||||
m.plandistance += me.plandistance
|
|
||||||
m.actualdistance += me.actualdistance
|
|
||||||
m.planrscore += me.planrscore
|
|
||||||
m.actualrscore += me.actualrscore
|
|
||||||
m.plantrimp += me.plantrimp
|
|
||||||
m.actualtrimp += me.actualtrimp
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if m.type == 'userdefined':
|
|
||||||
m.save()
|
|
||||||
|
|
||||||
createmacrofillers(plan)
|
createmacrofillers(plan)
|
||||||
macrocycles = TrainingMacroCycle.objects.filter(plan=plan).order_by("startdate")
|
macrocycles = TrainingMacroCycle.objects.filter(plan=plan).order_by("startdate")
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ MIDDLEWARE = [
|
|||||||
'django.middleware.common.CommonMiddleware',
|
'django.middleware.common.CommonMiddleware',
|
||||||
'django.middleware.common.BrokenLinkEmailsMiddleware',
|
'django.middleware.common.BrokenLinkEmailsMiddleware',
|
||||||
'django.middleware.gzip.GZipMiddleware',
|
'django.middleware.gzip.GZipMiddleware',
|
||||||
# 'htmlmin.middleware.HtmlMinifyMiddleware',
|
'htmlmin.middleware.HtmlMinifyMiddleware',
|
||||||
# 'htmlmin.middleware.MarkRequestMiddleware',
|
# 'htmlmin.middleware.MarkRequestMiddleware',
|
||||||
'django.middleware.csrf.CsrfViewMiddleware',
|
'django.middleware.csrf.CsrfViewMiddleware',
|
||||||
'django.middleware.security.SecurityMiddleware',
|
'django.middleware.security.SecurityMiddleware',
|
||||||
@@ -103,7 +103,7 @@ MIDDLEWARE = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
ROOT_URLCONF = 'rowsandall_app.urls'
|
ROOT_URLCONF = 'rowsandall_app.urls'
|
||||||
#HTML_MINIFY = True
|
HTML_MINIFY = True
|
||||||
|
|
||||||
#EXCLUDE_FROM_MINIFYING = ('^rowers/flexall',
|
#EXCLUDE_FROM_MINIFYING = ('^rowers/flexall',
|
||||||
# '^rowers/list-workouts',
|
# '^rowers/list-workouts',
|
||||||
|
|||||||
1
static/css/bokeh-1.0.4.min.css
vendored
Normal file
1
static/css/bokeh-1.0.4.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
4
static/css/bokeh-widgets-1.0.4.min.css
vendored
Normal file
4
static/css/bokeh-widgets-1.0.4.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
static/css/leaflet.min.css
vendored
Normal file
1
static/css/leaflet.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
static/css/rowsandall2.min.css
vendored
Normal file
1
static/css/rowsandall2.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
static/css/styles2.min.css
vendored
Normal file
1
static/css/styles2.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -10,23 +10,6 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>{% block title %}Rowsandall Rowing Data Analytics{% endblock %}</title>
|
<title>{% block title %}Rowsandall Rowing Data Analytics{% endblock %}</title>
|
||||||
{% block scripts %} {% endblock %}
|
|
||||||
|
|
||||||
<script type="text/javascript" src="/jsi18n/"></script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/core.js"></script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/jquery.min.js"></script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js">
|
|
||||||
</script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/calendar.js"></script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/urlify.js"></script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/prepopulate.js"></script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/vendor/xregexp/xregexp.min.js"></script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/SelectBox.js"></script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/SelectFilter2.js"></script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/admin/DateTimeShortcuts.js"></script>
|
|
||||||
<script type="text/javascript" src="/static/admin/js/inlines.js"></script>
|
|
||||||
<script src="/static/cookielaw/js/cookielaw.js"></script>
|
|
||||||
{% analytical_head_top %}
|
{% analytical_head_top %}
|
||||||
|
|
||||||
<link rel="stylesheet" href="https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.css" type="text/css" />
|
<link rel="stylesheet" href="https://cdn.pydata.org/bokeh/release/bokeh-1.0.4.min.css" type="text/css" />
|
||||||
@@ -58,14 +41,12 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="/static/admin/css/widgets.css"/>
|
<link rel="stylesheet" type="text/css" href="/static/admin/css/widgets.css"/>
|
||||||
|
|
||||||
<link rel="stylesheet" href="/static/css/resetnew.css" />
|
<link rel="stylesheet" href="/static/css/resetnew.css" />
|
||||||
<link rel="stylesheet" href="/static/fontawesome/css/fontawesome.css">
|
<link rel="stylesheet" href="/static/fontawesome/css/fontawesome.min.css">
|
||||||
<link rel="stylesheet" href="/static/fontawesome/css/all.css">
|
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
|
||||||
<link rel="stylesheet" href="/static/css/styles2.css">
|
<link rel="stylesheet" href="/static/css/styles2.min.css">
|
||||||
<link rel="stylesheet" href="/static/css/text2.css" />
|
<link rel="stylesheet" href="/static/css/text2.css" />
|
||||||
<link rel="stylesheet" href="/static/css/rowsandall2.css" />
|
<link rel="stylesheet" href="/static/css/rowsandall2.min.css" />
|
||||||
{% block meta %} {% endblock %}
|
{% block meta %} {% endblock %}
|
||||||
{% leaflet_js %}
|
|
||||||
{% leaflet_css %}
|
|
||||||
<div id="fb-root"></div>
|
<div id="fb-root"></div>
|
||||||
<script>(function(d, s, id) {
|
<script>(function(d, s, id) {
|
||||||
var js, fjs = d.getElementsByTagName(s)[0];
|
var js, fjs = d.getElementsByTagName(s)[0];
|
||||||
@@ -95,38 +76,47 @@
|
|||||||
return t;
|
return t;
|
||||||
}(document, "script", "twitter-wjs"));</script>
|
}(document, "script", "twitter-wjs"));</script>
|
||||||
|
|
||||||
<script type='text/javascript'
|
<script id="script-batch" type="text/javascript">
|
||||||
src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js'>
|
(function(d){
|
||||||
|
var js = d.createElement('script'); js.async = true; js.defer = true;
|
||||||
|
js.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js";
|
||||||
|
d.getElementsByTagName('head')[0].appendChild(js);
|
||||||
|
}(document));
|
||||||
</script>
|
</script>
|
||||||
<script
|
|
||||||
|
|
||||||
|
<script defer
|
||||||
type="text/javascript"
|
type="text/javascript"
|
||||||
async defer
|
|
||||||
src="//assets.pinterest.com/js/pinit.js"
|
src="//assets.pinterest.com/js/pinit.js"
|
||||||
>
|
>
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function(){
|
window.addEventListener('DOMContentLoaded', function() {
|
||||||
var accordionsMenu = $('.cd-accordion-menu');
|
$(document).ready(function(){
|
||||||
|
var accordionsMenu = $('.cd-accordion-menu');
|
||||||
|
|
||||||
if( accordionsMenu.length > 0 ) {
|
if( accordionsMenu.length > 0 ) {
|
||||||
|
|
||||||
accordionsMenu.each(function(){
|
accordionsMenu.each(function(){
|
||||||
var accordion = $(this);
|
var accordion = $(this);
|
||||||
//detect change in the input[type="checkbox"] value
|
//detect change in the input[type="checkbox"] value
|
||||||
accordion.on('change', 'input[type="checkbox"]', function(){
|
accordion.on('change', 'input[type="checkbox"]', function(){
|
||||||
var checkbox = $(this);
|
var checkbox = $(this);
|
||||||
console.log(checkbox.prop('checked'));
|
console.log(checkbox.prop('checked'));
|
||||||
( checkbox.prop('checked') ) ? checkbox.siblings('ul').attr('style', 'display:none;').slideDown(300) : checkbox.siblings('ul').attr('style', 'display:block;').slideUp(300);
|
( checkbox.prop('checked') ) ? checkbox.siblings('ul').attr('style', 'display:none;').slideDown(300) : checkbox.siblings('ul').attr('style', 'display:block;').slideUp(300);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function(){
|
window.addEventListener('DOMContentLoaded', function() {
|
||||||
var active = "#{{ active }}";
|
$(document).ready(function(){
|
||||||
$(active).addClass("nav-active");
|
var active = "#{{ active }}";
|
||||||
|
$(active).addClass("nav-active");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{% analytical_head_bottom %}
|
{% analytical_head_bottom %}
|
||||||
@@ -312,7 +302,7 @@
|
|||||||
|
|
||||||
<ad class="ad">
|
<ad class="ad">
|
||||||
{% if request|announcements %}
|
{% if request|announcements %}
|
||||||
<h1>What's New?</h1>
|
<h1>News</h1>
|
||||||
{% for a in request|announcements %}
|
{% for a in request|announcements %}
|
||||||
<div class="site-announcement-box">
|
<div class="site-announcement-box">
|
||||||
<div class="site-announcement-white">
|
<div class="site-announcement-white">
|
||||||
@@ -421,22 +411,37 @@
|
|||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
<script
|
{% block scripts %} {% endblock %}
|
||||||
type='text/javascript'
|
|
||||||
src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js'>
|
<script defer type="text/javascript" src="/jsi18n/"></script>
|
||||||
</script>
|
<script defer type="text/javascript" src="/static/admin/js/core.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/jquery.min.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js">
|
||||||
|
</script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/calendar.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/urlify.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/prepopulate.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/vendor/xregexp/xregexp.min.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/SelectBox.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/SelectFilter2.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/admin/DateTimeShortcuts.js"></script>
|
||||||
|
<script defer type="text/javascript" src="/static/admin/js/inlines.js"></script>
|
||||||
|
<script src="/static/cookielaw/js/cookielaw.js"></script>
|
||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(function() {
|
window.addEventListener('DOMContentLoaded', function() {
|
||||||
$("#id-logout").click( function() {
|
$(function() {
|
||||||
localStorage.clear();
|
$("#id-logout").click( function() {
|
||||||
console.log('cleared storage');
|
localStorage.clear();
|
||||||
});
|
console.log('cleared storage');
|
||||||
});
|
});
|
||||||
</script>
|
});
|
||||||
<script type='text/javascript'
|
});
|
||||||
src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js'>
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$( document ).ready(function() {
|
$( document ).ready(function() {
|
||||||
console.log('loading script');
|
console.log('loading script');
|
||||||
|
|||||||
Reference in New Issue
Block a user