[MIG] session_redis: Migration to 18.0

This commit is contained in:
Maksym Yankin
2025-02-03 10:20:18 +02:00
parent da9918aee0
commit 1dd8c393ef
5 changed files with 113 additions and 99 deletions
+13 -12
View File
@@ -3,8 +3,9 @@
import json
from datetime import date, datetime
from typing import Any
import dateutil
import dateutil.parser
class SessionEncoder(json.JSONEncoder):
@@ -13,30 +14,30 @@ class SessionEncoder(json.JSONEncoder):
So that we can later recompose them if they were stored in the session
"""
def default(self, obj):
def default(self, obj: Any) -> Any:
if isinstance(obj, datetime):
return {"_type": "datetime_isoformat", "value": obj.isoformat()}
elif isinstance(obj, date):
if isinstance(obj, date):
return {"_type": "date_isoformat", "value": obj.isoformat()}
elif isinstance(obj, set):
return {"_type": "set", "value": tuple(obj)}
return json.JSONEncoder.default(self, obj)
if isinstance(obj, set):
return {"_type": "set", "value": tuple(sorted(obj))}
return super().default(obj)
class SessionDecoder(json.JSONDecoder):
"""Decode json, recomposing recordsets and date/datetime"""
def __init__(self, *args, **kwargs):
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, object_hook=self.object_hook, **kwargs)
def object_hook(self, obj):
def object_hook(self, obj: dict[str, Any]) -> Any:
"""Convert serialized data back into its original Python type."""
if "_type" not in obj:
return obj
type_ = obj["_type"]
if type_ == "datetime_isoformat":
if obj["_type"] == "datetime_isoformat":
return dateutil.parser.parse(obj["value"])
elif type_ == "date_isoformat":
if obj["_type"] == "date_isoformat":
return dateutil.parser.parse(obj["value"]).date()
elif type_ == "set":
if obj["_type"] == "set":
return set(obj["value"])
return obj