From 11721b954b776cf1150c777573b18a7af382a24e Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Fri, 13 Sep 2024 12:18:25 +0100 Subject: [PATCH] Fixed deserialization of datetime.date fields Fixes #1913 --- elasticsearch_dsl/field.py | 3 +++ tests/test_field.py | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/elasticsearch_dsl/field.py b/elasticsearch_dsl/field.py index 26f2336b..dbfb0e89 100644 --- a/elasticsearch_dsl/field.py +++ b/elasticsearch_dsl/field.py @@ -315,6 +315,9 @@ def _deserialize(self, data: Any) -> Union[datetime, date]: raise ValidationException( f"Could not parse date from the value ({data!r})", e ) + # we treat the yyyy-MM-dd format as a special case + if hasattr(self, "format") and self.format == 'yyyy-MM-dd': + data = data.date() if isinstance(data, datetime): if self._default_timezone and data.tzinfo is None: diff --git a/tests/test_field.py b/tests/test_field.py index ee4ed196..a5adccca 100644 --- a/tests/test_field.py +++ b/tests/test_field.py @@ -17,7 +17,7 @@ import base64 import ipaddress -from datetime import datetime +from datetime import datetime, date from typing import cast import pytest @@ -48,6 +48,21 @@ def test_boolean_deserialization() -> None: assert bf.deserialize(1) +def test_datetime_deserialization() -> None: + f = field.Date() + d = datetime.now() + assert d == f._deserialize(d.isoformat()) + + +def test_date_deserialization() -> None: + f = field.Date(format='yyyy-MM-dd') + d = date.today() + assert d == f._deserialize(d.isoformat()) + + d = datetime.now() + assert d.date() == f._deserialize(d.isoformat()) + + def test_date_field_can_have_default_tz() -> None: f = field.Date(default_timezone="UTC") now = datetime.now()