feat: prioritize risky moderation records

This commit is contained in:
ik
2026-09-12 21:45:29 +07:00
parent ba4c42f8f6
commit 0f078ab482
6 changed files with 25 additions and 8 deletions
+17 -4
View File
@@ -15,7 +15,7 @@ import httpx
from fastapi import Depends, FastAPI, File, Header, HTTPException, Query, Request, Response, UploadFile
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from sqlalchemy import func, or_, select
from sqlalchemy import case, func, or_, select
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import Session, joinedload
@@ -180,7 +180,7 @@ def admin_external_observations(
status: Literal["staged", "mapped", "ready", "published", "rejected", "review"] | None = None,
source_system: str | None = None,
completeness: Literal["all", "complete", "incomplete"] = "all",
order: Literal["newest", "oldest"] = "newest",
order: Literal["newest", "oldest", "risk"] = "newest",
q: str | None = Query(None, max_length=100),
limit: int = Query(50, ge=1, le=200), offset: int = Query(0, ge=0),
) -> list[ExternalObservationOut]:
@@ -209,8 +209,21 @@ def admin_external_observations(
ExternalObservation.fish_name.icontains(term, autoescape=True),
ExternalObservation.waterbody_name.icontains(term, autoescape=True),
))
direction = ExternalObservation.last_seen_at.asc() if order == "oldest" else ExternalObservation.last_seen_at.desc()
items = db.scalars(query.order_by(direction, ExternalObservation.id.desc()).offset(offset).limit(limit))
if order == "risk":
incomplete = case(
(or_(ExternalObservation.x.is_(None), ExternalObservation.y.is_(None), ExternalObservation.weight_g.is_(None)), 0),
else_=1,
)
workflow = case(
(ExternalObservation.status == "staged", 0),
(ExternalObservation.status == "mapped", 1),
else_=2,
)
ordering = (incomplete, workflow, ExternalObservation.last_seen_at.asc(), ExternalObservation.id.desc())
else:
direction = ExternalObservation.last_seen_at.asc() if order == "oldest" else ExternalObservation.last_seen_at.desc()
ordering = (direction, ExternalObservation.id.desc())
items = db.scalars(query.order_by(*ordering).offset(offset).limit(limit))
return [_external_out(item) for item in items]