|
# retoor <retoor@molodetz.nl>
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Optional
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class StatisticsMetricOut(BaseModel):
|
|
key: str
|
|
label: str
|
|
value: Any
|
|
format: str = "int"
|
|
delta: Optional[float] = None
|
|
direction: Optional[str] = None
|
|
|
|
|
|
class StatisticsPointOut(BaseModel):
|
|
t: str
|
|
v: float
|
|
|
|
|
|
class StatisticsSeriesOut(BaseModel):
|
|
key: str
|
|
label: str
|
|
points: list[StatisticsPointOut]
|
|
|
|
|
|
class StatisticsTableOut(BaseModel):
|
|
key: str
|
|
title: str
|
|
columns: list[str]
|
|
rows: list[list[Any]]
|
|
|
|
|
|
class StatisticsHighlightOut(BaseModel):
|
|
label: str
|
|
value: Any
|
|
|
|
|
|
class StatisticsOut(BaseModel):
|
|
tab: str
|
|
window_hours: int
|
|
granularity: str
|
|
generated_at: str
|
|
compare: bool = True
|
|
cards: list[StatisticsMetricOut] = []
|
|
series: list[StatisticsSeriesOut] = []
|
|
tables: list[StatisticsTableOut] = []
|
|
highlights: list[StatisticsHighlightOut] = []
|
|
notes: dict[str, Any] = {} |