2024-12-06 18:08:09 +00:00
|
|
|
from datetime import datetime, timezone
|
|
|
|
from typing import Optional
|
2024-12-06 18:02:59 +00:00
|
|
|
|
2024-12-06 18:08:09 +00:00
|
|
|
from sqlalchemy.engine import Dialect
|
|
|
|
from sqlalchemy.types import TypeDecorator, DateTime
|
2024-12-06 18:02:59 +00:00
|
|
|
|
|
|
|
|
2024-12-06 18:08:09 +00:00
|
|
|
class AwareDateTime(TypeDecorator[datetime]):
|
2024-12-06 18:02:59 +00:00
|
|
|
impl = DateTime(timezone=True)
|
|
|
|
cache_ok = True
|
|
|
|
|
2024-12-06 18:08:09 +00:00
|
|
|
def process_bind_param(
|
|
|
|
self, value: Optional[datetime], dialect: Dialect
|
|
|
|
) -> Optional[datetime]:
|
2024-12-06 18:02:59 +00:00
|
|
|
if value is not None and value.tzinfo is None:
|
|
|
|
value = value.replace(tzinfo=timezone.utc)
|
|
|
|
return value
|
|
|
|
|
2024-12-06 18:08:09 +00:00
|
|
|
def process_result_value(
|
|
|
|
self, value: Optional[datetime], dialect: Dialect
|
|
|
|
) -> Optional[datetime]:
|
2024-12-06 18:02:59 +00:00
|
|
|
if value is not None and value.tzinfo is None:
|
|
|
|
value = value.replace(tzinfo=timezone.utc)
|
|
|
|
return value
|