From 0c00fb164fabb86cdf2de53429c03078c1448852 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 21 Feb 2018 17:23:53 +0100 Subject: [PATCH] half way through doing course_adherence --- rowers/courses.py | 52 ++++++++++++++++++++++++ rowers/plannedsessions.py | 35 ++++++++++++++-- rowers/tasks.py | 14 +++++-- rowers/templates/plannedsessionview.html | 2 +- rowers/views.py | 8 +++- 5 files changed, 102 insertions(+), 9 deletions(-) diff --git a/rowers/courses.py b/rowers/courses.py index 9857b230..a78d1c92 100644 --- a/rowers/courses.py +++ b/rowers/courses.py @@ -15,6 +15,8 @@ import xml.etree.ElementTree as et import pandas as pd +import dataprep + ns = {'opengis': 'http://www.opengis.net/kml/2.2'} @@ -202,6 +204,11 @@ def createcourse( if i==0 and j==0: loc = geolocator.reverse((point['latitude'],point['longitude'])) country = loc.raw['address']['country'] + if isinstance(country,unicode): + country = country.encode('utf8') + elif isinstance(country, str): + country = country.decode('utf8') + c.country = country c.save() obj = GeoPoint( @@ -215,3 +222,48 @@ def createcourse( i += 1 return c + +def coursetime_polygons(data,polygons): + + entrytime = data['time'].max() + coursecompleted = False + + # corner case - empty list of polygons + if len(polygons) == 0: + return 0,True + + # end - just the Finish polygon + if len(polygons) == 1: + try: + entrytime = time_in_polygon(data,polygons[0],maxmin='min') + coursecompleted = True + except InvalidTrajectoryError: + entrytime = data['time'].max() + coursecompleted = False + return entrytime,coursecompleted + + if len(polygons) > 1: + try: + time = time_in_polygon(data, polygons[0]) + + return entrytime, coursecompleted + +def get_time_course(ws,course): + coursetimeseconds = 0.0 + coursecompleted = 0 + + w = ws[0] + columns = ['time','latitude','longitude'] + rowdata = dataprep.getsmallrowdata_db( + columns, + ids = [w.id], + workstrokesonly=False + ) + + # we may want to expand the time (interpolate) + + polygons = GeoPolygon.object.filter(course=course) + + coursetimeseconds,coursecompleted = coursetime_polygons(rowdata,polygons) + + return coursetimeseconds,coursecompleted diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 487226c5..a25ce578 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -24,6 +24,7 @@ from rowers.models import ( import metrics import numpy as np import dataprep +import courses # Low Level functions - to be called by higher level methods def add_workouts_plannedsession(ws,ps,r): @@ -47,7 +48,7 @@ def add_workouts_plannedsession(ws,ps,r): ids = [w.id for w in wold] + [w.id for w in ws] ids = list(set(ids)) - if len(ids)>1 and ps.sessiontype == 'test': + if len(ids)>1 and ps.sessiontype in ['test','coursetest']: errors.append('For tests, you can only attach one workout') return result,comments,errors @@ -233,8 +234,36 @@ def is_session_complete_ws(ws,ps): else: if not completiondate: completiondate = ws.reverse()[0].date - return ratio,'partial',completiondate - + return ratio,'partial',completiondate + elif ps.sessiontype == 'coursetest': + if ps.course: + coursetime,coursecompleted = courses.get_time_course(ws,ps.course) + if coursecompleted: + return 1.0,'completed',completiondate + else: + return ratio,'partial',completiondate + else: + if ps.criterium == 'exact': + if ratio == 1.0: + return ratio,'completed',completiondate + else: + if not completiondate: + completiondate = ws.reverse()[0].date + return ratio,'partial',completiondate + elif ps.criterium == 'minimum': + if ratio >= 1.0: + return ratio,'completed',completiondate + else: + if not completiondate: + completiondate = ws.reverse()[0].date + + return ratio,'partial',completiondate + else: + if ratio>cratiomin and ratio