DocWeave / backend /app /models /workflow_run.py
shak3008's picture
feat: add human review approval gate and workflow resume
0868c75
Raw
History Blame Contribute Delete
2.42 kB
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"<WorkflowRun("
f"id={self.id}, "
f"status='{self.status.value}')>"
)