api: disable event only if excluded_user_external_id is specified (#55369)

This commit is contained in:
Valentin Deniaud 2021-08-04 10:32:41 +02:00
parent 67f1f68fd6
commit f6de72a5a9
2 changed files with 21 additions and 5 deletions

View File

@ -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
],

View File

@ -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(