api: change date filtering of already booked meetings (#53313)

For a researsing slots in an interval of

    [min, max]

overlapping events should be considered if

    event.start_datetime \in [min - agenda.max_duration_meeting_types, max]

as the implicit event.end_datetime cannot be superior to:

    event.start_datetime + agenda.max_meeting_types_duration

and the formal condition for an overlapping event is :

    event.start_datetime < max && event.end_datetime > min
This commit is contained in:
Benjamin Dauvergne 2021-04-21 10:45:26 +02:00
parent 10a9c80f9a
commit 6c9518f4d6
1 changed files with 7 additions and 6 deletions

View File

@ -100,6 +100,7 @@ def get_all_slots(
# that the base_meeting_duration for the virtual agenda is always the same
# as the base meeting duration of each real agenda.
base_meeting_duration = base_agenda.get_base_meeting_duration()
max_meeting_duration_td = datetime.timedelta(minutes=base_agenda.get_max_meeting_duration())
base_min_datetime = get_min_datetime(base_agenda, start_datetime)
base_max_datetime = get_max_datetime(base_agenda, end_datetime)
@ -187,8 +188,8 @@ def get_all_slots(
booked_events = (
Event.objects.filter(
agenda__in=agenda_ids,
start_datetime__gte=used_min_datetime,
start_datetime__lte=used_max_datetime + meeting_duration_td,
start_datetime__gte=used_min_datetime - max_meeting_duration_td,
start_datetime__lte=used_max_datetime,
)
.exclude(booking__cancellation_datetime__isnull=False)
# ordering is important for the later groupby, it works like sort | uniq
@ -218,8 +219,8 @@ def get_all_slots(
booked_events = (
Event.objects.filter(
pk__in=event_ids_queryset,
start_datetime__gte=used_min_datetime,
start_datetime__lte=used_max_datetime + meeting_duration_td,
start_datetime__gte=used_min_datetime - max_meeting_duration_td,
start_datetime__lte=used_max_datetime,
)
.exclude(booking__cancellation_datetime__isnull=False)
.order_by('start_datetime', 'meeting_type__duration')
@ -241,8 +242,8 @@ def get_all_slots(
booked_events = (
Event.objects.filter(
agenda__in=agenda_ids,
start_datetime__gte=used_min_datetime,
start_datetime__lte=used_max_datetime + meeting_duration_td,
start_datetime__gte=used_min_datetime - max_meeting_duration_td,
start_datetime__lte=used_max_datetime,
booking__user_external_id=excluded_user_external_id,
)
.exclude(booking__cancellation_datetime__isnull=False)