Private
Public Access
1
0

Merge branch 'release/v23.3.5'

This commit is contained in:
2025-03-28 16:30:37 +01:00
6 changed files with 35 additions and 24 deletions
+9 -5
View File
@@ -93,13 +93,17 @@ class Race(models.Model):
return self.name return self.name
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
results = self.results.all()
crews = [] crews = []
athletes = [] athletes = []
for result in results:
crews.append(result.crew.id) try:
for athlete in result.crew.athletes.all(): results = self.results.all()
athletes.append(athlete.id) 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)): if len(crews) != len(set(crews)):
raise ValidationError( raise ValidationError(
+4 -1
View File
@@ -740,7 +740,10 @@ def join_workouts(r, ids, title='Joined Workout',
while len(files): while len(files):
row2 = rdata(files[0]) row2 = rdata(files[0])
if row2 != 0 and row2 is not None: if row2 != 0 and row2 is not None:
row = row+row2 try:
row = row+row2
except TypeError: # pragma: no cover
pass
files = files[1:] files = files[1:]
timestr = strftime("%Y%m%d-%H%M%S") timestr = strftime("%Y%m%d-%H%M%S")
+6 -1
View File
@@ -2963,7 +2963,10 @@ class PlannedSession(models.Model):
if self.fitfile: if self.fitfile:
steps = steps_read_fit(settings.MEDIA_ROOT+'/'+self.fitfile.name) steps = steps_read_fit(settings.MEDIA_ROOT+'/'+self.fitfile.name)
self.steps = steps self.steps = steps
self.steps['workoutName'] = self.name try:
self.steps['workoutName'] = self.name
except TypeError:
pass
self.save() self.save()
@@ -4696,6 +4699,8 @@ class WorkoutForm(ModelForm):
cd = self.cleaned_data cd = self.cleaned_data
if cd['duration'] is None or cd['duration'] == '': if cd['duration'] is None or cd['duration'] == '':
raise forms.ValidationError('Duration cannot be empty') 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 # Used for the rowing physics calculations
+11 -16
View File
@@ -48,6 +48,7 @@ queue = django_rq.get_queue('default')
queuelow = django_rq.get_queue('low') queuelow = django_rq.get_queue('low')
queuehigh = django_rq.get_queue('low') queuehigh = django_rq.get_queue('low')
from rowers.session_utils import timefield_to_minutes_duration
def to_time(milliseconds): def to_time(milliseconds):
seconds = milliseconds/1000. seconds = milliseconds/1000.
@@ -325,23 +326,17 @@ def get_indoorraces(workout):
sessionmode='distance', sessionmode='distance',
sessionvalue=workout.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( registrations = IndoorVirtualRaceResult.objects.filter(
race__in=races, race__in=races,
+5 -1
View File
@@ -10,7 +10,11 @@ def timefield_to_seconds_duration(t):
return duration return duration
def timefield_to_minutes_duration(t):
duration = t.hour*60.
duration += t.minute
return duration
def is_session_complete_ws(ws, ps): def is_session_complete_ws(ws, ps):
ws = ws.order_by("date") ws = ws.order_by("date")
Binary file not shown.