From b63c0b0d4a805a445bafef9706e256d83c10df3d Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 9 Nov 2020 21:25:24 +0100 Subject: [PATCH 1/3] saves session result? --- rowers/models.py | 10 ++++++- rowers/plannedsessions.py | 34 +++++++++++++++++++++- rowers/templates/plannedsessioncreate.html | 14 +++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index e9fb16cd..5713e93a 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2131,6 +2131,8 @@ regularsessiontypechoices = ( ('test','Mandatory Test'), ('cycletarget','Total for a time period'), ('coursetest','OTW test over a course'), + ('fastest_distance','Finds fastest time over a given distance'), + ('fastest_time','Finds largest distance rowed over a given time'), ) # model for Planned Session (Workout, Challenge, Test) @@ -2143,6 +2145,8 @@ class PlannedSession(models.Model): ('test','Mandatory Test'), ('cycletarget','Total for a time period'), ('coursetest','OTW test over a course'), + ('fastest_distance','Finds fastest time over a given distance'), + ('fastest_time','Finds largest distance rowed over a given time'), ('race','Virtual challenge'), ('indoorrace','Indoor Virtual challenge'), ) @@ -2153,6 +2157,8 @@ class PlannedSession(models.Model): ('test','Mandatory Test'), ('cycletarget','Total for a time period'), ('coursetest','OTW test over a course'), + ('fastest_distance','Finds fastest time over a given distance'), + ('fastest_time','Finds largest distance rowed over a given time'), ) sessionmodechoices = ( @@ -2274,7 +2280,7 @@ class PlannedSession(models.Model): else: self.sessionunit = 'None' - if self.sessiontype == 'test' or self.sessiontype == 'indoorrace': + if self.sessiontype in ['test','indoorrace','fastest_distance','fastest_time']: if self.sessionmode not in ['distance','time']: if self.sessionvalue < 100: self.sessionmode = 'time' @@ -2832,6 +2838,8 @@ class PlannedSessionFormSmall(ModelForm): ('test','Mandatory Test'), ('cycletarget','Total for a time period'), ('coursetest','OTW test over a course'), + ('fastest_distance','Finds fastest time over a given distance'), + ('fastest_time','Finds largest distance rowed over a given time'), ) class Meta: diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index e1be3af1..326b3beb 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -27,6 +27,16 @@ import pandas as pd from rowingdata import rowingdata as rrdata from rowingdata import rower as rrower +def to_time(milliseconds): + seconds = milliseconds/1000. + hours = int(seconds / 3600) + mins = int((seconds%3600)/60) + sec = int((seconds%3600)%60) + microsec = int(1e6*(seconds % 1)) + #print(seconds,hours,mins,sec,millisec) + + return dt.time(hours,mins,sec,microsec) + # Wrapper around the rowingdata call to catch some exceptions # Checks for CSV file, then for gzipped CSV file, and if all fails, returns 0 def rdata(file,rower=rrower()): @@ -360,7 +370,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 in ['test','coursetest','race']: + if len(ids)>1 and ps.sessiontype in ['test','coursetest','race','fastest_distance','fastest_time']: errors.append('For tests, you can only attach one workout') return result,comments,errors @@ -383,6 +393,28 @@ def add_workouts_plannedsession(ws,ps,r): w.id,ps.course.id,record.id, w.user.user.email,w.user.user.first_name, mode='coursetest') + if ps.sessiontype == 'fastest_distance': + df = dataprep.getsmallrowdata_db(['time','cumdist'],ids=[w.id]) + fastest_milliseconds = datautils.getfastest(df,ps.sessionvalue,mode='distance') + if fastest_milliseconds > 0: + duration = to_time(fastest_milliseconds) + + record = CourseTestResult( + userid=w.user.id, + plannedsession = ps, + duration = duration, + coursecompleted = True, + distance = ps.sessionvalue, + ) + record.save() + else: + record = CourseTestResult( + userid = w.user.id, + plannedsession = ps, + duration = dt.time(0,0), + coursecompleted = True, + distance = ps.sessionvalue, + ) else: errors.append('Workout %i did not match session dates' % w.id) diff --git a/rowers/templates/plannedsessioncreate.html b/rowers/templates/plannedsessioncreate.html index 38f29545..1c881598 100644 --- a/rowers/templates/plannedsessioncreate.html +++ b/rowers/templates/plannedsessioncreate.html @@ -205,6 +205,20 @@ if (this.value == 'cycletarget') { $("td #id_criterium").prop("value","none"); $('#id_guidance').html("

For Cycle Targets, the default criterium is 'Approximately'

