From a81e72e15ad49825d47b7c5e882bf12d0e4cbb18 Mon Sep 17 00:00:00 2001 From: nstoik Date: Sat, 3 Mar 2018 20:23:02 -0700 Subject: [PATCH 1/3] additional date string format from fullcalendar Fix for different date string format in fullcalendar ajax request. Try use one additional string before failing. --- schedule/views.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/schedule/views.py b/schedule/views.py index 2676f643..58248aa0 100644 --- a/schedule/views.py +++ b/schedule/views.py @@ -319,7 +319,12 @@ def _api_occurrences(start, end, calendar_slug, timezone): def convert(ddatetime): if ddatetime: ddatetime = ddatetime.split(' ')[0] - return datetime.datetime.strptime(ddatetime, '%Y-%m-%d') + try: + return datetime.datetime.strptime(ddatetime, '%Y-%m-%d') + except ValueError: + # try a different date string format first before failing + return datetime.datetime.strptime(ddatetime, '%Y-%m-%dT%H:%M:%S') + else: def convert(ddatetime): return datetime.datetime.utcfromtimestamp(float(ddatetime)) From d01d12997fac3b9f60cff5d6abe950c91e2a9300 Mon Sep 17 00:00:00 2001 From: nstoik Date: Mon, 12 Mar 2018 15:38:00 -0600 Subject: [PATCH 2/3] add a test to cover the new string format --- tests/test_views.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/test_views.py b/tests/test_views.py index d94ee8ca..8937115a 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -318,6 +318,35 @@ def test_cal_slug_filters_returned_events(self): self.assertIn(event1.title, [d['title'] for d in resp_list]) self.assertNotIn(event2.title, [d['title'] for d in resp_list]) + def test_occurrences_api_works_with_different_date_string_formats(self): + # create a calendar and event + calendar = Calendar.objects.create(name="MyCal", slug='MyCalSlug') + event = Event.objects.create( + title='Recent Event', + start=datetime.datetime(2008, 1, 5, 8, 0, tzinfo=pytz.utc), + end=datetime.datetime(2008, 1, 5, 9, 0, tzinfo=pytz.utc), + end_recurring_period=datetime.datetime(2008, 5, 5, 0, 0, tzinfo=pytz.utc), + calendar=calendar, + ) + # test works with date string time format '%Y-%m-%d' + response = self.client.get(reverse('api_occurrences'), + {'start': '2008-01-05', + 'end': '2008-02-05', + 'calendar_slug': event.calendar.slug + }) + self.assertEqual(response.status_code, 200) + resp_list = json.loads(response.content.decode('utf-8')) + self.assertIn(event.title, [d['title'] for d in resp_list]) + # test works with date string time format '%Y-%m-%dT%H:%M:%S' + response = self.client.get(reverse("api_occurrences"), + {'start': '2008-01-05T00:00:00', + 'end': '2008-02-05T00:00:00', + 'calendar_slug': event.calendar.slug + }) + self.assertEqual(response.status_code, 200) + resp_list = json.loads(response.content.decode('utf-8')) + self.assertIn(event.title, [d['title'] for d in resp_list]) + def test_check_next_url_valid_case(self): expected = '/calendar/1' res = check_next_url('/calendar/1') From ffc01b2ec17fe3d0fe06ad62eb8dff33e4d93fc2 Mon Sep 17 00:00:00 2001 From: nstoik Date: Wed, 23 May 2018 19:02:14 -0600 Subject: [PATCH 3/3] add test with incorrect date string format --- tests/test_views.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test_views.py b/tests/test_views.py index 8937115a..b696bf85 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -347,6 +347,28 @@ def test_occurrences_api_works_with_different_date_string_formats(self): resp_list = json.loads(response.content.decode('utf-8')) self.assertIn(event.title, [d['title'] for d in resp_list]) + def test_occurrences_api_fails_with_incorrect_date_string_formats(self): + # create a calendar and event + calendar = Calendar.objects.create(name="MyCal", slug='MyCalSlug') + event = Event.objects.create( + title='Recent Event', + start=datetime.datetime(2008, 1, 5, 8, 0, tzinfo=pytz.utc), + end=datetime.datetime(2008, 1, 5, 9, 0, tzinfo=pytz.utc), + end_recurring_period=datetime.datetime(2008, 5, 5, 0, 0, tzinfo=pytz.utc), + calendar=calendar, + ) + + # test fails with date string time format not '%Y-%m-%d' or '%Y-%m-%dT%H:%M:%S' + response = self.client.get(reverse("api_occurrences"), + {'start': '2008-01-05T00:00', + 'end': '2008-02-05T00:00', + 'calendar_slug': event.calendar.slug + }) + self.assertEqual(response.status_code, 400) + resp = response.content.decode('utf-8') + expected_error = "does not match format '%Y-%m-%dT%H:%M:%S'" + self.assertIn(expected_error, resp) + def test_check_next_url_valid_case(self): expected = '/calendar/1' res = check_next_url('/calendar/1')