import enum import uuid from datetime import datetime from sqlalchemy import Boolean, DateTime, 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 ContributionType(str, enum.Enum): br = "br" fr = "fr" ep = "ep" upr = "upr" class ContributionStatus(str, enum.Enum): draft = "draft" submitted = "submitted" acknowledged = "acknowledged" accepted = "accepted" rejected = "rejected" merged = "merged" withdrawn = "withdrawn" class Contribution(Base, TimestampMixin): __tablename__ = "contributions" id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), primary_key=True, default=new_uuid ) type: Mapped[ContributionType] = mapped_column( Enum(ContributionType, name="contributiontype"), nullable=False ) target_org: Mapped[str | None] = mapped_column(String(200), nullable=True) target_repo: Mapped[str | None] = mapped_column(String(200), nullable=True) slug: Mapped[str | None] = mapped_column(String(200), nullable=True) title: Mapped[str] = mapped_column(String(500), nullable=False) status: Mapped[ContributionStatus] = mapped_column( Enum(ContributionStatus, name="contributionstatus"), nullable=False, default=ContributionStatus.draft, ) body_path: Mapped[str | None] = mapped_column(Text, nullable=True) related_topic_id: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), ForeignKey("topics.id", ondelete="SET NULL"), nullable=True ) related_workstream_id: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), ForeignKey("workstreams.id", ondelete="SET NULL"), nullable=True ) repo_id: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), ForeignKey("managed_repos.id", ondelete="SET NULL"), nullable=True ) submitted_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True ) resolved_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True ) notes: Mapped[str | None] = mapped_column(Text, nullable=True) topic: Mapped["Topic"] = relationship("Topic", lazy="selectin") # noqa: F821 workstream: Mapped["Workstream"] = relationship("Workstream", lazy="selectin") # noqa: F821 repo: Mapped["ManagedRepo"] = relationship("ManagedRepo", lazy="selectin") # noqa: F821