get_all_slots() : l'exclusion des créneaux pour un même user_external_id ne prend pas en compte tous les agendas (#75587) #59

Merged
bdauvergne merged 2 commits from wip/75587-get-all-slots-l-exclusion-des-cr into main 2023-03-24 15:48:11 +01:00
2 changed files with 72 additions and 2 deletions

View File

@ -265,7 +265,7 @@ def get_all_slots(
)
booked_events = (
Event.objects.filter(
agenda__in=agenda_ids,
agenda__in=agendas,
start_datetime__gte=used_min_datetime - max_meeting_duration_td,
start_datetime__lte=used_max_datetime,
booking__user_external_id=user_external_id,
@ -278,7 +278,10 @@ def get_all_slots(
# compute exclusion set by desk from all bookings, using
# itertools.groupby() to group them by desk_id
user_bookings = IntervalSet.from_ordered(
(event_start_datetime, event_start_datetime + datetime.timedelta(minutes=event_duration))
(
event_start_datetime,
event_start_datetime + datetime.timedelta(minutes=event_duration),
)
for event_start_datetime, event_duration in booked_events
)

View File

@ -2550,3 +2550,70 @@ def test_fillslot_recurring_event_booking_forbidden(app, user):
resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda.slug, event.slug))
assert resp.json['err'] == 1
assert resp.json['err_class'] == 'event is recurrent'
# monday 15th march at 12:00 CEST
@pytest.mark.freeze_time('2021-03-15T12:00:00+01:00')
def test_user_external_id(app, user):
user_external_id = 'foobar'
meeting_agenda_1 = Agenda.objects.create(
label='Meeting agenda', slug='mt1', kind='meetings', minimal_booking_delay=0
)
desk = Desk.objects.create(agenda=meeting_agenda_1, slug='desk')
meeting_type = MeetingType.objects.create(agenda=meeting_agenda_1, slug='mtt')
TimePeriod.objects.create(
weekday=0, start_time=datetime.time(9, 0), end_time=datetime.time(17, 00), desk=desk
)
meeting_agenda_2 = meeting_agenda_1.duplicate()
meeting_agenda_2.maximal_booking_delay = 20
meeting_agenda_2.save()
meeting_agenda_3 = meeting_agenda_1.duplicate()
meeting_agenda_3.maximal_booking_delay = 30
meeting_agenda_3.save()
virtual_agenda = Agenda.objects.create(label='Virtual Agenda', kind='virtual')
virtual_agenda.real_agendas.add(meeting_agenda_1, meeting_agenda_2, meeting_agenda_3)
meeting_agenda_1_datetimes_url = f'/api/agenda/{meeting_agenda_1.slug}/meetings/{meeting_type.slug}/datetimes/?user_external_id={user_external_id}'
meeting_agenda_2_datetimes_url = f'/api/agenda/{meeting_agenda_2.slug}/meetings/{meeting_type.slug}/datetimes/?user_external_id={user_external_id}'
meeting_agenda_3_datetimes_url = f'/api/agenda/{meeting_agenda_3.slug}/meetings/{meeting_type.slug}/datetimes/?user_external_id={user_external_id}'
virtual_agenda_datetimes_url = f'/api/agenda/{virtual_agenda.slug}/meetings/{meeting_type.slug}/datetimes/?user_external_id={user_external_id}'
today_at_15 = localtime(now()).replace(hour=15, minute=0)
# check all slots are free
resp = app.get(virtual_agenda_datetimes_url)
assert not any(x['disabled'] for x in resp.json['data'])
resp = app.get(meeting_agenda_1_datetimes_url)
assert not any(x['disabled'] for x in resp.json['data'])
resp = app.get(meeting_agenda_2_datetimes_url)
assert not any(x['disabled'] for x in resp.json['data'])
resp = app.get(meeting_agenda_3_datetimes_url)
assert not any(x['disabled'] for x in resp.json['data'])
for agenda in virtual_agenda.get_real_agendas():
meeting_event = Event.objects.create(
label='Event',
slug='meeting1',
start_datetime=today_at_15,
agenda=agenda,
places=1,
meeting_type=agenda.meetingtype_set.all()[0],
desk=agenda.desk_set.all()[0],
)
Booking.objects.create(event=meeting_event, user_external_id=user_external_id)
# now some slots are disabled
resp = app.get(virtual_agenda_datetimes_url)
assert any(x['disabled'] for x in resp.json['data'])
agenda_datetimes_url = f'/api/agenda/{agenda.slug}/meetings/{meeting_type.slug}/datetimes/?user_external_id={user_external_id}'
resp = app.get(agenda_datetimes_url)
assert any(x['disabled'] for x in resp.json['data'])
for other_agenda in virtual_agenda.get_real_agendas():
if other_agenda == agenda:
continue
other_agenda_datetimes_url = f'/api/agenda/{other_agenda.slug}/meetings/{meeting_type.slug}/datetimes/?user_external_id={user_external_id}'
resp = app.get(other_agenda_datetimes_url)
assert not any(x['disabled'] for x in resp.json['data'])
meeting_event.delete()