65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
|
|
"""BewertungRepository — Port für die Versionshistorie einer Bewertung.
|
||
|
|
|
||
|
|
Eine „Bewertung" ist die vollständige Assessment-Instanz; der
|
||
|
|
`BewertungRepository` greift auf die Snapshot-Tabelle
|
||
|
|
``assessment_versions`` zu. Für die aktuellste Bewertung siehe
|
||
|
|
``AntragRepository``.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from typing import Protocol, runtime_checkable
|
||
|
|
|
||
|
|
from .. import database
|
||
|
|
|
||
|
|
|
||
|
|
@runtime_checkable
|
||
|
|
class BewertungRepository(Protocol):
|
||
|
|
async def versions(self, drucksache: str) -> list[dict]: ...
|
||
|
|
|
||
|
|
|
||
|
|
class SqliteBewertungRepository:
|
||
|
|
"""Produktions-Implementation. Delegiert an ``database.py``."""
|
||
|
|
|
||
|
|
async def versions(self, drucksache: str) -> list[dict]:
|
||
|
|
return await database.get_assessment_history(drucksache)
|
||
|
|
|
||
|
|
|
||
|
|
class InMemoryBewertungRepository:
|
||
|
|
"""Test-Fake. Erlaubt per ``add_version`` händisches Bestücken.
|
||
|
|
|
||
|
|
Die produktive Versionierung passiert implizit in ``upsert_assessment``
|
||
|
|
(siehe database.py:580-598). Im Fake trennen wir das bewusst, weil
|
||
|
|
Tests oft explizit Versionshistorie befüllen wollen.
|
||
|
|
"""
|
||
|
|
|
||
|
|
def __init__(self) -> None:
|
||
|
|
self._versions: dict[str, list[dict]] = {}
|
||
|
|
|
||
|
|
def add_version(
|
||
|
|
self,
|
||
|
|
drucksache: str,
|
||
|
|
version: int,
|
||
|
|
gwoe_score: float,
|
||
|
|
model: str,
|
||
|
|
created_at: str = "",
|
||
|
|
) -> None:
|
||
|
|
self._versions.setdefault(drucksache, []).append({
|
||
|
|
"version": version,
|
||
|
|
"gwoe_score": gwoe_score,
|
||
|
|
"model": model,
|
||
|
|
"created_at": created_at,
|
||
|
|
})
|
||
|
|
|
||
|
|
async def versions(self, drucksache: str) -> list[dict]:
|
||
|
|
rows = list(self._versions.get(drucksache, []))
|
||
|
|
rows.sort(key=lambda r: r["version"], reverse=True)
|
||
|
|
return rows
|
||
|
|
|
||
|
|
|
||
|
|
_default_bewertung_repo: BewertungRepository = SqliteBewertungRepository()
|
||
|
|
|
||
|
|
|
||
|
|
def get_bewertung_repository() -> BewertungRepository:
|
||
|
|
return _default_bewertung_repo
|