feat: add external observation review queue

This commit is contained in:
ik
2026-09-03 18:47:31 +07:00
parent 53d700126a
commit c4f4deb24b
10 changed files with 429 additions and 13 deletions
+31 -1
View File
@@ -4,7 +4,7 @@ import enum
import uuid
from datetime import datetime, time
from sqlalchemy import JSON, DateTime, Enum, ForeignKey, Integer, String, Text, Time, UniqueConstraint
from sqlalchemy import JSON, CheckConstraint, DateTime, Enum, ForeignKey, Integer, String, Text, Time, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship
from .database import Base
@@ -166,4 +166,34 @@ class ExternalObservation(Base):
last_seen_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), index=True)
status: Mapped[str] = mapped_column(String(30), default="staged", index=True)
payload: Mapped[dict] = mapped_column(JSON)
fish_id: Mapped[uuid.UUID | None] = mapped_column(ForeignKey("fish.id"))
waterbody_id: Mapped[uuid.UUID | None] = mapped_column(ForeignKey("waterbody.id"))
catch_report_id: Mapped[uuid.UUID | None] = mapped_column(ForeignKey("catch_report.id"), unique=True)
review_note: Mapped[str | None] = mapped_column(Text)
reviewed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
source: Mapped[DataSource] = relationship()
fish: Mapped[Fish | None] = relationship()
waterbody: Mapped[Waterbody | None] = relationship()
catch_report: Mapped[CatchReport | None] = relationship()
class ExternalEntityAlias(Base):
__tablename__ = "external_entity_alias"
__table_args__ = (
UniqueConstraint("source_system", "entity_type", "external_id"),
CheckConstraint(
"(entity_type = 'fish' AND fish_id IS NOT NULL AND waterbody_id IS NULL) OR "
"(entity_type = 'waterbody' AND waterbody_id IS NOT NULL AND fish_id IS NULL)",
name="ck_external_entity_alias_target",
),
)
id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4)
source_system: Mapped[str] = mapped_column(ForeignKey("data_source.key"), index=True)
entity_type: Mapped[str] = mapped_column(String(20))
external_id: Mapped[str] = mapped_column(String(200))
external_name: Mapped[str] = mapped_column(String(200))
fish_id: Mapped[uuid.UUID | None] = mapped_column(ForeignKey("fish.id"))
waterbody_id: Mapped[uuid.UUID | None] = mapped_column(ForeignKey("waterbody.id"))
updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True))
fish: Mapped[Fish | None] = relationship()
waterbody: Mapped[Waterbody | None] = relationship()