backend-lehrer (10 files): - game/database.py (785 → 5), correction_api.py (683 → 4) - classroom_engine/antizipation.py (676 → 5) - llm_gateway schools/edu_search already done in prior batch klausur-service (12 files): - orientation_crop_api.py (694 → 5), pdf_export.py (677 → 4) - zeugnis_crawler.py (676 → 5), grid_editor_api.py (671 → 5) - eh_templates.py (658 → 5), mail/api.py (651 → 5) - qdrant_service.py (638 → 5), training_api.py (625 → 4) website (6 pages): - middleware (696 → 8), mail (733 → 6), consent (628 → 8) - compliance/risks (622 → 5), export (502 → 5), brandbook (629 → 7) studio-v2 (3 components): - B2BMigrationWizard (848 → 3), CleanupPanel (765 → 2) - dashboard-experimental (739 → 2) admin-lehrer (4 files): - uebersetzungen (769 → 4), manager (670 → 2) - ChunkBrowserQA (675 → 6), dsfa/page (674 → 5) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
"""
|
|
Grid Editor API — unified grid endpoints.
|
|
"""
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
|
|
from ocr_pipeline_session_store import (
|
|
get_session_db,
|
|
update_session_db,
|
|
)
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter(prefix="/api/v1/ocr-pipeline", tags=["grid-editor"])
|
|
|
|
|
|
@router.post("/sessions/{session_id}/build-unified-grid")
|
|
async def build_unified_grid_endpoint(session_id: str):
|
|
"""Build a single-zone unified grid merging content + box zones.
|
|
|
|
Takes the existing multi-zone grid_editor_result and produces a
|
|
unified grid where boxes are integrated into the main row sequence.
|
|
Persists as unified_grid_result (preserves original multi-zone data).
|
|
"""
|
|
session = await get_session_db(session_id)
|
|
if not session:
|
|
raise HTTPException(status_code=404, detail=f"Session {session_id} not found")
|
|
|
|
grid_data = session.get("grid_editor_result")
|
|
if not grid_data:
|
|
raise HTTPException(status_code=400, detail="No grid data. Run build-grid first.")
|
|
|
|
from unified_grid import build_unified_grid
|
|
|
|
result = build_unified_grid(
|
|
zones=grid_data.get("zones", []),
|
|
image_width=grid_data.get("image_width", 0),
|
|
image_height=grid_data.get("image_height", 0),
|
|
layout_metrics=grid_data.get("layout_metrics", {}),
|
|
)
|
|
|
|
# Persist as separate field (don't overwrite original multi-zone grid)
|
|
await update_session_db(session_id, unified_grid_result=result)
|
|
|
|
logger.info(
|
|
"build-unified-grid session %s: %d rows, %d cells",
|
|
session_id,
|
|
result.get("summary", {}).get("total_rows", 0),
|
|
result.get("summary", {}).get("total_cells", 0),
|
|
)
|
|
|
|
return result
|
|
|
|
|
|
@router.get("/sessions/{session_id}/unified-grid")
|
|
async def get_unified_grid(session_id: str):
|
|
"""Retrieve the unified grid for a session."""
|
|
session = await get_session_db(session_id)
|
|
if not session:
|
|
raise HTTPException(status_code=404, detail=f"Session {session_id} not found")
|
|
|
|
result = session.get("unified_grid_result")
|
|
if not result:
|
|
raise HTTPException(
|
|
status_code=404,
|
|
detail="No unified grid. Run build-unified-grid first.",
|
|
)
|
|
|
|
return result
|