db5d686938
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
50 lines
1.2 KiB
Python
50 lines
1.2 KiB
Python
"""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
|