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..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.second == 0 and workout.duration.microsecond == 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 8c81c81b..9030071b 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