from __future__ import annotations from typing import Optional import uuid from datetime import datetime from sqlalchemy import DateTime, ForeignKey, Integer, UniqueConstraint, func from sqlalchemy.dialects.postgresql import JSONB, UUID from sqlalchemy.orm import Mapped, mapped_column from app.db.base_class import Base class StudySetupConfig(Base): __tablename__ = "study_setup_configs" __table_args__ = (UniqueConstraint("study_id", name="uq_study_setup_config_study"),) id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) study_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("studies.id"), nullable=False, index=True) version: Mapped[int] = mapped_column(Integer, nullable=False, default=1) config: Mapped[dict] = mapped_column(JSONB, nullable=False) publish_status: Mapped[str] = mapped_column(default="DRAFT", nullable=False) published_config: Mapped[dict | None] = mapped_column(JSONB, nullable=True) published_project_snapshot: Mapped[dict | None] = mapped_column(JSONB, nullable=True) current_branch_name: Mapped[str] = mapped_column(nullable=False, default="main") active_branch_base_version_id: Mapped[Optional[uuid.UUID]] = mapped_column( UUID(as_uuid=True), ForeignKey("study_setup_config_versions.id", ondelete="SET NULL"), nullable=True ) current_published_version_id: Mapped[Optional[uuid.UUID]] = mapped_column( UUID(as_uuid=True), ForeignKey("study_setup_config_versions.id", ondelete="SET NULL"), nullable=True ) published_by: Mapped[Optional[uuid.UUID]] = mapped_column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True) published_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True) saved_by: Mapped[Optional[uuid.UUID]] = mapped_column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now()) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now(), onupdate=func.now() )