PMFlow/backend/app/models/pmflow_launch.py

107 lines
6.0 KiB
Python

"""PMFlow Project Launch 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 PMFlowLaunchDraft(Base):
__tablename__ = "pmflow_launch_drafts"
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)
draft_id: Mapped[str] = mapped_column(VARCHAR(64), nullable=False, index=True)
input_text: Mapped[str] = mapped_column(Text, nullable=False)
input_type: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="text")
source: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="web")
attachments: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list)
draft_payload: Mapped[Any] = mapped_column(JSONB, nullable=False)
edited_payload: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
status: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="draft", index=True)
confidence: Mapped[Optional[float]] = mapped_column(Float, nullable=True)
warnings: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list)
confirmed_project_id: Mapped[Optional[int]] = mapped_column(BigInteger, ForeignKey("projects.id"), nullable=True, index=True)
expires_at: Mapped[datetime] = mapped_column(TIMESTAMP, nullable=False, index=True)
confirmed_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True)
confirm_request_hash: Mapped[Optional[str]] = mapped_column(VARCHAR(128), nullable=True)
__table_args__ = (
UniqueConstraint("tenant_id", "draft_id", name="uq_pmflow_launch_drafts_tenant_draft_id"),
)
class PMFlowLaunchDraftJob(Base):
__tablename__ = "pmflow_launch_draft_jobs"
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)
job_id: Mapped[str] = mapped_column(VARCHAR(64), nullable=False, index=True)
revision_id: Mapped[str] = mapped_column(VARCHAR(64), nullable=False, index=True)
parent_draft_id: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True, index=True)
superseded_by_job_id: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True, index=True)
result_draft_id: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True, index=True)
input_text: Mapped[str] = mapped_column(Text, nullable=False)
input_type: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="text")
source: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="web")
attachments: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list)
mode: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="create")
revision_note: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
status: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="queued", index=True)
result_payload: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
changed_fields: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list)
error_code: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True)
error_message: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
started_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True)
completed_at: Mapped[Optional[datetime]] = mapped_column(TIMESTAMP, nullable=True)
expires_at: Mapped[datetime] = mapped_column(TIMESTAMP, nullable=False, index=True)
__table_args__ = (
UniqueConstraint("tenant_id", "job_id", name="uq_pmflow_launch_draft_jobs_tenant_job_id"),
UniqueConstraint("tenant_id", "revision_id", name="uq_pmflow_launch_draft_jobs_tenant_revision_id"),
)
class PMFlowThread(Base):
__tablename__ = "pmflow_threads"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
project_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("projects.id"), nullable=False, index=True)
launch_draft_id: Mapped[Optional[int]] = mapped_column(
BigInteger, ForeignKey("pmflow_launch_drafts.id"), nullable=True, index=True
)
title: Mapped[str] = mapped_column(VARCHAR(255), nullable=False)
objective: Mapped[str] = mapped_column(Text, nullable=False)
status: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="active", index=True)
source: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="project_launch", index=True)
__table_args__ = (
UniqueConstraint("tenant_id", "project_id", "source", name="uq_pmflow_threads_tenant_project_source"),
)
class PMFlowThreadMessage(Base):
__tablename__ = "pmflow_thread_messages"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
thread_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("pmflow_threads.id"), nullable=False, index=True)
project_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("projects.id"), nullable=False, index=True)
launch_draft_id: Mapped[Optional[int]] = mapped_column(
BigInteger, ForeignKey("pmflow_launch_drafts.id"), nullable=True, index=True
)
role: Mapped[str] = mapped_column(VARCHAR(32), nullable=False)
content: Mapped[str] = mapped_column(Text, nullable=False)
source: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="project_launch")
attachments: Mapped[Any] = mapped_column(JSONB, nullable=False, default=list)
message_metadata: Mapped[Any] = mapped_column(JSONB, nullable=False, default=dict)
status: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="sent", index=True)
__all__ = ["PMFlowLaunchDraft", "PMFlowLaunchDraftJob", "PMFlowThread", "PMFlowThreadMessage"]