Skip to content

Commit 39cf9d7

Browse files
committed
Skip datetime parse if string too short
1 parent b815973 commit 39cf9d7

File tree

2 files changed

+10
-8
lines changed

2 files changed

+10
-8
lines changed

tests/test_filtering.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,7 @@ async def test_filter_not_with_or(self):
167167

168168
@test.requireCapability(dialect__in=["postgres", "mysql"])
169169
async def test_filter_exact(self):
170-
is_mysql = test._TORTOISE_TEST_DB.startswith("mysql")
171-
await DatetimeFields.create(
170+
obj = await DatetimeFields.create(
172171
datetime=datetime.datetime(
173172
year=2020, month=5, day=20, hour=0, minute=0, second=0, microsecond=0
174173
)
@@ -177,11 +176,15 @@ async def test_filter_exact(self):
177176
self.assertEqual(await DatetimeFields.filter(datetime__quarter=2).count(), 1)
178177
self.assertEqual(await DatetimeFields.filter(datetime__month=5).count(), 1)
179178
self.assertEqual(await DatetimeFields.filter(datetime__day=20).count(), 1)
180-
if is_mysql:
179+
if test._TORTOISE_TEST_DB.startswith("mysql"):
181180
self.assertEqual(await DatetimeFields.filter(datetime__week=20).count(), 1)
182181
self.assertEqual(await DatetimeFields.filter(datetime__hour=0).count(), 1)
183182
else:
184-
self.assertEqual(await DatetimeFields.filter(datetime__week=21).count(), 1)
183+
# PostgreSQL enables tzinfo by default
184+
dt = obj.datetime.astimezone()
185+
week = dt.isocalendar()[1]
186+
self.assertEqual(await DatetimeFields.filter(datetime__week=week).count(), 1)
187+
self.assertEqual(await DatetimeFields.filter(datetime__hour=dt.hour).count(), 1)
185188
self.assertEqual(await DatetimeFields.filter(datetime__minute=0).count(), 1)
186189
self.assertEqual(await DatetimeFields.filter(datetime__second=0).count(), 1)
187190
self.assertEqual(await DatetimeFields.filter(datetime__microsecond=0).count(), 1)
@@ -193,9 +196,8 @@ async def test_filter_exact(self):
193196
self.assertEqual(await DateFields.filter(date__day=21).count(), 1)
194197
self.assertEqual(await DateFields.filter(date__year="2021").count(), 1)
195198
self.assertEqual(await DateFields.filter(date__year=2021.0).count(), 1)
196-
if is_mysql:
197-
self.assertEqual(await DateFields.filter(date="2021-6-21").count(), 1)
198199
self.assertEqual(await DateFields.filter(date="20210621").count(), 1)
200+
self.assertEqual(await DateFields.filter(date="2021-06-21").count(), 1)
199201
self.assertEqual(
200202
await DateFields.filter(date=datetime.date(year=2021, month=6, day=21)).count(), 1
201203
)

tortoise/fields/data.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,9 +417,9 @@ def to_python_value(self, value: Any) -> datetime.date | None:
417417
def to_db_value(
418418
self, value: DateFieldQueryValueType | None, instance: type[Model] | Model
419419
) -> DateFieldQueryValueType | None:
420-
if value is not None and isinstance(value, str):
420+
if value is not None and isinstance(value, str) and len(value) > 4:
421421
with contextlib.suppress(ValueError):
422-
value = parse_datetime(value).date() # type:ignore[assignment]
422+
value = parse_datetime(value).date()
423423
self.validate(value)
424424
return value
425425

0 commit comments

Comments
 (0)