From d7d26c56b04cd5d90f166111be5ccc3a09775f54 Mon Sep 17 00:00:00 2001 From: xAndy Date: Sat, 17 May 2025 20:00:16 +0200 Subject: [PATCH] allow shift registrations end to start --- shiftregister/app/models.py | 4 ++-- shiftregister/app/tests.py | 23 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/shiftregister/app/models.py b/shiftregister/app/models.py index acfab98..2af5776 100644 --- a/shiftregister/app/models.py +++ b/shiftregister/app/models.py @@ -145,10 +145,10 @@ class Helper(models.Model): ) | # Case 2: End time falls between new shift's start and end - Q(shift_end__gt=shift.start_at, shift_end__lte=new_shift_end) + Q(shift_end__gt=shift.start_at, shift_end__lt=new_shift_end) | # Case 3: Completely encompasses the new shift - Q(shift__start_at__lte=shift.start_at, shift_end__gte=new_shift_end) + Q(shift__start_at__lt=shift.start_at, shift_end__gt=new_shift_end) ) .first() ) diff --git a/shiftregister/app/tests.py b/shiftregister/app/tests.py index 4f50b91..7a6cd86 100644 --- a/shiftregister/app/tests.py +++ b/shiftregister/app/tests.py @@ -43,11 +43,32 @@ class ShiftOverlapTests(TestCase): ) self.assertIsNone(self.helper.has_overlapping_shift(shift_before)) + def test_back_to_back_shifts(self): + """Test that a shift starting exactly when another ends is allowed""" + shift_after = Shift.objects.create( + room=self.room, + start_at=self.base_shift.start_at + self.base_shift.duration, + duration=timedelta(hours=1), + required_helpers=1, + ) + self.assertIsNone(self.helper.has_overlapping_shift(shift_after)) + + # Also test the reverse case - registering for a shift that ends exactly when another begins + self.base_registration.delete() + ShiftRegistration.objects.create( + shift=shift_after, + helper=self.helper, + state=ShiftRegistration.RegState.REGISTERED, + ) + self.assertIsNone(self.helper.has_overlapping_shift(self.base_shift)) + def test_no_overlap_after(self): """Test a shift that starts after the base shift ends""" shift_after = Shift.objects.create( room=self.room, - start_at=self.base_shift.start_at + timedelta(hours=4), + start_at=self.base_shift.start_at + + self.base_shift.duration + + timedelta(hours=1), duration=timedelta(hours=1), required_helpers=1, )