api: do not disabled full events when booked in events datetimes (#79120)
gitea/chrono/pipeline/head This commit looks good Details

This commit is contained in:
Valentin Deniaud 2023-06-27 17:56:46 +02:00
parent 90d3c29b72
commit cce129b8bc
2 changed files with 52 additions and 1 deletions

View File

@ -142,7 +142,14 @@ def get_event_places(event):
return places
def is_event_disabled(event, min_places=1, disable_booked=True, bookable_events=None, bypass_delays=False):
def is_event_disabled(
event,
min_places=1,
disable_booked=True,
bookable_events=None,
bypass_delays=False,
enable_full_when_booked=False,
):
if disable_booked and getattr(event, 'user_places_count', 0) > 0:
return True
if event.start_datetime < now():
@ -160,6 +167,8 @@ def is_event_disabled(event, min_places=1, disable_booked=True, bookable_events=
# event is out of minimal delay and we don't want to bypass delays
return True
if event.remaining_places < min_places and event.remaining_waiting_list_places < min_places:
if enable_full_when_booked and getattr(event, 'user_places_count', 0) > 0:
return False
return True
return False
@ -199,6 +208,7 @@ def get_event_detail(
disable_booked=True,
bypass_delays=False,
with_status=False,
enable_full_when_booked=False,
):
details = get_short_event_detail(
request=request,
@ -245,6 +255,7 @@ def get_event_detail(
disable_booked=disable_booked,
bookable_events=bookable_events,
bypass_delays=bypass_delays,
enable_full_when_booked=enable_full_when_booked,
),
'api': {
'bookings_url': request.build_absolute_uri(
@ -743,6 +754,7 @@ class MultipleAgendasDatetimes(APIView):
booked_user_external_id=payload.get('user_external_id'),
multiple_agendas=True,
disable_booked=disable_booked,
enable_full_when_booked=True,
bypass_delays=payload.get('bypass_delays'),
with_status=with_status,
)

View File

@ -1702,3 +1702,42 @@ def test_datetimes_multiple_agendas_overlapping_events(app):
params={'subscribed': 'all', 'user_external_id': 'xxx', 'check_overlaps': True},
)
assert len(resp.json['data']) == 0
@pytest.mark.freeze_time('2021-05-06 14:00')
def test_datetimes_multiple_agendas_enable_full_when_booked(app):
agenda = Agenda.objects.create(
label='First agenda', kind='events', minimal_booking_delay=0, maximal_booking_delay=45
)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(
slug='recurring',
start_datetime=now() + datetime.timedelta(hours=1),
recurrence_days=[localtime().weekday()],
recurrence_end_date=now() + datetime.timedelta(days=15),
places=2,
agenda=agenda,
)
event.create_all_recurrences()
resp = app.get('/api/agendas/datetimes/', params={'agendas': agenda.slug, 'user_external_id': 'our_user'})
assert [(d['id'], d['disabled']) for d in resp.json['data']] == [
('first-agenda@recurring--2021-05-06-1700', False),
('first-agenda@recurring--2021-05-13-1700', False),
('first-agenda@recurring--2021-05-20-1700', False),
]
first_event = Event.objects.get(slug='recurring--2021-05-06-1700')
Booking.objects.create(event=first_event, user_external_id='our_user')
Booking.objects.create(event=first_event, user_external_id='other_user')
second_event = Event.objects.get(slug='recurring--2021-05-13-1700')
Booking.objects.create(event=second_event, user_external_id='other_user')
Booking.objects.create(event=second_event, user_external_id='other_user_2')
resp = app.get('/api/agendas/datetimes/', params={'agendas': agenda.slug, 'user_external_id': 'our_user'})
assert [(d['id'], d['disabled']) for d in resp.json['data']] == [
('first-agenda@recurring--2021-05-06-1700', False), # full event with user booking, not disabled
('first-agenda@recurring--2021-05-13-1700', True), # full event without user booking, disabled
('first-agenda@recurring--2021-05-20-1700', False),
]