60 lines
1.9 KiB
Python
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",
|
|
},
|
|
)
|