api: fix datetimes meta if first slot is disabled for user (#52051)
This commit is contained in:
parent
f7f318d000
commit
e9f180d5fe
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue