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
|
@ -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
|
||||
)
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue