| 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, |
| ) |
|
|
| |
| |
| |
|
|
| 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"<WorkflowRun(" |
| f"id={self.id}, " |
| f"status='{self.status.value}')>" |
| ) |