improve date handling

This commit is contained in:
collerek
2021-07-06 15:11:26 +02:00
parent 69fffdd2e2
commit cb4e5ea955
9 changed files with 206 additions and 27 deletions

View File

@ -76,7 +76,7 @@ class UndefinedType: # pragma no cover
Undefined = UndefinedType()
__version__ = "0.10.13"
__version__ = "0.10.14"
__all__ = [
"Integer",
"BigInteger",

View File

@ -351,6 +351,19 @@ class DateTime(ModelFieldFactory, datetime.datetime):
_type = datetime.datetime
_sample = "datetime"
def __new__( # type: ignore # noqa CFQ002
cls, *, timezone: bool = False, **kwargs: Any
) -> BaseField: # type: ignore
kwargs = {
**kwargs,
**{
k: v
for k, v in locals().items()
if k not in ["cls", "__class__", "kwargs"]
},
}
return super().__new__(cls, **kwargs)
@classmethod
def get_column_type(cls, **kwargs: Any) -> Any:
"""
@ -362,7 +375,7 @@ class DateTime(ModelFieldFactory, datetime.datetime):
:return: initialized column with proper options
:rtype: sqlalchemy Column
"""
return sqlalchemy.DateTime()
return sqlalchemy.DateTime(timezone=kwargs.get("timezone", False))
class Date(ModelFieldFactory, datetime.date):
@ -395,6 +408,19 @@ class Time(ModelFieldFactory, datetime.time):
_type = datetime.time
_sample = "time"
def __new__( # type: ignore # noqa CFQ002
cls, *, timezone: bool = False, **kwargs: Any
) -> BaseField: # type: ignore
kwargs = {
**kwargs,
**{
k: v
for k, v in locals().items()
if k not in ["cls", "__class__", "kwargs"]
},
}
return super().__new__(cls, **kwargs)
@classmethod
def get_column_type(cls, **kwargs: Any) -> Any:
"""
@ -406,7 +432,7 @@ class Time(ModelFieldFactory, datetime.time):
:return: initialized column with proper options
:rtype: sqlalchemy Column
"""
return sqlalchemy.Time()
return sqlalchemy.Time(timezone=kwargs.get("timezone", False))
class JSON(ModelFieldFactory, pydantic.Json):

View File

@ -1,3 +1,4 @@
import datetime
from typing import Any, Dict, TYPE_CHECKING, Type
import sqlalchemy
@ -138,6 +139,19 @@ class FilterAction(QueryAction):
if isinstance(self.filter_value, ormar.Model):
self.filter_value = self.filter_value.pk
if isinstance(
self.filter_value, (datetime.date, datetime.time, datetime.datetime)
):
self.filter_value = self.filter_value.isoformat()
if isinstance(self.filter_value, (list, tuple, set)):
self.filter_value = [
x.isoformat()
if isinstance(x, (datetime.date, datetime.time, datetime.datetime))
else x
for x in self.filter_value
]
op_attr = FILTER_OPERATORS[self.operator]
if self.operator == "isnull":
op_attr = "is_" if self.filter_value else "isnot"