api: hide disabled slots if requested (#51160)

This commit is contained in:
Lauréline Guérin 2021-03-15 14:53:07 +01:00
parent 07f2af930b
commit bf10ddf860
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 60 additions and 1 deletions

View File

@ -628,6 +628,9 @@ class Datetimes(APIView):
excluded_user_external_id=user_external_id,
)
if request.GET.get('hide_disabled'):
entries = [e for e in entries if not is_event_disabled(e, min_places)]
response = {
'data': [get_event_detail(request, x, agenda=agenda, min_places=min_places) for x in entries],
'meta': get_events_meta_detail(request, entries, agenda=agenda, min_places=min_places),
@ -711,6 +714,9 @@ class MeetingDatetimes(APIView):
first_bookable_slot = None
data = []
for slot in generator_of_unique_slots:
if request.GET.get('hide_disabled') and slot.full:
continue
# Make virtual id for a slot, combining meeting_type.id and
# iso-format of date and time.
# (SharedTimePeriod.get_time_slots() generate datetime in fixed local timezone,

View File

@ -585,6 +585,26 @@ def test_datetimes_api_exclude_slots(app):
assert resp.json['data'][0]['disabled'] is True
def test_datetimes_api_hide_disabled(app):
agenda = Agenda.objects.create(
label='Foo bar', kind='events', minimal_booking_delay=0, maximal_booking_delay=7
)
event = Event.objects.create(
slug='event-slug',
start_datetime=now() + datetime.timedelta(days=3),
places=1,
agenda=agenda,
)
Booking.objects.create(event=event)
resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug)
assert resp.json['data'][0]['id'] == 'event-slug'
assert resp.json['data'][0]['disabled'] is True
resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug, params={'hide_disabled': True})
assert resp.json['data'] == []
def test_datetimes_api_meetings_agenda(app, meetings_agenda):
meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (meeting_type.agenda.slug, meeting_type.slug)
@ -969,7 +989,6 @@ def test_datetimes_api_meetings_agenda_short_time_periods(app, meetings_agenda,
default_desk, _ = Desk.objects.get_or_create(agenda=meetings_agenda, slug='desk-1')
meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (meeting_type.agenda.slug, meeting_type.slug)
# test with short time periods
TimePeriod.objects.filter(desk=default_desk).delete()
@ -1068,6 +1087,40 @@ def test_datetimes_api_meetings_agenda_exclude_slots(app):
assert resp.json['meta']['first_bookable_slot']['id'] == 'foo-bar:2021-02-26-0930'
@pytest.mark.freeze_time('2021-03-15')
def test_datetimes_api_meetings_agenda_hide_disabled(app):
agenda = Agenda.objects.create(
label='Agenda', kind='meetings', minimal_booking_delay=0, maximal_booking_delay=10
)
desk = Desk.objects.create(agenda=agenda, slug='desk')
meeting_type = MeetingType.objects.create(agenda=agenda, slug='foo-bar', duration=60)
start_date = now() + datetime.timedelta(days=3)
TimePeriod.objects.create(
weekday=start_date.weekday(),
start_time=datetime.time(9, 0),
end_time=datetime.time(10, 00),
desk=desk,
)
event = Event.objects.create(
agenda=agenda,
meeting_type=meeting_type,
places=1,
start_datetime=localtime(start_date).replace(hour=9, minute=0),
desk=desk,
)
Booking.objects.create(event=event)
resp = app.get('/api/agenda/%s/meetings/%s/datetimes/' % (agenda.slug, meeting_type.slug))
assert resp.json['data'][0]['id'] == 'foo-bar:2021-03-18-0900'
assert resp.json['data'][0]['disabled'] is True
resp = app.get(
'/api/agenda/%s/meetings/%s/datetimes/' % (agenda.slug, meeting_type.slug),
params={'hide_disabled': True},
)
assert resp.json['data'] == []
def test_booking_api(app, some_data, user):
agenda = Agenda.objects.filter(label=u'Foo bar')[0]
event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]