major update
Some checks failed
Deploy / lint (push) Failing after 8s
Deploy / test (push) Has been skipped
Deploy / deploy (push) Has been skipped

This commit is contained in:
Dennis Thiessen
2026-02-27 16:08:09 +01:00
parent 61ab24490d
commit 181cfe6588
71 changed files with 7647 additions and 281 deletions

View File

@@ -6,14 +6,41 @@ from sqlalchemy.ext.asyncio import AsyncSession
from app.dependencies import get_db, require_access
from app.schemas.common import APIEnvelope
from app.schemas.score import (
CompositeBreakdownResponse,
DimensionScoreResponse,
RankingEntry,
RankingResponse,
ScoreBreakdownResponse,
ScoreResponse,
SubScoreResponse,
WeightUpdateRequest,
)
from app.services.scoring_service import get_rankings, get_score, update_weights
def _map_breakdown(raw: dict | None) -> ScoreBreakdownResponse | None:
"""Convert a raw breakdown dict from the scoring service into a Pydantic model."""
if raw is None:
return None
return ScoreBreakdownResponse(
sub_scores=[SubScoreResponse(**s) for s in raw.get("sub_scores", [])],
formula=raw.get("formula", ""),
unavailable=raw.get("unavailable", []),
)
def _map_composite_breakdown(raw: dict | None) -> CompositeBreakdownResponse | None:
"""Convert a raw composite breakdown dict into a Pydantic model."""
if raw is None:
return None
return CompositeBreakdownResponse(
weights=raw["weights"],
available_dimensions=raw["available_dimensions"],
missing_dimensions=raw["missing_dimensions"],
renormalized_weights=raw["renormalized_weights"],
formula=raw["formula"],
)
router = APIRouter(tags=["scores"])
@@ -32,10 +59,20 @@ async def read_score(
composite_stale=result["composite_stale"],
weights=result["weights"],
dimensions=[
DimensionScoreResponse(**d) for d in result["dimensions"]
DimensionScoreResponse(
dimension=d["dimension"],
score=d["score"],
is_stale=d["is_stale"],
computed_at=d.get("computed_at"),
breakdown=_map_breakdown(d.get("breakdown")),
)
for d in result["dimensions"]
],
missing_dimensions=result["missing_dimensions"],
computed_at=result["computed_at"],
composite_breakdown=_map_composite_breakdown(
result.get("composite_breakdown")
),
)
return APIEnvelope(status="success", data=data.model_dump(mode="json"))