66 lines
2.6 KiB
Python
66 lines
2.6 KiB
Python
"""Account snapshots with an explicit local daily simulation allowance."""
|
|
|
|
from datetime import datetime
|
|
from zoneinfo import ZoneInfo
|
|
|
|
from .alphas import number
|
|
|
|
LOCAL_DAILY_SIMULATION_LIMIT = 10_000
|
|
|
|
|
|
def daily_activity(raw, today, daily_limit=None):
|
|
"""Read recordset columns by schema; missing dates are not reported as zero usage."""
|
|
recordset = raw.get("records", {})
|
|
if not isinstance(recordset, dict):
|
|
raise ValueError("Invalid activity recordset")
|
|
schema = recordset.get("schema", {})
|
|
if not isinstance(schema, dict):
|
|
raise ValueError("Invalid activity schema")
|
|
properties, rows = schema.get("properties", []), recordset.get("records", [])
|
|
if not isinstance(properties, list) or not isinstance(rows, list):
|
|
raise ValueError("Invalid activity records")
|
|
names = [p.get("name") if isinstance(p, dict) else p for p in properties]
|
|
count = None
|
|
if "date" in names and "value" in names:
|
|
for row in rows:
|
|
if isinstance(row, list) and len(row) >= len(names) and row[names.index("date")] == today:
|
|
count = number(row[names.index("value")])
|
|
result = {
|
|
"today": count,
|
|
"limit": daily_limit,
|
|
"remaining": max(0, daily_limit - count) if daily_limit is not None and count is not None else None,
|
|
}
|
|
for key in ("yesterday", "total"):
|
|
period = raw.get(key)
|
|
result[key] = number(period.get("value")) if isinstance(period, dict) else None
|
|
if key == "yesterday":
|
|
result["yesterday_date"] = period.get("end") if isinstance(period, dict) else None
|
|
# The allowance is a user-chosen local budget, not a platform quota.
|
|
# Missing activity must not imply that the whole daily budget is available.
|
|
return result
|
|
|
|
|
|
def usage_snapshot(data, errors, at=None):
|
|
today = (at or datetime.now(ZoneInfo("America/New_York"))).date().isoformat()
|
|
activities, errors = {}, dict(errors)
|
|
for key in ("simulations", "submissions"):
|
|
if key in data:
|
|
try:
|
|
activities[key] = daily_activity(
|
|
data[key],
|
|
today,
|
|
daily_limit=LOCAL_DAILY_SIMULATION_LIMIT if key == "simulations" else None,
|
|
)
|
|
except ValueError:
|
|
errors[key] = "平台用量数据格式无法识别"
|
|
return {
|
|
"date": today,
|
|
"timezone": "America/New_York",
|
|
**activities,
|
|
"alphas": {
|
|
key: number(data.get("alphas", {}).get(key))
|
|
for key in ("unsubmitted", "active", "decommissioned")
|
|
},
|
|
"errors": errors,
|
|
}
|