api: fix datetimes meta if first slot is disabled for user (#52051)

This commit is contained in:
Lauréline Guérin 2021-03-15 15:08:13 +01:00
parent f7f318d000
commit e9f180d5fe
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 43 additions and 7 deletions

View File

@ -380,6 +380,14 @@ def get_event_places(event):
return places
def is_event_disabled(event, min_places=1):
if event.remaining_places < min_places and event.remaining_waiting_list_places < min_places:
return True
if getattr(event, 'user_places_count', 0) > 0:
return True
return False
def get_event_detail(request, event, agenda=None, min_places=1):
agenda = agenda or event.agenda
if event.label and event.primary_event is not None:
@ -387,7 +395,6 @@ def get_event_detail(request, event, agenda=None, min_places=1):
event.label,
date_format(localtime(event.start_datetime), 'DATETIME_FORMAT'),
)
full = bool(event.remaining_places < min_places and event.remaining_waiting_list_places < min_places)
return {
'id': event.slug,
'slug': event.slug, # kept for compatibility
@ -396,7 +403,7 @@ def get_event_detail(request, event, agenda=None, min_places=1):
'description': event.description,
'pricing': event.pricing,
'url': event.url,
'disabled': full or getattr(event, 'user_places_count', 0) > 0,
'disabled': is_event_disabled(event, min_places=min_places),
'api': {
'bookings_url': request.build_absolute_uri(
reverse(
@ -427,7 +434,7 @@ def get_events_meta_detail(request, events, agenda=None, min_places=1):
first_bookable_slot = None
for event in events:
bookable_datetimes_number_total += 1
if bool(event.remaining_places >= min_places or event.remaining_waiting_list_places >= min_places):
if not is_event_disabled(event, min_places=min_places):
bookable_datetimes_number_available += 1
if not first_bookable_slot:
first_bookable_slot = get_event_detail(request, event, agenda=agenda, min_places=min_places)

View File

@ -543,6 +543,8 @@ def test_datetimes_api_exclude_slots(app):
resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug, params={'exclude_user_external_id': '42'})
assert resp.json['data'][0]['disabled'] is True
assert resp.json['meta']['first_bookable_slot'] is None
assert resp.json['meta']['no_bookable_datetimes'] is True
event.delete()
@ -1065,6 +1067,7 @@ def test_datetimes_api_meetings_agenda_exclude_slots(app):
assert resp.json['data'][0]['disabled'] is True
assert resp.json['data'][2]['id'] == 'foo-bar:2021-02-26-1000'
assert resp.json['data'][2]['disabled'] is False
assert resp.json['meta']['first_bookable_slot']['id'] == 'foo-bar:2021-02-26-0930'
def test_booking_api(app, some_data, user):
@ -5722,7 +5725,7 @@ def test_datetimes_api_meta(app, freezer):
def simulate_booking(event, nb_places):
for i in range(nb_places):
Booking(event=event).save()
Booking(event=event, user_external_id='42').save()
simulate_booking(events[0], 10)
resp = app.get(api_url)
@ -5733,6 +5736,14 @@ def test_datetimes_api_meta(app, freezer):
'bookable_datetimes_number_available': 3,
'first_bookable_slot': resp.json['data'][0],
}
resp = app.get(api_url, params={'exclude_user_external_id': '42'})
assert len(resp.json['data']) == 3
assert resp.json['meta'] == {
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 3,
'bookable_datetimes_number_available': 2,
'first_bookable_slot': resp.json['data'][1],
}
resp = app.get(api_url + '?min_places=11')
assert len(resp.json['data']) == 3
@ -5808,7 +5819,7 @@ def test_datetimes_api_meetings_agenda_meta(app, freezer):
desk=desk,
)
ev.save()
booking = Booking(event=ev)
booking = Booking(event=ev, user_external_id='42')
booking.save()
simulate_booking(resp.json['meta']['first_bookable_slot'], desk1)
@ -5821,8 +5832,17 @@ def test_datetimes_api_meetings_agenda_meta(app, freezer):
'bookable_datetimes_number_available': 4,
'first_bookable_slot': resp.json['data'][0],
}
resp = app.get(api_url, params={'exclude_user_external_id': '42'})
assert len(resp.json['data']) == 4
assert resp.json['data'][0]['disabled'] is True
assert resp.json['meta'] == {
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 4,
'bookable_datetimes_number_available': 3,
'first_bookable_slot': resp.json['data'][1],
}
simulate_booking(resp.json['meta']['first_bookable_slot'], desk2)
simulate_booking(resp.json['data'][0], desk2)
resp = app.get(api_url)
assert len(resp.json['data']) == 4
assert resp.json['data'][0]['disabled'] is True
@ -5890,7 +5910,7 @@ def test_datetimes_api_virtual_meetings_agenda_meta(app, freezer):
desk=desk,
)
ev.save()
booking = Booking(event=ev)
booking = Booking(event=ev, user_external_id='42')
booking.save()
simulate_booking(resp.json['data'][0], meetings_agenda1, desk1)
@ -5903,6 +5923,15 @@ def test_datetimes_api_virtual_meetings_agenda_meta(app, freezer):
'bookable_datetimes_number_available': 4,
'first_bookable_slot': resp.json['data'][0],
}
resp = app.get(api_url, params={'exclude_user_external_id': '42'})
assert len(resp.json['data']) == 4
assert resp.json['data'][0]['disabled'] is True
assert resp.json['meta'] == {
'no_bookable_datetimes': False,
'bookable_datetimes_number_total': 4,
'bookable_datetimes_number_available': 3,
'first_bookable_slot': resp.json['data'][1],
}
simulate_booking(resp.json['data'][0], meetings_agenda2, desk2)
resp = app.get(api_url)