from pathlib import Path from fastapi import APIRouter, Depends, Request from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates from sqlalchemy import exists from sqlalchemy.orm import Session, selectinload from app.db.deps import get_db from app.models.document import Document from app.models.extracted_field import ExtractedField router = APIRouter(prefix="/queue", tags=["queue"]) BASE_DIR = Path(__file__).resolve().parent.parent templates = Jinja2Templates(directory=str(BASE_DIR / "templates")) @router.get("/", response_class=HTMLResponse) def review_queue(request: Request, db: Session = Depends(get_db)): needs_ocr_review = ( db.query(Document) .filter(Document.is_trashed.is_(False)).filter(Document.review_status != "reviewed") .order_by(Document.created_at.asc()) .all() ) needs_field_extraction = ( db.query(Document) .options(selectinload(Document.extracted_fields)) .filter(Document.is_trashed.is_(False)).filter(Document.review_status == "reviewed") .filter(~exists().where(ExtractedField.document_id == Document.id)) .order_by(Document.updated_at.asc()) .all() ) recently_updated = ( db.query(Document) .filter(Document.is_trashed.is_(False)).order_by(Document.updated_at.desc()) .limit(25) .all() ) next_ocr = needs_ocr_review[0] if needs_ocr_review else None next_fields = needs_field_extraction[0] if needs_field_extraction else None return templates.TemplateResponse( request=request, name="queue/index.html", context={ "request": request, "needs_ocr_review": needs_ocr_review, "needs_field_extraction": needs_field_extraction, "recently_updated": recently_updated, "next_ocr": next_ocr, "next_fields": next_fields, "active_page": "queue", }, )