From 0c9bfcad8d0da19daa6bf8c85964668062ec12ae Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 16 Feb 2018 10:41:26 +0100 Subject: [PATCH] improved session completion date --- rowers/plannedsessions.py | 75 +++++++++++++--------- rowers/templates/plannedsessionscoach.html | 4 ++ rowers/views.py | 14 ++-- 3 files changed, 55 insertions(+), 38 deletions(-) diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index aaf15c23..713e4145 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -104,7 +104,8 @@ def get_session_metrics(ps): completedatev = '' statusv = 0 - ws = Workout.objects.filter(user=r,plannedsession=ps) + ws = Workout.objects.filter(user=r,plannedsession=ps).order_by("date") + if len(ws) != 0: for w in ws: distancev += w.distance @@ -112,8 +113,11 @@ def get_session_metrics(ps): trimpv += dataprep.workout_trimp(w) rscorev += dataprep.workout_rscore(w)[0] - ratio,statusv = is_session_complete_ws(ws,ps) - completedatev = ws[0].date.strftime('%Y-%m-%d') + ratio,statusv,completiondate = is_session_complete_ws(ws,ps) + try: + completedatev = completiondate.strftime('%Y-%m-%d') + except AttributeError: + completedatev = '' durationv /= 60. trimp.append(int(trimpv)) @@ -139,16 +143,35 @@ def get_session_metrics(ps): return thedict def is_session_complete_ws(ws,ps): + ws = ws.order_by("date") if len(ws)==0: today = date.today() if today > ps.enddate: status = 'missed' ratio = 0 - return ratio,status + return ratio,status,None else: - return 0,'not done' + return 0,'not done',None + value = ps.sessionvalue + if ps.sessionunit == 'min': + value *= 60. + elif ps.sessionunit == 'km': + value *= 1000. + + cratiomin = 1 + cratiomax = 1 + if ps.criterium == 'none': + if ps.sessiontype == 'session': + cratiomin = 0.8 + cratiomax = 1.2 + else: + cratiomin = 0.9167 + cratiomax = 1.0833 + + score = 0 + completiondate = None for w in ws: if ps.sessionmode == 'distance': score += w.distance @@ -161,12 +184,8 @@ def is_session_complete_ws(ws,ps): elif ps.sessionmode == 'rScore': rscore = dataprep.workout_rscore(w)[0] score += rscore - - value = ps.sessionvalue - if ps.sessionunit == 'min': - value *= 60. - elif ps.sessionunit == 'km': - value *= 1000. + if not completiondate and score>=cratiomin*value: + completiondate = w.date ratio = score/float(value) @@ -175,49 +194,47 @@ def is_session_complete_ws(ws,ps): if ps.sessiontype in ['session','cycletarget']: if ps.criterium == 'exact': if ratio == 1.0: - return ratio,'completed' + return ratio,'completed',completiondate else: - return ratio,'partial' + return ratio,'partial',completiondate elif ps.criterium == 'minimum': if ratio >= 1.0: - return ratio,'completed' + return ratio,'completed',completiondate else: - return ratio,'partial' + return ratio,'partial',completiondate else: - if ratio>0.8 and ratio<1.2 and ps.sessiontype=='session': - return ratio,'completed' - elif ratio>0.9167 and ratio<1.0833 and ps.sessiontype=='cycletarget': - return ratio,'completed' + if ratio>cratiomin and ratio 1.0: - return ratio,'completed' + return ratio,'completed',completiondate else: - return ratio,'partial' + return ratio,'partial',completiondate else: - return ratio,'partial' + return ratio,'partial',completiondate else: - return ratio,status + return ratio,status,completiondate def is_session_complete(r,ps): status = 'not done' if r not in ps.rower.all(): - return 0,'not assigned' + return 0,'not assigned',None ws = Workout.objects.filter(user=r,plannedsession=ps) diff --git a/rowers/templates/plannedsessionscoach.html b/rowers/templates/plannedsessionscoach.html index 3cbe30ce..e9047273 100644 --- a/rowers/templates/plannedsessionscoach.html +++ b/rowers/templates/plannedsessionscoach.html @@ -92,7 +92,11 @@ + {% if thedict|lookup:'name' %} {{ thedict|lookup:'name' }} + {% else %} + Unnamed Session + {% endif %} {% for r in rowers %} diff --git a/rowers/views.py b/rowers/views.py index d80cc5f1..02d7f365 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -11991,7 +11991,7 @@ def plannedsessions_coach_view(request,timeperiod='thisweek', for ps in sps: rowerstatus = {} for r in rowers: - ratio, status = is_session_complete(r,ps) + ratio, status,completiondate = is_session_complete(r,ps) rowerstatus[r.id] = status sessiondict = { 'results':rowerstatus, @@ -12046,15 +12046,11 @@ def plannedsessions_view(request,timeperiod='thisweek',rowerid=0): completiondate = {} for ps in sps: - ratio,status = is_session_complete(r,ps) + ratio,status,cdate = is_session_complete(r,ps) actualvalue[ps.id] = int(ps.sessionvalue*ratio) completeness[ps.id] = status ws = Workout.objects.filter(user=r,plannedsession=ps) - if len(ws): - date = min([w.date for w in ws]) - completiondate[ps.id] = date - else: - completiondate[ps.id] = '' + completiondate[ps.id] = cdate unmatchedworkouts = Workout.objects.filter( user=r, @@ -12361,7 +12357,7 @@ def plannedsession_view(request,id=0,rowerid=0, ws = get_workouts_session(r,ps) - ratio,status = is_session_complete(r,ps) + ratio,status,completiondate = is_session_complete(r,ps) ratio = int(100.*ratio) @@ -12391,7 +12387,7 @@ def plannedsession_view(request,id=0,rowerid=0, 'psdict': psdict, 'attrs':[ 'name','startdate','enddate','sessiontype', - 'sessionmode', + 'sessionmode','criterium', 'sessionvalue','sessionunit' ], 'workouts': ws,