api: fix date parsing (#52172)

This commit is contained in:
Lauréline Guérin 2021-03-18 15:30:51 +01:00 committed by Valentin Deniaud
parent 7c36ee5bc9
commit bbd93a1bec
2 changed files with 38 additions and 32 deletions

View File

@ -586,7 +586,7 @@ class Datetimes(APIView):
date_start = make_aware(
datetime.datetime.combine(parse_date(date_start), datetime.time(0, 0))
)
except TypeError:
except (TypeError, ValueError):
raise APIError(
_('date_start format must be YYYY-MM-DD'),
err_class='date_start format must be YYYY-MM-DD',
@ -595,7 +595,7 @@ class Datetimes(APIView):
if date_end:
try:
date_end = make_aware(datetime.datetime.combine(parse_date(date_end), datetime.time(0, 0)))
except TypeError:
except (TypeError, ValueError):
raise APIError(
_('date_end format must be YYYY-MM-DD'),
err_class='date_end format must be YYYY-MM-DD',
@ -647,7 +647,7 @@ class MeetingDatetimes(APIView):
start_datetime = make_aware(
datetime.datetime.combine(parse_date(request.GET['date_start']), datetime.time(0, 0))
)
except TypeError:
except (TypeError, ValueError):
raise APIError(
_('date_start format must be YYYY-MM-DD'),
err_class='date_start format must be YYYY-MM-DD',
@ -660,7 +660,7 @@ class MeetingDatetimes(APIView):
end_datetime = make_aware(
datetime.datetime.combine(parse_date(request.GET['date_end']), datetime.time(0, 0))
)
except TypeError:
except (TypeError, ValueError):
raise APIError(
_('date_end format must be YYYY-MM-DD'),
err_class='date_end format must be YYYY-MM-DD',

View File

@ -2290,10 +2290,11 @@ def test_bookings_api_filter_date_start(app, user):
booking = Booking.objects.create(event=event, user_external_id='42')
app.authorization = ('Basic', ('john.doe', 'password'))
resp = app.get('/api/bookings/', params={'user_external_id': '42', 'date_start': 'foo'}, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == "invalid payload"
assert resp.json['err_desc'] == "invalid payload"
for value in ['foo', '2017-05-42']:
resp = app.get('/api/bookings/', params={'user_external_id': '42', 'date_start': value}, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == "invalid payload"
assert resp.json['err_desc'] == "invalid payload"
resp = app.get('/api/bookings/', params={'user_external_id': '42', 'date_start': '2017-05-21'})
assert resp.json['err'] == 0
@ -2326,10 +2327,11 @@ def test_bookings_api_filter_date_end(app, user):
booking = Booking.objects.create(event=event, user_external_id='42')
app.authorization = ('Basic', ('john.doe', 'password'))
resp = app.get('/api/bookings/', params={'user_external_id': '42', 'date_end': 'foo'}, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == "invalid payload"
assert resp.json['err_desc'] == "invalid payload"
for value in ['foo', '2017-05-42']:
resp = app.get('/api/bookings/', params={'user_external_id': '42', 'date_end': value}, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == "invalid payload"
assert resp.json['err_desc'] == "invalid payload"
resp = app.get('/api/bookings/', params={'user_external_id': '42', 'date_end': '2017-05-21'})
assert resp.json['err'] == 0
@ -3688,17 +3690,19 @@ def test_agenda_api_date_range(app, some_data):
event_dt = datetime.datetime.combine(day, datetime.datetime.strptime(event, '%H:%M').time())
Event.objects.create(agenda=agenda2, start_datetime=make_aware(event_dt), places=2)
params = {'date_start': 'foo'}
resp = app.get('/api/agenda/%s/datetimes/' % agenda2.slug, params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == 'date_start format must be YYYY-MM-DD'
assert resp.json['err_desc'] == 'date_start format must be YYYY-MM-DD'
for value in ['foo', '2017-05-42']:
params = {'date_start': value}
resp = app.get('/api/agenda/%s/datetimes/' % agenda2.slug, params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == 'date_start format must be YYYY-MM-DD'
assert resp.json['err_desc'] == 'date_start format must be YYYY-MM-DD'
params = {'date_end': 'foo'}
resp = app.get('/api/agenda/%s/datetimes/' % agenda2.slug, params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == 'date_end format must be YYYY-MM-DD'
assert resp.json['err_desc'] == 'date_end format must be YYYY-MM-DD'
for value in ['foo', '2017-05-42']:
params = {'date_end': value}
resp = app.get('/api/agenda/%s/datetimes/' % agenda2.slug, params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == 'date_end format must be YYYY-MM-DD'
assert resp.json['err_desc'] == 'date_end format must be YYYY-MM-DD'
params = {'date_start': base_date.isoformat()}
resp = app.get('/api/agenda/%s/datetimes/' % agenda2.slug, params=params)
@ -5640,17 +5644,19 @@ def test_meetings_and_virtual_datetimes_date_filter(app):
resp = app.get(virtual_api_url)
assert len(resp.json['data']) == 24
params = {'date_start': 'foo'}
resp = app.get(foo_api_url, params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == 'date_start format must be YYYY-MM-DD'
assert resp.json['err_desc'] == 'date_start format must be YYYY-MM-DD'
for value in ['foo', '2017-05-42']:
params = {'date_start': value}
resp = app.get(foo_api_url, params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == 'date_start format must be YYYY-MM-DD'
assert resp.json['err_desc'] == 'date_start format must be YYYY-MM-DD'
params = {'date_end': 'foo'}
resp = app.get(foo_api_url, params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == 'date_end format must be YYYY-MM-DD'
assert resp.json['err_desc'] == 'date_end format must be YYYY-MM-DD'
for value in ['foo', '2017-05-42']:
params = {'date_end': value}
resp = app.get(foo_api_url, params=params, status=400)
assert resp.json['err'] == 1
assert resp.json['err_class'] == 'date_end format must be YYYY-MM-DD'
assert resp.json['err_desc'] == 'date_end format must be YYYY-MM-DD'
# exclude weekday1 through date_start, 4 slots each day * 5 days
params = {'date_start': (localtime(now()) + datetime.timedelta(days=2)).date().isoformat()}