"""Модели целей, срезов и метрик.""" from datetime import date, datetime from sqlalchemy import ( Boolean, Date, DateTime, ForeignKey, Numeric, String, UniqueConstraint, func, ) from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db.session import Base from app.models.enums import SnapshotKind from app.models.types import enum_col class Goal(Base): __tablename__ = "goals" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(200)) description: Mapped[str | None] = mapped_column(String(1000)) target_value: Mapped[float | None] = mapped_column(Numeric(14, 2)) unit: Mapped[str | None] = mapped_column(String(32)) is_active: Mapped[bool] = mapped_column(Boolean, default=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now() ) snapshots: Mapped[list["Snapshot"]] = relationship(back_populates="goal") class Snapshot(Base): __tablename__ = "snapshots" id: Mapped[int] = mapped_column(primary_key=True) goal_id: Mapped[int] = mapped_column(ForeignKey("goals.id", ondelete="CASCADE")) snapshot_date: Mapped[date] = mapped_column(Date) kind: Mapped[SnapshotKind] = mapped_column(enum_col(SnapshotKind)) source: Mapped[str | None] = mapped_column(String(32)) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) goal: Mapped[Goal] = relationship(back_populates="snapshots") values: Mapped[list["RegionGoalValue"]] = relationship(back_populates="snapshot") class RegionGoalValue(Base): __tablename__ = "region_goal_values" id: Mapped[int] = mapped_column(primary_key=True) snapshot_id: Mapped[int] = mapped_column(ForeignKey("snapshots.id", ondelete="CASCADE")) region_id: Mapped[int] = mapped_column(ForeignKey("regions.id", ondelete="CASCADE")) value: Mapped[float] = mapped_column(Numeric(14, 2)) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) __table_args__ = (UniqueConstraint("snapshot_id", "region_id", name="uq_snapshot_region"),) snapshot: Mapped[Snapshot] = relationship(back_populates="values") class DataUpload(Base): __tablename__ = "data_uploads" id: Mapped[int] = mapped_column(primary_key=True) goal_id: Mapped[int] = mapped_column(ForeignKey("goals.id")) file_key: Mapped[str] = mapped_column(String(500)) uploaded_by: Mapped[int | None] = mapped_column(ForeignKey("users.id")) status: Mapped[str] = mapped_column(String(20), default="uploaded") processed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())