from datetime import datetime from typing import Any, Literal, Optional from pydantic import BaseModel, Field MonitorPolicyMode = Literal["inherit", "include", "exclude"] class DashboardScope(BaseModel): city: Optional[str] = None client: Optional[str] = None object_ids: list[int] = Field(default_factory=list) tag_ids: list[int] = Field(default_factory=list) class DashboardCheckDefinitionRead(BaseModel): check_key: str enabled: bool interval_sec_default: int plugin_action: str categories: list[str] timeout_sec: int concurrency: int updated_at: datetime model_config = {"from_attributes": True} class DashboardCheckDefinitionPatchItem(BaseModel): check_key: str enabled: Optional[bool] = None interval_sec_default: Optional[int] = None categories: Optional[list[str]] = None timeout_sec: Optional[int] = None concurrency: Optional[int] = None class DashboardObjectOverrideRead(BaseModel): object_id: int check_key: str enabled_override: Optional[bool] = None interval_sec_override: Optional[int] = None categories_override: Optional[list[str]] = None updated_at: datetime model_config = {"from_attributes": True} class DashboardObjectOverridePatchItem(BaseModel): object_id: int check_key: str enabled_override: Optional[bool] = None interval_sec_override: Optional[int] = None categories_override: Optional[list[str]] = None class DashboardObjectPolicyRead(BaseModel): object_id: int mode: MonitorPolicyMode updated_at: datetime model_config = {"from_attributes": True} class DashboardObjectPolicyPatchItem(BaseModel): object_id: int mode: MonitorPolicyMode class DashboardTagPolicyRead(BaseModel): tag_id: int enabled: bool updated_at: datetime model_config = {"from_attributes": True} class DashboardTagPolicyPatchItem(BaseModel): tag_id: int enabled: bool class DashboardPolicyResponse(BaseModel): object_policies: list[DashboardObjectPolicyRead] tag_policies: list[DashboardTagPolicyRead] class DashboardChecksResponse(BaseModel): checks: list[DashboardCheckDefinitionRead] object_overrides: list[DashboardObjectOverrideRead] class DashboardRunRequest(DashboardScope): force: bool = True class DashboardRunResponse(BaseModel): accepted: bool running: bool detail: str class DashboardMonitorStatus(BaseModel): status: str run_type: Optional[str] = None scope: Optional[dict[str, Any]] = None started_at: Optional[datetime] = None finished_at: Optional[datetime] = None last_success_at: Optional[datetime] = None last_error: Optional[str] = None last_counts: Optional[dict[str, Any]] = None model_config = {"from_attributes": True} class DashboardObjectCheckSummary(BaseModel): status_counts: dict[str, int] last_checked_at: Optional[datetime] = None max_age_sec: Optional[int] = None class DashboardObjectSummary(BaseModel): object_id: int object_name: str city: Optional[str] = None client: Optional[str] = None allowed: bool monitor_mode: MonitorPolicyMode device_count: int checks: dict[str, DashboardObjectCheckSummary] health_score: Optional[float] = None class DashboardHomeSummaryResponse(BaseModel): generated_at: datetime scope: DashboardScope totals: dict[str, int] checks_meta: list[DashboardCheckDefinitionRead] objects: list[DashboardObjectSummary] problem_objects: list[DashboardObjectSummary]