From c3373ae37987c9524a17bd1006a999874e550052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 16 May 2019 12:56:22 +0200 Subject: [PATCH] api: format dates in fillslot response (#33151) --- chrono/api/views.py | 12 ++++++++---- tests/test_api.py | 46 ++++++++++++++++++++++----------------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/chrono/api/views.py b/chrono/api/views.py index 6a7ac53e..74af5617 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -33,6 +33,10 @@ from ..agendas.models import (Agenda, Event, Booking, MeetingType, from ..interval import Intervals +def format_response_datetime(dt): + return localtime(dt).strftime('%Y-%m-%d %H:%M:%S') + + def get_exceptions_by_desk(agenda): exceptions_by_desk = {} for desk in Desk.objects.filter(agenda=agenda).prefetch_related('timeperiodexception_set'): @@ -181,7 +185,7 @@ class Datetimes(APIView): response = {'data': [{'id': x.id, 'text': force_text(x), - 'datetime': localtime(x.start_datetime).strftime('%Y-%m-%d %H:%M:%S'), + 'datetime': format_response_datetime(x.start_datetime), 'disabled': bool(x.full), 'api': { 'fillslot_url': request.build_absolute_uri( @@ -243,7 +247,7 @@ class MeetingDatetimes(APIView): })) response = {'data': [{'id': x.id, - 'datetime': localtime(x.start_datetime).strftime('%Y-%m-%d %H:%M:%S'), + 'datetime': format_response_datetime(x.start_datetime), 'text': force_text(x), 'disabled': bool(x.full), 'api': { @@ -464,7 +468,7 @@ class Fillslots(APIView): 'err': 0, 'in_waiting_list': in_waiting_list, 'booking_id': primary_booking.id, - 'datetime': localtime(events[0].start_datetime), + 'datetime': format_response_datetime(events[0].start_datetime), 'api': { 'cancel_url': request.build_absolute_uri( reverse('api-cancel-booking', kwargs={'booking_pk': primary_booking.id})), @@ -476,7 +480,7 @@ class Fillslots(APIView): response['api']['accept_url'] = request.build_absolute_uri( reverse('api-accept-booking', kwargs={'booking_pk': primary_booking.id})) if agenda.kind == 'meetings': - response['end_datetime'] = localtime(events[-1].end_datetime) + response['end_datetime'] = format_response_datetime(events[-1].end_datetime) response['duration'] = (events[-1].end_datetime - events[-1].start_datetime).seconds // 60 if available_desk: response['desk'] = { diff --git a/tests/test_api.py b/tests/test_api.py index eee0c10f..8b78f98d 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -330,7 +330,7 @@ def test_booking_api(app, some_data, user): app.authorization = ('Basic', ('john.doe', 'password')) resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda.slug, event.id)) Booking.objects.get(id=resp.json['booking_id']) - assert resp.json['datetime'] == localtime(event.start_datetime).isoformat() + assert resp.json['datetime'] == localtime(event.start_datetime).strftime('%Y-%m-%d %H:%M:%S') assert 'accept_url' not in resp.json['api'] assert 'cancel_url' in resp.json['api'] assert 'ics_url' in resp.json['api'] @@ -476,7 +476,7 @@ def test_booking_api_fillslots(app, some_data, user): resp = app.post('/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': events_ids}) primary_booking_id = resp.json['booking_id'] Booking.objects.get(id=primary_booking_id) - assert resp.json['datetime'] == localtime(event.start_datetime).isoformat() + assert resp.json['datetime'] == localtime(event.start_datetime).strftime('%Y-%m-%d %H:%M:%S') assert 'accept_url' not in resp.json['api'] assert 'cancel_url' in resp.json['api'] assert urlparse.urlparse(resp.json['api']['cancel_url']).netloc @@ -563,10 +563,10 @@ def test_booking_api_meeting(app, meetings_agenda, user): app.authorization = ('Basic', ('john.doe', 'password')) resp_booking = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id)) assert Booking.objects.count() == 1 - assert resp_booking.json['datetime'][:16] == localtime(Booking.objects.all()[0].event.start_datetime - ).isoformat()[:16] - assert resp_booking.json['end_datetime'][:16] == localtime(Booking.objects.all()[0].event.end_datetime - ).isoformat()[:16] + assert resp_booking.json['datetime'] == localtime(Booking.objects.all()[0].event.start_datetime + ).strftime('%Y-%m-%d %H:%M:%S') + assert resp_booking.json['end_datetime'] == localtime(Booking.objects.all()[0].event.end_datetime + ).strftime('%Y-%m-%d %H:%M:%S') assert resp_booking.json['duration'] == 30 resp2 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id) @@ -594,10 +594,10 @@ def test_booking_api_meeting_fillslots(app, meetings_agenda, user): assert Booking.objects.count() == 2 primary_booking = Booking.objects.filter(primary_booking__isnull=True).first() secondary_booking = Booking.objects.filter(primary_booking=primary_booking.id).first() - assert resp_booking.json['datetime'][:16] == localtime(primary_booking.event.start_datetime - ).isoformat()[:16] - assert resp_booking.json['end_datetime'][:16] == localtime(secondary_booking.event.end_datetime - ).isoformat()[:16] + assert resp_booking.json['datetime'] == localtime(primary_booking.event.start_datetime + ).strftime('%Y-%m-%d %H:%M:%S') + assert resp_booking.json['end_datetime'] == localtime(secondary_booking.event.end_datetime + ).strftime('%Y-%m-%d %H:%M:%S') resp2 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id) assert len(resp.json['data']) == len([x for x in resp2.json['data'] if not x.get('disabled')]) + 2 @@ -651,8 +651,8 @@ def test_booking_api_meeting_across_daylight_saving_time(app, meetings_agenda, u app.authorization = ('Basic', ('john.doe', 'password')) resp_booking = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id)) assert Booking.objects.count() == 1 - assert resp_booking.json['datetime'][:16] == localtime(Booking.objects.all()[0].event.start_datetime - ).isoformat()[:16] + assert resp_booking.json['datetime'] == localtime(Booking.objects.all()[0].event.start_datetime + ).strftime('%Y-%m-%d %H:%M:%S') resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id) assert resp.json['data'][event_index]['disabled'] @@ -948,7 +948,7 @@ def test_multiple_booking_api(app, some_data, user): resp = app.post('/api/agenda/%s/fillslot/%s/?count=3' % (agenda.slug, event.id)) Booking.objects.get(id=resp.json['booking_id']) - assert resp.json['datetime'] == localtime(event.start_datetime).isoformat() + assert resp.json['datetime'] == localtime(event.start_datetime).strftime('%Y-%m-%d %H:%M:%S') assert 'accept_url' not in resp.json['api'] assert 'cancel_url' in resp.json['api'] assert Event.objects.get(id=event.id).booked_places == 3 @@ -1030,7 +1030,7 @@ def test_multiple_booking_api_fillslots(app, some_data, user): booking = Booking.objects.get(id=resp.json['booking_id']) cancel_url = resp.json['api']['cancel_url'] assert Booking.objects.filter(primary_booking=booking).count() == 5 - assert resp.json['datetime'] == localtime(events[0].start_datetime).isoformat() + assert resp.json['datetime'] == localtime(events[0].start_datetime).strftime('%Y-%m-%d %H:%M:%S') assert 'accept_url' not in resp.json['api'] assert 'cancel_url' in resp.json['api'] assert 'ics_url' in resp.json['api'] @@ -1198,8 +1198,8 @@ def test_agenda_meeting_api_multiple_desk(app, meetings_agenda, user): event_id = resp.json['data'][1]['id'] resp_booking = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id)) assert Booking.objects.count() == 2 - assert resp_booking.json['datetime'][:16] == localtime(Booking.objects.last().event.start_datetime - ).isoformat()[:16] + assert resp_booking.json['datetime'] == localtime(Booking.objects.last().event.start_datetime + ).strftime('%Y-%m-%d %H:%M:%S') resp2 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id) assert len(resp.json['data']) == len([x for x in resp2.json['data'] if not x['disabled']]) + 1 @@ -1223,8 +1223,8 @@ def test_agenda_meeting_api_multiple_desk(app, meetings_agenda, user): resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id)) queries_count_fillslot1 = len(ctx.captured_queries) - assert resp_booking.json['datetime'][:16] == localtime(Booking.objects.last().event.start_datetime - ).isoformat()[:16] + assert resp_booking.json['datetime'] == localtime(Booking.objects.last().event.start_datetime + ).strftime('%Y-%m-%d %H:%M:%S') cancel_url = resp.json['api']['cancel_url'] resp3 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id) @@ -1239,8 +1239,8 @@ def test_agenda_meeting_api_multiple_desk(app, meetings_agenda, user): resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id)) assert Booking.objects.count() == 4 assert Booking.objects.exclude(cancellation_datetime__isnull=True).count() == 2 - assert resp_booking.json['datetime'][:16] == localtime(Booking.objects.last().event.start_datetime - ).isoformat()[:16] + assert resp_booking.json['datetime'] == localtime(Booking.objects.last().event.start_datetime + ).strftime('%Y-%m-%d %H:%M:%S') # try booking the same timeslot again and fail resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda_id, event_id)) @@ -1562,20 +1562,20 @@ def test_agenda_meeting_gcd_durations(app, meetings_agenda, user): assert len([x for x in resp.json['data'] if not x.get('disabled')]) == 55 event_id = [x for x in resp.json['data'] if not x.get('disabled')][0]['id'] resp = app.post('/api/agenda/%s/fillslot/%s/' % (meetings_agenda.id, event_id)) - assert resp.json['datetime'].startswith('2017-05-22T10:30:00') + assert resp.json['datetime'] == '2017-05-22 10:30:00' assert Booking.objects.count() == 2 resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type_30.id) event_id = [x for x in resp.json['data'] if not x.get('disabled')][0]['id'] resp = app.post('/api/agenda/%s/fillslot/%s/' % (meetings_agenda.id, event_id)) - assert resp.json['datetime'].startswith('2017-05-22T10:50:00') + assert resp.json['datetime'] == '2017-05-22 10:50:00' assert Booking.objects.count() == 3 # create a gap resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type_30.id) event_id = [x for x in resp.json['data'] if not x.get('disabled')][1]['id'] resp = app.post('/api/agenda/%s/fillslot/%s/' % (meetings_agenda.id, event_id)) - assert resp.json['datetime'].startswith('2017-05-22T11:30:00') + assert resp.json['datetime'] == '2017-05-22 11:30:00' assert Booking.objects.count() == 4 resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type_20.id)