From d5f61d75ae84e6168b9e750d393ce30dd658c3b2 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 24 May 2020 11:52:58 +0200 Subject: [PATCH 1/3] calculates and stores start / end time --- rowers/models.py | 3 +++ rowers/tasks.py | 22 +++++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index c69a1c34..f0659bf1 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2926,6 +2926,9 @@ class VirtualRaceResult(models.Model): emailnotifications = models.BooleanField(default=True, verbose_name = 'Receive challenge notifications by email') + startsecond = models.FloatField(default=0) + endsecond = models.FloatField(default=0) + def __str__(self): rr = Rower.objects.get(id=self.userid) name = '{u1} {u2}'.format( diff --git a/rowers/tasks.py b/rowers/tasks.py index f46caa62..71eca7bb 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -425,6 +425,8 @@ def handle_check_race_course(self, cseconds = [] cmeters = [] ccomplete = [] + startseconds = [] + endseconds = [] for startt in entrytimes: @@ -445,19 +447,23 @@ def handle_check_race_course(self, - coursetimeseconds = coursetimeseconds-coursetimefirst + coursetimesecondsnet = coursetimeseconds-coursetimefirst coursemeters = coursemeters-coursemetersfirst - cseconds.append(coursetimeseconds) + cseconds.append(coursetimesecondsnet) cmeters.append(coursemeters) ccomplete.append(coursecompleted) + endseconds.append(coursetimeseconds) + startseconds.append(coursetimefirst) records = pd.DataFrame({ 'coursetimeseconds':cseconds, 'coursecompleted': ccomplete, - 'coursemeters': cmeters + 'coursemeters': cmeters, + 'startsecond':startseconds, + 'endsecond':endseconds, }) records = records[records['coursecompleted'] == True] @@ -468,24 +474,30 @@ def handle_check_race_course(self, mintime = records['coursetimeseconds'].min() coursetimeseconds = records[records['coursetimeseconds'] == mintime]['coursetimeseconds'].min() coursemeters = records[records['coursetimeseconds'] == mintime]['coursemeters'].min() + startsecond = records[records['coursetimeseconds'] == mintime]['startsecond'].min() + endsecond = records[records['coursetimeseconds'] == mintime]['endsecond'].min() else: coursecompleted = False if coursecompleted: - query = 'UPDATE rowers_virtualraceresult SET coursecompleted = 1, duration = "{duration}", distance = {distance}, workoutid = {workoutid} WHERE id={recordid}'.format( + query = 'UPDATE rowers_virtualraceresult SET coursecompleted = 1, duration = "{duration}", distance = {distance}, workoutid = {workoutid}, startsecond = {startsecond}, endsecond = {endsecond} WHERE id={recordid}'.format( recordid=recordid, duration=totaltime_sec_to_string(coursetimeseconds), distance=int(coursemeters), workoutid=workoutid, + startsecond=startsecond, + endsecond=endsecond, ) if mode == 'coursetest': - query = 'UPDATE rowers_coursetestresult SET coursecompleted = 1, duration = "{duration}", distance = {distance}, workoutid = {workoutid} WHERE id={recordid}'.format( + query = 'UPDATE rowers_coursetestresult SET coursecompleted = 1, duration = "{duration}", distance = {distance}, workoutid = {workoutid}, startsecond = {startsecond}, endsecond = {endsecond} WHERE id={recordid}'.format( recordid=recordid, duration=totaltime_sec_to_string(coursetimeseconds), distance=int(coursemeters), workoutid=workoutid, + startsecond=startsecond, + endsecond=endsecond, ) From d2fd4fe56276f1d7351c79059187177c2e416838 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 24 May 2020 12:33:36 +0200 Subject: [PATCH 2/3] show race interval as work interval in details --- rowers/interactiveplots.py | 1 - rowers/templates/virtualevent.html | 4 ++-- rowers/templates/workout_view.html | 2 +- rowers/urls.py | 1 + rowers/views/workoutviews.py | 29 +++++++++++++++++++++++++---- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 6bebbd2a..8d508a48 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -3312,7 +3312,6 @@ def interactive_chart(id=0,promember=0,intervaldata = {}): plot.legend.location = "bottom_right" - # add shaded bar chart areas if intervaldata != {}: intervaldf = pd.DataFrame(intervaldata) diff --git a/rowers/templates/virtualevent.html b/rowers/templates/virtualevent.html index 9e4187c2..abdc4a03 100644 --- a/rowers/templates/virtualevent.html +++ b/rowers/templates/virtualevent.html @@ -282,7 +282,7 @@ {{ forloop.counter }} - + {{ result.username }} {{ result.teamname }} {{ result.age }} @@ -302,7 +302,7 @@ {{ result.duration |durationprint:"%H:%M:%S.%f" }} {{ result.distance }} m - + Details {% if race.manager == request.user and not race|is_final %} diff --git a/rowers/templates/workout_view.html b/rowers/templates/workout_view.html index 8cc738f1..942b9534 100644 --- a/rowers/templates/workout_view.html +++ b/rowers/templates/workout_view.html @@ -111,7 +111,7 @@

-        {{ workout.summary }}
+        {{ summary }}
       

diff --git a/rowers/urls.py b/rowers/urls.py index 097ad88c..c03c809b 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -352,6 +352,7 @@ urlpatterns = [ re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/restore/$',views.workout_summary_restore_view,name='workout_summary_restore_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/split/$',views.workout_split_view,name='workout_split_view'), # re_path(r'^workout/(?P\d+)/interactiveplot/$',views.workout_biginteractive_view), + re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/view/entry/(?P\d+)/$',views.workout_view,name='workout_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/view/$',views.workout_view,name='workout_view'), re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/video/$',views.workout_video_create_view, name='workout_video_create_view'), diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 6e851339..aec07a9e 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -2156,7 +2156,7 @@ def workout_fusion_list(request,id=0, # Basic view of workout @permission_required('workout.view_workout',fn=get_workout_by_opaqueid,raise_exception=True) -def workout_view(request,id=0): +def workout_view(request,id=0,raceresult=0): request.session['referer'] = absolute(request)['PATH'] if not request.user.is_anonymous: @@ -2164,7 +2164,10 @@ def workout_view(request,id=0): else: rower = None + # get row row = get_workout_by_opaqueid(request,id) + f1 = row.csvfilename + rowdata = rdata(f1) comments = WorkoutComment.objects.filter(workout=row) @@ -2181,16 +2184,33 @@ def workout_view(request,id=0): except: pass + # get raceresult + intervaldata = {} + if raceresult != 0: + try: + result = VirtualRaceResult.objects.get(id=raceresult) + startsecond = result.startsecond + endsecond = result.endsecond + duration = row.duration + durationsecs = duration.hour*3600+duration.minute*60+duration.second + itime = [startsecond,endsecond-startsecond] + itype = [3,4] + intervaldata['itime'] = itime + intervaldata['itype'] = itype + rowdata.updateinterval_metric(' AverageBoatSpeed (m/s)',0.1,mode='larger', + debug=False,smoothwindow=15., + activewindow = [startsecond,endsecond]) + summary = rowdata.allstats() + except VirtualRaceResult.DoesNotExist: + summary = row.summary # create interactive plot - res = interactive_chart(encoder.decode_hex(id)) + res = interactive_chart(encoder.decode_hex(id),intervaldata=intervaldata) script = res[0] div = res[1] # create map - f1 = row.csvfilename - rowdata = rdata(f1) hascoordinates = 1 if rowdata != 0: try: @@ -2239,6 +2259,7 @@ def workout_view(request,id=0): 'graphs':g, 'last_name':u.last_name, 'records':records, + 'summary':summary, 'recordsindoor':recordsindoor, 'first_name':u.first_name, 'interactiveplot':script, From e2c653848af842afdae0f7c4b855bf87b01ebb3f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 24 May 2020 13:15:21 +0200 Subject: [PATCH 3/3] bug fix --- rowers/views/workoutviews.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index aec07a9e..0f2db8d6 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -2168,6 +2168,7 @@ def workout_view(request,id=0,raceresult=0): row = get_workout_by_opaqueid(request,id) f1 = row.csvfilename rowdata = rdata(f1) + summary = row.summary comments = WorkoutComment.objects.filter(workout=row) @@ -2203,8 +2204,7 @@ def workout_view(request,id=0,raceresult=0): activewindow = [startsecond,endsecond]) summary = rowdata.allstats() except VirtualRaceResult.DoesNotExist: - summary = row.summary - + pass # create interactive plot res = interactive_chart(encoder.decode_hex(id),intervaldata=intervaldata) script = res[0]