api: add first bookable slot info in /datetimes/ meta (#51165)

This commit is contained in:
Valentin Deniaud 2021-02-16 11:17:34 +01:00
parent b439696bb1
commit 24296826b1
2 changed files with 36 additions and 37 deletions

View File

@ -398,21 +398,21 @@ def get_event_detail(request, event, agenda=None):
}
def get_events_meta_detail(events):
def get_events_meta_detail(request, events, agenda=None):
bookable_datetimes_number_total = 0
bookable_datetimes_number_available = 0
bookable_datetimes_first = None
first_bookable_slot = None
for event in events:
bookable_datetimes_number_total += 1
if not bool(event.full):
bookable_datetimes_number_available += 1
if not bookable_datetimes_first:
bookable_datetimes_first = format_response_datetime(event.start_datetime)
if not first_bookable_slot:
first_bookable_slot = get_event_detail(request, event, agenda=agenda)
return {
'no_bookable_datetimes': bool(bookable_datetimes_number_available == 0),
'bookable_datetimes_number_total': bookable_datetimes_number_total,
'bookable_datetimes_number_available': bookable_datetimes_number_available,
'bookable_datetimes_first': bookable_datetimes_first,
'first_bookable_slot': first_bookable_slot,
}
@ -529,7 +529,7 @@ class Datetimes(APIView):
response = {
'data': [get_event_detail(request, x, agenda=agenda) for x in entries],
'meta': get_events_meta_detail(entries),
'meta': get_events_meta_detail(request, entries, agenda=agenda),
}
return Response(response)
@ -633,29 +633,28 @@ class MeetingDatetimes(APIView):
bookable_datetimes_number_total = 0
bookable_datetimes_number_available = 0
bookable_datetimes_first = None
first_bookable_slot = None
data = []
for slot in generator_of_unique_slots:
bookable_datetimes_number_total += 1
if not bool(slot.full):
bookable_datetimes_number_available += 1
if not bookable_datetimes_first:
bookable_datetimes_first = format_response_datetime(slot.start_datetime)
# Make virtual id for a slot, combining meeting_type.id and
# iso-format of date and time.
# (SharedTimePeriod.get_time_slots() generate datetime in fixed local timezone,
# in order to make slot_id stable.)
slot_id = '%s:%s' % (meeting_type.slug, slot.start_datetime.strftime('%Y-%m-%d-%H%M'))
data.append(
{
'id': slot_id,
'datetime': format_response_datetime(slot.start_datetime),
'text': date_format(slot.start_datetime, format='DATETIME_FORMAT'),
'disabled': bool(slot.full),
'api': {'fillslot_url': fillslot_url.replace(fake_event_identifier, slot_id)},
}
)
slot_data = {
'id': slot_id,
'datetime': format_response_datetime(slot.start_datetime),
'text': date_format(slot.start_datetime, format='DATETIME_FORMAT'),
'disabled': bool(slot.full),
'api': {'fillslot_url': fillslot_url.replace(fake_event_identifier, slot_id)},
}
data.append(slot_data)
bookable_datetimes_number_total += 1
if not bool(slot.full):
bookable_datetimes_number_available += 1
if not first_bookable_slot:
first_bookable_slot = slot_data
response = {
'data': data,
@ -663,7 +662,7 @@ class MeetingDatetimes(APIView):
'no_bookable_datetimes': bool(bookable_datetimes_number_available == 0),
'bookable_datetimes_number_total': bookable_datetimes_number_total,
'bookable_datetimes_number_available': bookable_datetimes_number_available,
'bookable_datetimes_first': bookable_datetimes_first,
'first_bookable_slot': first_bookable_slot,
},
}
return Response(response)

View File

