from __future__ import annotations import enum import uuid from datetime import datetime from sqlalchemy import ( DateTime, Enum, ForeignKey, func, ) from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column, relationship from app.database.database import Base class WorkflowStatus(str, enum.Enum): PENDING = "PENDING" RUNNING = "RUNNING" WAITING_FOR_REVIEW = "WAITING_FOR_REVIEW" COMPLETED = "COMPLETED" FAILED = "FAILED" CANCELLED = "CANCELLED" class WorkflowRun(Base): """ Represents one execution of the document intelligence workflow. """ __tablename__ = "workflow_runs" id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, ) workspace_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), ForeignKey("workspaces.id", ondelete="CASCADE"), nullable=False, index=True, ) document_version_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), ForeignKey("document_versions.id", ondelete="CASCADE"), nullable=False, index=True, ) status: Mapped[WorkflowStatus] = mapped_column( Enum(WorkflowStatus, name="workflow_status"), nullable=False, default=WorkflowStatus.PENDING, server_default=WorkflowStatus.PENDING.value, index=True, ) started_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now(), ) completed_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True, ) # ------------------------------------------------------------------ # Relationships # ------------------------------------------------------------------ workspace: Mapped["Workspace"] = relationship( back_populates="workflow_runs", ) document_version: Mapped["DocumentVersion"] = relationship( back_populates="workflow_runs", ) checkpoints: Mapped[list["WorkflowCheckpoint"]] = relationship( back_populates="workflow_run", cascade="all, delete-orphan", ) def __repr__(self) -> str: return ( f"" )