PMFlow/backend/app/models/saved_idea.py

47 lines
2.4 KiB
Python

"""Personal space saved idea models."""
from __future__ import annotations
from datetime import datetime
from typing import Any, Optional
from sqlalchemy import BigInteger, Float, ForeignKey, Integer, Text, TIMESTAMP, UniqueConstraint, VARCHAR
from sqlalchemy.orm import Mapped, mapped_column
from .base import Base
from .types import JSONB
class SavedIdea(Base):
__tablename__ = "saved_ideas"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("users.id"), nullable=False, index=True)
idea_id: Mapped[str] = mapped_column(VARCHAR(64), nullable=False, index=True)
title: Mapped[str] = mapped_column(VARCHAR(255), nullable=False)
raw_text: Mapped[str] = mapped_column(Text, nullable=False)
summary: Mapped[str] = mapped_column(Text, nullable=False)
source_type: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="project_launch", index=True)
source_ref: Mapped[Optional[str]] = mapped_column(VARCHAR(255), nullable=True)
input_mode: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="idea")
attachments: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list)
status: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="saved", index=True)
ai_summary: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
missing_questions: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list)
readiness_score: Mapped[float] = mapped_column(Float, nullable=False, default=0.0)
enrichment_status: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="baseline")
enrichment_payload: Mapped[Any] = mapped_column(JSONB, nullable=True, default=dict)
enrichment_error: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
enriched_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True)
launch_draft_id: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True, index=True)
promoted_project_id: Mapped[Optional[int]] = mapped_column(BigInteger, ForeignKey("projects.id"), nullable=True, index=True)
promoted_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True)
archived_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True)
__table_args__ = (
UniqueConstraint("tenant_id", "idea_id", name="uq_saved_ideas_tenant_idea_id"),
)
__all__ = ["SavedIdea"]