From 3617c3ff0504e6f9329b9bc583254b735c4cca24 Mon Sep 17 00:00:00 2001 From: Emmanuel Cazenave Date: Tue, 27 Oct 2020 15:10:19 +0100 Subject: [PATCH] api: order desks by identifier (#48065) --- chrono/api/views.py | 2 +- tests/test_api.py | 94 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/chrono/api/views.py b/chrono/api/views.py index 7778c671..4889eac7 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -136,7 +136,7 @@ def get_all_slots(base_agenda, meeting_type, resources=None, unique=False): ) for time_period_desk, time_period_exceptions in itertools.groupby( TimePeriodException.objects.filter(desk__agenda__in=agendas).order_by( - 'desk', 'start_datetime', 'end_datetime' + 'desk_id', 'start_datetime', 'end_datetime' ), key=lambda time_period: time_period.desk, ) diff --git a/tests/test_api.py b/tests/test_api.py index 72abc81e..48a7ede8 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -3586,6 +3586,100 @@ def test_virtual_agendas_meetings_datetimes_api(app, virtual_meetings_agenda): assert len(resp.json['data']) == 3 +def test_virtual_agendas_meetings_datetimes_api_with_similar_desk(app): + agenda_foo = Agenda.objects.create( + label=u'Agenda Foo', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=3 + ) + meeting_type_foo = MeetingType.objects.create(agenda=agenda_foo, label='Meeting Type', duration=30) + test_1st_weekday = (now()).weekday() + 1 % 7 + test_2nd_weekday = localtime(now()).weekday() + 2 % 7 + test_3rd_weekday = (now()).weekday() + 3 % 7 + + desk_foo = Desk.objects.create(agenda=agenda_foo, label='Desk 1') + TimePeriod.objects.create( + weekday=test_1st_weekday, + start_time=datetime.time(10, 0), + end_time=datetime.time(12, 0), + desk=desk_foo, + ) + TimePeriod.objects.create( + weekday=test_2nd_weekday, + start_time=datetime.time(10, 0), + end_time=datetime.time(12, 0), + desk=desk_foo, + ) + TimePeriod.objects.create( + weekday=test_3rd_weekday, + start_time=datetime.time(10, 0), + end_time=datetime.time(12, 0), + desk=desk_foo, + ) + + agenda_bar = Agenda.objects.create( + label=u'Agenda Bar', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=3 + ) + meeting_type_bar = MeetingType.objects.create(agenda=agenda_bar, label='Meeting Type', duration=30) + desk_bar = Desk.objects.create(agenda=agenda_bar, label='Desk 1') + TimePeriod.objects.create( + weekday=test_1st_weekday, + start_time=datetime.time(10, 0), + end_time=datetime.time(12, 0), + desk=desk_bar, + ) + TimePeriod.objects.create( + weekday=test_2nd_weekday, + start_time=datetime.time(10, 0), + end_time=datetime.time(12, 0), + desk=desk_bar, + ) + TimePeriod.objects.create( + weekday=test_3rd_weekday, + start_time=datetime.time(10, 0), + end_time=datetime.time(12, 0), + desk=desk_bar, + ) + + virtual_agenda = Agenda.objects.create( + label=u'Agenda Virtual', kind='virtual', minimal_booking_delay=1, maximal_booking_delay=3 + ) + VirtualMember.objects.create(virtual_agenda=virtual_agenda, real_agenda=agenda_foo) + VirtualMember.objects.create(virtual_agenda=virtual_agenda, real_agenda=agenda_bar) + + # 4 slots each day * 3 days + foo_api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (agenda_foo.slug, meeting_type_bar.slug) + resp = app.get(foo_api_url) + assert len(resp.json['data']) == 12 + # same thing bar agenda + bar_api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (agenda_foo.slug, meeting_type_bar.slug) + resp = app.get(bar_api_url) + assert len(resp.json['data']) == 12 + # same thing on the virtual agenda + virtual_api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (virtual_agenda.slug, meeting_type_bar.slug) + resp = app.get(virtual_api_url) + assert len(resp.json['data']) == 12 + + # exclude first day + start = (now() + datetime.timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0) + end = (now() + datetime.timedelta(days=1)).replace(hour=23, minute=59, second=59, microsecond=0) + TimePeriodException.objects.create(start_datetime=start, end_datetime=end, desk=desk_foo) + TimePeriodException.objects.create(start_datetime=start, end_datetime=end, desk=desk_bar) + # exclude second day + start = (now() + datetime.timedelta(days=2)).replace(hour=0, minute=0, second=0, microsecond=0) + end = (now() + datetime.timedelta(days=2)).replace(hour=23, minute=59, second=59, microsecond=0) + TimePeriodException.objects.create(start_datetime=start, end_datetime=end, desk=desk_foo) + TimePeriodException.objects.create(start_datetime=start, end_datetime=end, desk=desk_bar) + + # 4 slots each day * 1 day + resp = app.get(foo_api_url) + assert len(resp.json['data']) == 4 + # same thing bar agenda + resp = app.get(bar_api_url) + assert len(resp.json['data']) == 4 + # same thing on the virtual agenda + resp = app.get(virtual_api_url) + assert len(resp.json['data']) == 4 + + def test_virtual_agendas_meetings_datetimes_delays_api(app, mock_now): foo_agenda = Agenda.objects.create(label='Foo Meeting', kind='meetings', maximal_booking_delay=7) MeetingType.objects.create(agenda=foo_agenda, label='Meeting Type', duration=30)