from __future__ import annotations from sqlalchemy import Boolean, ForeignKey, Integer, JSON, String, Text, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column from admin_app.db.models.base import AdminTimestampedModel from admin_app.db.models.tool_draft import ToolLifecycleStatusType from shared.contracts import ToolLifecycleStatus class ToolVersion(AdminTimestampedModel): __tablename__ = "tool_versions" __table_args__ = ( UniqueConstraint( "tool_name", "version_number", name="uq_tool_versions_tool_name_version_number", ), ) id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) version_id: Mapped[str] = mapped_column(String(120), unique=True, index=True, nullable=False) draft_id: Mapped[int] = mapped_column( Integer, ForeignKey("tool_drafts.id"), nullable=False, index=True, ) tool_name: Mapped[str] = mapped_column(String(64), index=True, nullable=False) version_number: Mapped[int] = mapped_column(Integer, nullable=False) status: Mapped[ToolLifecycleStatus] = mapped_column( ToolLifecycleStatusType(), nullable=False, default=ToolLifecycleStatus.DRAFT, index=True, ) summary: Mapped[str] = mapped_column(Text, nullable=False) description: Mapped[str] = mapped_column(Text, nullable=False) business_goal: Mapped[str] = mapped_column(Text, nullable=False) parameters_json: Mapped[list[dict]] = mapped_column(JSON, nullable=False, default=list) required_parameter_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0) requires_director_approval: Mapped[bool] = mapped_column( Boolean, nullable=False, default=True, ) generation_model: Mapped[str | None] = mapped_column(String(120), nullable=True) owner_staff_account_id: Mapped[int] = mapped_column( Integer, ForeignKey("staff_accounts.id"), nullable=False, index=True, ) owner_display_name: Mapped[str] = mapped_column(String(150), nullable=False)