From b951e2482193926b85ede226496a48acf733a229 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 4 Mar 2025 13:51:16 +0100 Subject: [PATCH 1/3] tested --- rowers/tests/testdata/testdata.tcx.gz | Bin 3989 -> 3989 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 8c81c81b672b1d2f69edee35fbe78f0a1a6c75c8..e0a77a3e8fe1b2ce4db8aa8ce829abab128ded5f 100644 GIT binary patch delta 16 XcmbO#KUJPxzMF%?K;+m)_C9_9CNl(y delta 16 XcmbO#KUJPxzMF$XGx*3x_C9_9CvpV8 From b83710fca3561f38024438ccb7bbf13e3d1c05cf Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 28 Mar 2025 11:19:54 +0100 Subject: [PATCH 2/3] small bug fixes --- boatmovers/models.py | 14 +++++++++----- rowers/dataprep.py | 5 ++++- rowers/models.py | 7 ++++++- rowers/plannedsessions.py | 2 +- rowers/tests/testdata/testdata.tcx.gz | Bin 3989 -> 3989 bytes 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/boatmovers/models.py b/boatmovers/models.py index ccf22a38..e266f29b 100644 --- a/boatmovers/models.py +++ b/boatmovers/models.py @@ -93,13 +93,17 @@ class Race(models.Model): return self.name def save(self, *args, **kwargs): - results = self.results.all() crews = [] athletes = [] - for result in results: - crews.append(result.crew.id) - for athlete in result.crew.athletes.all(): - athletes.append(athlete.id) + + try: + results = self.results.all() + for result in results: + crews.append(result.crew.id) + for athlete in result.crew.athletes.all(): + athletes.append(athlete.id) + except ValueError: + pass if len(crews) != len(set(crews)): raise ValidationError( diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 1bed7187..dc58b6fb 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -740,7 +740,10 @@ def join_workouts(r, ids, title='Joined Workout', while len(files): row2 = rdata(files[0]) if row2 != 0 and row2 is not None: - row = row+row2 + try: + row = row+row2 + except TypeError: # pragma: no cover + pass files = files[1:] timestr = strftime("%Y%m%d-%H%M%S") diff --git a/rowers/models.py b/rowers/models.py index a5c30698..43665c5b 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2963,7 +2963,10 @@ class PlannedSession(models.Model): if self.fitfile: steps = steps_read_fit(settings.MEDIA_ROOT+'/'+self.fitfile.name) self.steps = steps - self.steps['workoutName'] = self.name + try: + self.steps['workoutName'] = self.name + except TypeError: + pass self.save() @@ -4696,6 +4699,8 @@ class WorkoutForm(ModelForm): cd = self.cleaned_data if cd['duration'] is None or cd['duration'] == '': raise forms.ValidationError('Duration cannot be empty') + if cd['date'] is None or cd['date'] == '': + raise forms.ValidationError('Date cannot be empty') # Used for the rowing physics calculations diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 43fe0642..fe89dbbd 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -329,7 +329,7 @@ def get_indoorraces(workout): if workout.duration is None: workout.duration = timedelta(0) - if workout.duration.second == 0 and workout.duration.microsecond == 0: + if workout.duration.seconds == 0 and workout.duration.microseconds == 0: duration = 60*workout.duration.hour+workout.duration.minute races2 = VirtualRace.objects.filter( diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index e0a77a3e8fe1b2ce4db8aa8ce829abab128ded5f..68924396d8e1d6872241ea6f12c99cc5f1f38bcd 100644 GIT binary patch delta 16 XcmbO#KUJPxzMF$XD(Bfo_C9_9C`knC delta 16 XcmbO#KUJPxzMF%?K;+m)_C9_9CNl(y From 574e361a6cb02371c2edea957e80a1c8f3beaa73 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 28 Mar 2025 16:27:53 +0100 Subject: [PATCH 3/3] fixes --- rowers/plannedsessions.py | 27 +++++++++++--------------- rowers/session_utils.py | 6 +++++- rowers/tests/testdata/testdata.tcx.gz | Bin 3989 -> 3989 bytes 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index fe89dbbd..7df99eda 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -48,6 +48,7 @@ queue = django_rq.get_queue('default') queuelow = django_rq.get_queue('low') queuehigh = django_rq.get_queue('low') +from rowers.session_utils import timefield_to_minutes_duration def to_time(milliseconds): seconds = milliseconds/1000. @@ -325,23 +326,17 @@ def get_indoorraces(workout): sessionmode='distance', sessionvalue=workout.distance) + duration = timefield_to_minutes_duration(workout.duration) + + races2 = VirtualRace.objects.filter( + sessiontype='indoorrace', + startdate__lte=workout.date, + enddate__gte=workout.date, + sessionmode='time', + sessionvalue=duration) + + races = races1 | races2 - if workout.duration is None: - workout.duration = timedelta(0) - - if workout.duration.seconds == 0 and workout.duration.microseconds == 0: - duration = 60*workout.duration.hour+workout.duration.minute - - races2 = VirtualRace.objects.filter( - sessiontype='indoorrace', - startdate__lte=workout.date, - enddate__gte=workout.date, - sessionmode='time', - sessionvalue=duration) - - races = races1 | races2 - else: - races = races1 registrations = IndoorVirtualRaceResult.objects.filter( race__in=races, diff --git a/rowers/session_utils.py b/rowers/session_utils.py index 87de7643..76128450 100644 --- a/rowers/session_utils.py +++ b/rowers/session_utils.py @@ -10,7 +10,11 @@ def timefield_to_seconds_duration(t): return duration - +def timefield_to_minutes_duration(t): + duration = t.hour*60. + duration += t.minute + + return duration def is_session_complete_ws(ws, ps): ws = ws.order_by("date") diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 68924396d8e1d6872241ea6f12c99cc5f1f38bcd..9030071b5d875089e5ae6e7ad11d4b622bb92a28 100644 GIT binary patch delta 15 WcmbO#KUJPhzMF%?WXDFfetrNWCj@E$ delta 15 WcmbO#KUJPhzMF$XDrX~GKR*B=4+I1N