From f6e879db55465e6d5f17f054ed2757cbfcfc43bc Mon Sep 17 00:00:00 2001
From: yatinkarel <ykarel@redhat.com>
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
---
 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")