"""Template tree model — platform-owned troubleshooting trees, readable by all users. No account_id. No RLS. Readable by any authenticated user. Populated by promoting is_default=TRUE trees from the trees table. """ import uuid from datetime import datetime, timezone from typing import Optional, Any from sqlalchemy import String, Text, Boolean, DateTime, ForeignKey from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.dialects.postgresql import UUID, JSONB from app.core.database import Base class TemplateTree(Base): __tablename__ = "template_trees" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) name: Mapped[str] = mapped_column(String(255), nullable=False) description: Mapped[Optional[str]] = mapped_column(Text, nullable=True) category: Mapped[Optional[str]] = mapped_column(String(100), nullable=True) tree_type: Mapped[str] = mapped_column(String(20), nullable=False, index=True) tree_structure: Mapped[dict[str, Any]] = mapped_column(JSONB, nullable=False) tags: Mapped[list] = mapped_column(JSONB, nullable=False, default=list) is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) source_tree_id: Mapped[Optional[uuid.UUID]] = mapped_column( UUID(as_uuid=True), ForeignKey("trees.id", ondelete="SET NULL"), nullable=True, ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), )