@ -5034,7 +5034,7 @@ def test_datetimes_api_meta(app, freezer):
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 3,
'bookable_datetimes_number_available': 3,
'bookable_datetimes_first': '2017-05-21 17:00:00',
'first_bookable_slot': resp.json['data'][0],
}
def simulate_booking(event, nb_places):
@ -5048,7 +5048,7 @@ def test_datetimes_api_meta(app, freezer):
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 3,
'bookable_datetimes_number_available': 3,
'bookable_datetimes_first': '2017-05-21 17:00:00',
'first_bookable_slot': resp.json['data'][0],
}
simulate_booking(events[0], 10)
@ -5058,7 +5058,7 @@ def test_datetimes_api_meta(app, freezer):
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 3,
'bookable_datetimes_number_available': 2,
'bookable_datetimes_first': '2017-05-22 17:00:00',
'first_bookable_slot': resp.json['data'][1],
}
simulate_booking(events[1], 20)
@ -5069,7 +5069,7 @@ def test_datetimes_api_meta(app, freezer):
'no_bookable_datetimes': True,
'bookable_datetimes_number_total': 3,
'bookable_datetimes_number_available': 0,
'bookable_datetimes_first': None,
'first_bookable_slot': None,
}
@ -5102,7 +5102,7 @@ def test_datetimes_api_meetings_agenda_meta(app, freezer):
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 4,
'bookable_datetimes_number_available': 4,
'bookable_datetimes_first': '2017-05-22 10:00:00',
'first_bookable_slot': resp.json['data'][0],
}
def simulate_booking(slot, desk):
@ -5119,7 +5119,7 @@ def test_datetimes_api_meetings_agenda_meta(app, freezer):
booking = Booking(event=ev)
booking.save()
simulate_booking(resp.json['data'][0], desk1)
simulate_booking(resp.json['meta']['first_bookable_slot'], desk1)
resp = app.get(api_url)
assert len(resp.json['data']) == 4
assert resp.json['data'][0]['disabled'] is False
@ -5127,10 +5127,10 @@ def test_datetimes_api_meetings_agenda_meta(app, freezer):
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 4,
'bookable_datetimes_number_available': 4,
'bookable_datetimes_first': '2017-05-22 10:00:00',
'first_bookable_slot': resp.json['data'][0],
}
simulate_booking(resp.json['data'][0], desk2)
simulate_booking(resp.json['meta']['first_bookable_slot'], desk2)
resp = app.get(api_url)
assert len(resp.json['data']) == 4
assert resp.json['data'][0]['disabled'] is True
@ -5138,7 +5138,7 @@ def test_datetimes_api_meetings_agenda_meta(app, freezer):
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 4,
'bookable_datetimes_number_available': 3,
'bookable_datetimes_first': '2017-05-22 10:30:00',
'first_bookable_slot': resp.json['data'][1],
}
for idx in range(1, 4):
@ -5150,7 +5150,7 @@ def test_datetimes_api_meetings_agenda_meta(app, freezer):
'no_bookable_datetimes': True,
'bookable_datetimes_number_total': 4,
'bookable_datetimes_number_available': 0,
'bookable_datetimes_first': None,
'first_bookable_slot': None,
}
@ -5184,7 +5184,7 @@ def test_datetimes_api_virtual_meetings_agenda_meta(app, freezer):
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 4,
'bookable_datetimes_number_available': 4,
'bookable_datetimes_first': '2017-05-22 10:00:00',
'first_bookable_slot': resp.json['data'][0],
}
def simulate_booking(slot, agenda, desk):
@ -5209,7 +5209,7 @@ def test_datetimes_api_virtual_meetings_agenda_meta(app, freezer):
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 4,
'bookable_datetimes_number_available': 4,
'bookable_datetimes_first': '2017-05-22 10:00:00',
'first_bookable_slot': resp.json['data'][0],
}
simulate_booking(resp.json['data'][0], meetings_agenda2, desk2)
@ -5220,7 +5220,7 @@ def test_datetimes_api_virtual_meetings_agenda_meta(app, freezer):
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 4,
'bookable_datetimes_number_available': 3,
'bookable_datetimes_first': '2017-05-22 10:30:00',
'first_bookable_slot': resp.json['data'][1],
}
for idx in range(1, 4):
@ -5232,5 +5232,5 @@ def test_datetimes_api_virtual_meetings_agenda_meta(app, freezer):
'no_bookable_datetimes': True,
'bookable_datetimes_number_total': 4,
'bookable_datetimes_number_available': 0,
'bookable_datetimes_first': None,
'first_bookable_slot': None,
}