import enum import uuid from datetime import date from sqlalchemy import Date, Enum, ForeignKey, String, Text from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column, relationship from api.models.base import Base, TimestampMixin, new_uuid class WorkstreamStatus(str, enum.Enum): active = "active" blocked = "blocked" completed = "completed" archived = "archived" class Workstream(Base, TimestampMixin): __tablename__ = "workstreams" id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), primary_key=True, default=new_uuid ) topic_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), ForeignKey("topics.id", ondelete="RESTRICT"), nullable=False, index=True ) slug: Mapped[str] = mapped_column(String(100), unique=True, nullable=False, index=True) title: Mapped[str] = mapped_column(String(255), nullable=False) description: Mapped[str | None] = mapped_column(Text, nullable=True) status: Mapped[WorkstreamStatus] = mapped_column( Enum(WorkstreamStatus), nullable=False, default=WorkstreamStatus.active ) owner: Mapped[str | None] = mapped_column(String(100), nullable=True) due_date: Mapped[date | None] = mapped_column(Date, nullable=True) topic: Mapped["Topic"] = relationship("Topic", back_populates="workstreams") # noqa: F821 tasks: Mapped[list["Task"]] = relationship( # noqa: F821 "Task", back_populates="workstream", lazy="selectin" ) decisions: Mapped[list["Decision"]] = relationship( # noqa: F821 "Decision", back_populates="workstream", lazy="selectin" ) progress_events: Mapped[list["ProgressEvent"]] = relationship( # noqa: F821 "ProgressEvent", back_populates="workstream", lazy="selectin" )