From b7c9063a9bff428bbfd13ebd2d94040254f3d3ab Mon Sep 17 00:00:00 2001 From: yatinkarel Date: Tue, 13 Aug 2024 11:35:05 +0530 Subject: [PATCH] [jsonutils] Add handling of datetime.date format Recent patch from keystone[1] do not work when osprofiler is enabled as osprofiler does jsonutils.dumps and datetime.date is not handled so it fails. This patch adds the handling for it. [1] https://review.opendev.org/c/openstack/keystone/+/924892 Needed-By: https://review.opendev.org/q/I1b71fb3881dc041db01083fbb4f2592400096a31 Related-Bug: #2074018 Closes-Bug: #2076430 Change-Id: Ifbcf5a1b3d42516bdf73f7ca6b2a7338f3985283 (cherry picked from commit f6e879db55465e6d5f17f054ed2757cbfcfc43bc) --- oslo_serialization/jsonutils.py | 8 ++++++++ oslo_serialization/tests/test_jsonutils.py | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/oslo_serialization/jsonutils.py b/oslo_serialization/jsonutils.py index 69d746c..89b6862 100644 --- a/oslo_serialization/jsonutils.py +++ b/oslo_serialization/jsonutils.py @@ -43,6 +43,8 @@ from oslo_utils import encodeutils from oslo_utils import importutils from oslo_utils import timeutils +_ISO8601_DATE_FORMAT = '%Y-%m-%d' + ipaddress = importutils.try_import("ipaddress") netaddr = importutils.try_import("netaddr") @@ -117,6 +119,12 @@ def to_primitive(value, convert_instances=False, convert_datetime=True, else: return value + if isinstance(value, datetime.date): + if convert_datetime: + return value.strftime(_ISO8601_DATE_FORMAT) + else: + return value + if isinstance(value, uuid.UUID): return str(value) diff --git a/oslo_serialization/tests/test_jsonutils.py b/oslo_serialization/tests/test_jsonutils.py index 74289b9..d68b22c 100644 --- a/oslo_serialization/tests/test_jsonutils.py +++ b/oslo_serialization/tests/test_jsonutils.py @@ -159,6 +159,15 @@ class ToPrimitiveTestCase(test_base.BaseTestCase): x = datetime.datetime(1920, 2, 3, 4, 5, 6, 7) self.assertEqual(x, jsonutils.to_primitive(x, convert_datetime=False)) + def test_date(self): + x = datetime.date(1920, 2, 3) + self.assertEqual('1920-02-03', + jsonutils.to_primitive(x)) + + def test_date_preserve(self): + x = datetime.date(1920, 2, 3) + self.assertEqual(x, jsonutils.to_primitive(x, convert_datetime=False)) + def test_DateTime(self): x = xmlrpclib.DateTime() x.decode("19710203T04:05:06")