"""API models for the live station monitor (#57).""" from datetime import datetime from typing import Optional from pydantic import BaseModel class MonitorSubtask(BaseModel): """Mean of the recent measurements of one quote, against its tolerance.""" subtask_id: int description: str unit: str count: int mean: float ltl: Optional[float] = None utl: Optional[float] = None # True when ltl <= mean <= utl (a missing limit does not constrain). in_tolerance: bool class MonitorEvent(BaseModel): event_type: str created_at: datetime note: Optional[str] = None class MonitorRun(BaseModel): id: int station_code: str station_name: str recipe_code: str recipe_name: str version_number: int operator: str status: str started_at: datetime duration_seconds: int cycle_count: int seconds_to_next_measurement: Optional[int] = None overdue: bool last_event: Optional[MonitorEvent] = None # Counts over the last MONITOR_WINDOW measurements of the run. measured: int pass_count: int warning_count: int fail_count: int subtasks: list[MonitorSubtask] server_time: datetime