fix: serialize webapp datetime payloads
This commit is contained in:
@@ -688,15 +688,11 @@ async def device_topup_options_route(request: web.Request) -> web.Response:
|
|||||||
"currency": settings.DEFAULT_CURRENCY_SYMBOL or "RUB",
|
"currency": settings.DEFAULT_CURRENCY_SYMBOL or "RUB",
|
||||||
"title": f"+{count}",
|
"title": f"+{count}",
|
||||||
"subtitle": tariff.name(lang),
|
"subtitle": tariff.name(lang),
|
||||||
"valid_from": (
|
"valid_from": _billing_iso_datetime(
|
||||||
(rub_quote or stars_quote)["valid_from"].isoformat()
|
(rub_quote or stars_quote).get("valid_from")
|
||||||
if (rub_quote or stars_quote).get("valid_from")
|
|
||||||
else None
|
|
||||||
),
|
),
|
||||||
"valid_until": (
|
"valid_until": _billing_iso_datetime(
|
||||||
(rub_quote or stars_quote)["valid_until"].isoformat()
|
(rub_quote or stars_quote).get("valid_until")
|
||||||
if (rub_quote or stars_quote).get("valid_until")
|
|
||||||
else None
|
|
||||||
),
|
),
|
||||||
"proration_ratio": float((rub_quote or stars_quote).get("proration_ratio") or 0),
|
"proration_ratio": float((rub_quote or stars_quote).get("proration_ratio") or 0),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -193,6 +193,15 @@ def _format_device_datetime(value: Any) -> str:
|
|||||||
return text
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
def _serialize_device_datetime(value: Any) -> Optional[str]:
|
||||||
|
if not value:
|
||||||
|
return None
|
||||||
|
if isinstance(value, datetime):
|
||||||
|
normalized = value if value.tzinfo else value.replace(tzinfo=timezone.utc)
|
||||||
|
return normalized.isoformat()
|
||||||
|
return str(value)
|
||||||
|
|
||||||
|
|
||||||
def _serialize_device(device: Dict[str, Any], index: int) -> Dict[str, Any]:
|
def _serialize_device(device: Dict[str, Any], index: int) -> Dict[str, Any]:
|
||||||
hwid = str(device.get("hwid") or "").strip()
|
hwid = str(device.get("hwid") or "").strip()
|
||||||
model = str(device.get("deviceModel") or "").strip()
|
model = str(device.get("deviceModel") or "").strip()
|
||||||
@@ -208,7 +217,7 @@ def _serialize_device(device: Dict[str, Any], index: int) -> Dict[str, Any]:
|
|||||||
"os_version": os_version,
|
"os_version": os_version,
|
||||||
"platform_label": platform_label,
|
"platform_label": platform_label,
|
||||||
"user_agent": user_agent,
|
"user_agent": user_agent,
|
||||||
"created_at": device.get("createdAt"),
|
"created_at": _serialize_device_datetime(device.get("createdAt")),
|
||||||
"created_at_text": _format_device_datetime(device.get("createdAt")),
|
"created_at_text": _format_device_datetime(device.get("createdAt")),
|
||||||
"hwid_short": _shorten_hwid_for_display(hwid),
|
"hwid_short": _shorten_hwid_for_display(hwid),
|
||||||
"token": _device_hwid_token(hwid) if hwid else "",
|
"token": _device_hwid_token(hwid) if hwid else "",
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import json
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
|
||||||
|
import bot.app.web.subscription_webapp # noqa: F401
|
||||||
|
from bot.app.web.webapp.devices import _serialize_device
|
||||||
|
|
||||||
|
|
||||||
|
def test_device_serializer_accepts_datetime_created_at():
|
||||||
|
created_at = datetime(2099, 1, 2, 3, 4, tzinfo=timezone.utc)
|
||||||
|
|
||||||
|
payload = _serialize_device(
|
||||||
|
{
|
||||||
|
"hwid": "abcdef123456",
|
||||||
|
"deviceModel": "Laptop",
|
||||||
|
"createdAt": created_at,
|
||||||
|
},
|
||||||
|
1,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert payload["created_at"] == created_at.isoformat()
|
||||||
|
assert payload["created_at_text"] == "02.01.2099 03:04"
|
||||||
|
json.dumps(payload)
|
||||||
Reference in New Issue
Block a user