Merge branch 'release/v23.3.5'
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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,
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
BIN
Binary file not shown.
Reference in New Issue
Block a user