Fixed vars from Firestore read as wrong Type
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
import secrets
|
import secrets
|
||||||
import string
|
import string
|
||||||
|
|
||||||
|
from google.cloud.firestore_v1 import GeoPoint
|
||||||
|
|
||||||
from shared.firebase import get_db
|
from shared.firebase import get_db
|
||||||
from shared.exceptions import NotFoundError
|
from shared.exceptions import NotFoundError
|
||||||
from devices.models import DeviceCreate, DeviceUpdate, DeviceInDB
|
from devices.models import DeviceCreate, DeviceUpdate, DeviceInDB
|
||||||
@@ -36,9 +38,38 @@ def _ensure_unique_serial(db) -> str:
|
|||||||
raise RuntimeError("Could not generate a unique serial number after 100 attempts")
|
raise RuntimeError("Could not generate a unique serial number after 100 attempts")
|
||||||
|
|
||||||
|
|
||||||
|
def _convert_firestore_value(val):
|
||||||
|
"""Convert Firestore-specific types (Timestamp, GeoPoint) to strings."""
|
||||||
|
if hasattr(val, "seconds") and hasattr(val, "nanos"):
|
||||||
|
# Firestore Timestamp → ISO string
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
dt = datetime.fromtimestamp(val.seconds + val.nanos / 1e9, tz=timezone.utc)
|
||||||
|
return dt.strftime("%d %B %Y at %H:%M:%S UTC")
|
||||||
|
if isinstance(val, GeoPoint):
|
||||||
|
return f"{val.latitude}° N, {val.longitude}° E"
|
||||||
|
return val
|
||||||
|
|
||||||
|
|
||||||
|
def _sanitize_dict(d: dict) -> dict:
|
||||||
|
"""Recursively convert Firestore-native types in a dict to plain strings."""
|
||||||
|
result = {}
|
||||||
|
for k, v in d.items():
|
||||||
|
if isinstance(v, dict):
|
||||||
|
result[k] = _sanitize_dict(v)
|
||||||
|
elif isinstance(v, list):
|
||||||
|
result[k] = [
|
||||||
|
_sanitize_dict(item) if isinstance(item, dict)
|
||||||
|
else _convert_firestore_value(item)
|
||||||
|
for item in v
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
result[k] = _convert_firestore_value(v)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def _doc_to_device(doc) -> DeviceInDB:
|
def _doc_to_device(doc) -> DeviceInDB:
|
||||||
"""Convert a Firestore document snapshot to a DeviceInDB model."""
|
"""Convert a Firestore document snapshot to a DeviceInDB model."""
|
||||||
data = doc.to_dict()
|
data = _sanitize_dict(doc.to_dict())
|
||||||
return DeviceInDB(id=doc.id, **data)
|
return DeviceInDB(id=doc.id, **data)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user