document-processor/app/routes/queue.py

60 lines
1.9 KiB
Python

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",
},
)