From f6de72a5a9da8e9a559962da7494db87bd2ef536 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Wed, 4 Aug 2021 10:32:41 +0200 Subject: [PATCH] api: disable event only if excluded_user_external_id is specified (#55369) --- chrono/api/views.py | 17 +++++++++++++---- tests/api/test_datetimes.py | 9 ++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/chrono/api/views.py b/chrono/api/views.py index 87564fe7..541fdb83 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -415,8 +415,8 @@ def get_event_places(event): return places -def is_event_disabled(event, min_places=1): - if getattr(event, 'user_places_count', 0) > 0: +def is_event_disabled(event, min_places=1, disable_booked=True): + if disable_booked and getattr(event, 'user_places_count', 0) > 0: return True if event.start_datetime < now(): # event is past => not disabled (always ok to book a past event) @@ -456,6 +456,7 @@ def get_event_detail( booked_user_external_id=None, show_events=None, multiple_agendas=False, + disable_booked=True, ): agenda = agenda or event.agenda details = { @@ -468,7 +469,7 @@ def get_event_detail( 'description': event.description, 'pricing': event.pricing, 'url': event.url, - 'disabled': is_event_disabled(event, min_places=min_places), + 'disabled': is_event_disabled(event, min_places=min_places, disable_booked=disable_booked), 'api': { 'bookings_url': request.build_absolute_uri( reverse( @@ -745,6 +746,7 @@ class Datetimes(APIView): payload = serializer.validated_data user_external_id = payload.get('user_external_id') or payload.get('exclude_user_external_id') + disable_booked = bool(payload.get('exclude_user_external_id')) show_events_raw = payload.get('events') show_events = show_events_raw or 'future' show_past = show_events in ['all', 'past'] @@ -767,7 +769,11 @@ class Datetimes(APIView): ) if payload['hide_disabled']: - entries = [e for e in entries if not is_event_disabled(e, payload['min_places'])] + entries = [ + e + for e in entries + if not is_event_disabled(e, payload['min_places'], disable_booked=disable_booked) + ] response = { 'data': [ @@ -778,6 +784,7 @@ class Datetimes(APIView): min_places=payload['min_places'], booked_user_external_id=payload.get('user_external_id'), show_events=show_events_raw, + disable_booked=disable_booked, ) for x in entries ], @@ -817,6 +824,7 @@ class MultipleAgendasDatetimes(APIView): agendas = get_objects_from_slugs(agenda_slugs, qs=Agenda.objects.filter(kind='events')) user_external_id = payload.get('user_external_id') or payload.get('exclude_user_external_id') + disable_booked = bool(payload.get('exclude_user_external_id')) agendas = Agenda.prefetch_events_and_exceptions( agendas, annotate_events=True, user_external_id=user_external_id ) @@ -842,6 +850,7 @@ class MultipleAgendasDatetimes(APIView): min_places=payload['min_places'], booked_user_external_id=payload.get('user_external_id'), multiple_agendas=True, + disable_booked=disable_booked, ) for x in entries ], diff --git a/tests/api/test_datetimes.py b/tests/api/test_datetimes.py index 8212b34c..2b89533d 100644 --- a/tests/api/test_datetimes.py +++ b/tests/api/test_datetimes.py @@ -271,6 +271,13 @@ def test_datetimes_api_user_external_id(app): resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug, params={'user_external_id': '42'}) assert resp.json['data'][0]['booked_for_external_user'] == 'main-list' + assert resp.json['data'][0]['disabled'] == False + + resp = app.get( + '/api/agenda/%s/datetimes/' % agenda.slug, + params={'user_external_id': '42', 'exclude_user_external_id': '42'}, + ) + assert resp.json['data'][0]['disabled'] == True booking.in_waiting_list = True booking.save() @@ -1399,7 +1406,7 @@ def test_datetimes_multiple_agendas(app): assert resp.json['data'][1]['places']['available'] == 3 assert resp.json['data'][1]['booked_for_external_user'] == 'main-list' - assert resp.json['data'][1]['disabled'] is True + assert resp.json['data'][1]['disabled'] is False # check exclude_user_external_id resp = app.get( -- 2.20.1