PawTrace / backend /app /models /match.py
Elliott Duke
HomingPet: lost-dog reunification (FastAPI + React) with Render deploy
de1e3fc
Raw
History Blame Contribute Delete
1.6 kB
from __future__ import annotations
from datetime import datetime, timezone
from sqlalchemy import (
Boolean,
DateTime,
Enum as SAEnum,
Float,
ForeignKey,
Integer,
String,
func,
)
from sqlalchemy.orm import Mapped, mapped_column
from .base import Base, MatchStatus, SubjectType
class Match(Base):
"""A persisted candidate match for human review (spec §7.7)."""
__tablename__ = "matches"
id: Mapped[int] = mapped_column(primary_key=True)
case_id: Mapped[int] = mapped_column(ForeignKey("cases.id"), index=True)
candidate_type: Mapped[SubjectType] = mapped_column(
SAEnum(SubjectType, native_enum=False)
)
candidate_id: Mapped[int] = mapped_column(Integer) # the matched dog
candidate_case_id: Mapped[int | None] = mapped_column(
ForeignKey("cases.id"), nullable=True
)
similarity_score: Mapped[float] = mapped_column(Float) # dog-level aggregate
rank: Mapped[int] = mapped_column(Integer) # 1 = best
model_name: Mapped[str] = mapped_column(String(80))
model_version: Mapped[str] = mapped_column(String(40))
status: Mapped[MatchStatus] = mapped_column(
SAEnum(MatchStatus, native_enum=False), default=MatchStatus.pending
)
reviewed: Mapped[bool] = mapped_column(Boolean, default=False)
reviewed_by: Mapped[int | None] = mapped_column(
ForeignKey("users.id"), nullable=True
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
default=lambda: datetime.now(timezone.utc),
server_default=func.now(),
)