"); + } + + if (this.value == 'fastest_distance') { + $("td #id_criterium").prop("value","exact"); + $("td #id_sessionunit").prop("value","m"); + $("td #id_sessionmode").prop("value","distance") + $('#id_guidance').html("

For Fastest Distance, set an exact number of meters

"); + } + + if (this.value == 'fastest_time') { + $("td #id_criterium").prop("value","exact"); + $("td #id_sessionunit").prop("value","min"); + $("td #id_sessionmode").prop("value","time") + $('#id_guidance').html("

For Fastest Time, set an exact number of minutes

"); } } From df39cebfe1cdd76d59d9c6f9df0e77efbc097ba1 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 9 Nov 2020 22:42:55 +0100 Subject: [PATCH 2/3] distance, time sort of working --- rowers/datautils.py | 14 +++-- rowers/plannedsessions.py | 69 ++++++++++++++++++++++-- rowers/templates/plannedsessionview.html | 2 +- rowers/views/analysisviews.py | 1 + rowers/views/planviews.py | 66 ++++++++++++++++++++++- 5 files changed, 142 insertions(+), 10 deletions(-) diff --git a/rowers/datautils.py b/rowers/datautils.py index 68efe7a5..2155dd3f 100644 --- a/rowers/datautils.py +++ b/rowers/datautils.py @@ -371,10 +371,10 @@ def getfastest(df,thevalue,mode='distance'): tmax = tt.max() if mode == 'distance': - if dd.max() > thevalue: + if dd.max() < thevalue: return 0 else: - if tt.max() > thevalue: + if tt.max() < thevalue: return 0 if tmax > 500000: @@ -418,10 +418,16 @@ def getfastest(df,thevalue,mode='distance'): restime = np.array(restime) distance = np.array(distance) + #for i in range(len(restime)): + # if restime[i]=ps.startdate and w.date<=ps.enddate: w.plannedsession = ps w.save() @@ -394,27 +396,67 @@ def add_workouts_plannedsession(ws,ps,r): w.user.user.email,w.user.user.first_name, mode='coursetest') if ps.sessiontype == 'fastest_distance': + records = CourseTestResult.objects.filter(userid=w.user.id,plannedsession=ps) + for record in records: + record.delete() + df = dataprep.getsmallrowdata_db(['time','cumdist'],ids=[w.id]) fastest_milliseconds = datautils.getfastest(df,ps.sessionvalue,mode='distance') + if fastest_milliseconds > 0: - duration = to_time(fastest_milliseconds) + + duration = to_time(1000.*fastest_milliseconds) record = CourseTestResult( userid=w.user.id, plannedsession = ps, duration = duration, coursecompleted = True, + workoutid=w.id, distance = ps.sessionvalue, ) + + record.save() + else: + record = CourseTestResult( + userid = w.user.id, + workoutid=w.id, + plannedsession = ps, + duration = dt.time(0,0), + coursecompleted = True, + distance = ps.sessionvalue, + ) + record.save() + if ps.sessiontype == 'fastest_time': + records = CourseTestResult.objects.filter(userid=w.user.id,plannedsession=ps) + for record in records: + record.delete() + + df = dataprep.getsmallrowdata_db(['time','cumdist'],ids=[w.id]) + fastest_meters = datautils.getfastest(df,ps.sessionvalue,mode='time') + print(fastest_meters,'aap') + if fastest_meters > 0: + duration = dt.time(0,ps.sessionvalue) + + record = CourseTestResult( + userid=w.user.id, + workoutid=w.id, + plannedsession = ps, + duration = duration, + coursecompleted = True, + distance = fastest_meters, + ) record.save() else: record = CourseTestResult( userid = w.user.id, plannedsession = ps, - duration = dt.time(0,0), + workoutid=w.id, + duration = dt.time(0,ps.sessionvalue), coursecompleted = True, - distance = ps.sessionvalue, + distance = fastest_meters, ) + record.save() else: errors.append('Workout %i did not match session dates' % w.id) @@ -668,6 +710,27 @@ def is_session_complete_ws(ws,ps): ratio = record.distance/ps.sessionvalue return ratio,'partial',completiondate return (0,'partial',None) + elif ps.sessiontype in ['fastest_time','fastest_distance']: + vs = CourseTestResult.objects.filter(plannedsession=ps,userid=ws[0].user.id) + completiondate = ws.reverse()[0].date + wids = [w.id for w in ws] + for record in vs: + if record.workoutid in wids: + if record.coursecompleted: + ratio = 1 + return ratio,'on target',completiondate + else: + return 0,'partial',completiondate + if ws: + record = CourseTestResult( + userid = ws[0].user.id, + plannedsession = ps, + workoutid = ws[0].id, + duration = dt.time(0,0), + coursecompleted = False + ) + record.save() + return (0,'not done',None) elif ps.sessiontype == 'coursetest': vs = CourseTestResult.objects.filter(plannedsession=ps) wids = [w.id for w in ws] diff --git a/rowers/templates/plannedsessionview.html b/rowers/templates/plannedsessionview.html index 669878a3..eefc22d1 100644 --- a/rowers/templates/plannedsessionview.html +++ b/rowers/templates/plannedsessionview.html @@ -41,7 +41,7 @@
  • - {% if plannedsession.sessiontype == 'test' or plannedsession.sessiontype == 'coursetest' %} + {% if plannedsession.sessiontype == 'test' or plannedsession.sessiontype == 'coursetest' or plannedsession.sessiontype == 'fastest_distance' or plannedsession.sessiontype == 'fastest_time' %}

    Ranking

    diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 361d57f3..3bde0c6d 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -558,6 +558,7 @@ def cpdata(workouts, options): res = interactive_otwcpchart(powerdf,promember=True,rowername=rowername,r=r, cpfit=cpfit,title=title,type=wtype) + script = res[0] div = res[1] p1 = res[2] diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index 0e277f0f..a5cb892c 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -1876,10 +1876,12 @@ def plannedsession_detach_view(request,id=0,psid=0): @permission_required('plannedsession.view_session',fn=get_session_by_pk,raise_exception=True) def plannedsession_view(request,id=0,userid=0): + r = getrequestplanrower(request,userid=userid) ps = get_object_or_404(PlannedSession,pk=id) + if ps.sessiontype in ['race','indoorrace']: url = reverse('virtualevent_view', kwargs={'id':ps.id} @@ -1974,12 +1976,72 @@ def plannedsession_view(request,id=0,userid=0): ) wdict['distance'] = ps.course.distance wdict['coursecompleted'] = False - - ranking.append(wdict) if ps.sessiontype == 'coursetest': ranking = sorted(ranking, key=lambda k: k['time']) + if ps.sessiontype == 'fastest_distance': + vs = CourseTestResult.objects.filter(plannedsession=ps) + + if vs: + for record in vs: + userid = record.userid + uu = User.objects.get(id=userid) + w = Workout.objects.get(id=record.workoutid) + wdict = { + 'name': uu.first_name+' '+uu.last_name, + 'date': w.date, + 'distance': record.distance, + 'type': w.workouttype, + 'coursecompleted':True, + } + + coursecompleted = record.coursecompleted + t = record.duration + wdict['time'] = datetime.timedelta( + hours=t.hour, + seconds=t.second, + minutes=t.minute, + microseconds=t.microsecond + ) + + + wdict['coursecompleted'] = coursecompleted + + ranking.append(wdict) + + ranking = sorted(ranking, key=lambda k: k['time']) + if ps.sessiontype == 'fastest_time': + vs = CourseTestResult.objects.filter(plannedsession=ps) + + if vs: + for record in vs: + userid = record.userid + uu = User.objects.get(id=userid) + w = Workout.objects.get(id=record.workoutid) + wdict = { + 'name': uu.first_name+' '+uu.last_name, + 'date': w.date, + 'distance': record.distance, + 'type': w.workouttype, + 'coursecompleted':True, + } + + coursecompleted = record.coursecompleted + t = record.duration + wdict['time'] = datetime.timedelta( + hours=t.hour, + seconds=t.second, + minutes=t.minute, + microseconds=t.microsecond + ) + + + wdict['coursecompleted'] = coursecompleted + + ranking.append(wdict) + ranking = sorted(ranking, key=lambda k: -k['distance']) + # if coursetest, need to reorder the ranking startdate,enddate = get_dates_timeperiod(request) From a58a796f68feed8f660f807235ca20df337665ca Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 9 Nov 2020 22:44:38 +0100 Subject: [PATCH 3/3] removing print --- rowers/plannedsessions.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 977f5a02..03e34e0a 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -377,7 +377,6 @@ def add_workouts_plannedsession(ws,ps,r): # start adding sessions for w in ws: - print(ps.sessiontype) if w.date>=ps.startdate and w.date<=ps.enddate: w.plannedsession = ps w.save() @@ -434,7 +433,7 @@ def add_workouts_plannedsession(ws,ps,r): df = dataprep.getsmallrowdata_db(['time','cumdist'],ids=[w.id]) fastest_meters = datautils.getfastest(df,ps.sessionvalue,mode='time') - print(fastest_meters,'aap') + if fastest_meters > 0: duration = dt.time(0,ps.sessionvalue)