from __future__ import annotations from datetime import datetime from typing import List, Optional from sqlalchemy import Boolean, DateTime, String, text from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.sql import func from .database import Base class Host(Base): __tablename__ = "hosts" id: Mapped[str] = mapped_column(String, primary_key=True) name: Mapped[str] = mapped_column(String, nullable=False) ip_address: Mapped[str] = mapped_column(String, nullable=False, unique=True) status: Mapped[str] = mapped_column(String, nullable=False, server_default=text("'unknown'")) ansible_group: Mapped[Optional[str]] = mapped_column(String, nullable=True) last_seen: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) reachable: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default=text("0")) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now()) updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now(), onupdate=func.now()) deleted_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) bootstrap_statuses: Mapped[List["BootstrapStatus"]] = relationship( "BootstrapStatus", back_populates="host", cascade="all, delete-orphan" ) logs: Mapped[List["Log"]] = relationship("Log", back_populates="host") def __repr__(self) -> str: # pragma: no cover - debug helper return f""