diff --git a/chrono/api/views.py b/chrono/api/views.py index 7ae8a818..2c253fb6 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -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 ) diff --git a/tests/api/fillslot/test_all.py b/tests/api/fillslot/test_all.py index b16a9eb4..d816b6cb 100644 --- a/tests/api/fillslot/test_all.py +++ b/tests/api/fillslot/test_all.py @@ -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()