feat(placements): v0.11 P5 learner placement visibility (REQ-11-005) [3/10] — wave 5-1: get_placement_by_application active-placement read (G-316 shape)
This commit is contained in:
@@ -271,6 +271,15 @@ class PlacementStore(Protocol):
|
||||
def get_placement(self, placement_id: str) -> PlacementRow | None:
|
||||
...
|
||||
|
||||
def get_placement_by_application(
|
||||
self, application_id: str
|
||||
) -> PlacementRow | None:
|
||||
"""v0.11 P5 (REQ-11-005): the learner status read's placement
|
||||
arm — the ACTIVE placement on this application (the G-316
|
||||
partial-unique shape: at most one; revoked-only history →
|
||||
None, the honest null — the events carry the correction)."""
|
||||
...
|
||||
|
||||
def list_placements(self, status: str | None = None) -> list[PlacementRow]:
|
||||
...
|
||||
|
||||
@@ -533,6 +542,25 @@ class SQLitePlacementStore:
|
||||
row._normalize()
|
||||
return row
|
||||
|
||||
def get_placement_by_application(
|
||||
self, application_id: str
|
||||
) -> PlacementRow | None:
|
||||
"""v0.11 P5 (REQ-11-005): the ACTIVE placement on this
|
||||
application — the G-316 partial unique index makes
|
||||
at-most-one structural; revoked-only history → None (the
|
||||
honest null — never a fabricated placement, A-304)."""
|
||||
with Session(self._engine) as session:
|
||||
row = session.exec(
|
||||
select(PlacementRow).where(
|
||||
PlacementRow.application_id == application_id,
|
||||
PlacementRow.status == "active",
|
||||
)
|
||||
).one_or_none()
|
||||
if row is None:
|
||||
return None
|
||||
row._normalize()
|
||||
return row
|
||||
|
||||
def list_placements(self, status: str | None = None) -> list[PlacementRow]:
|
||||
"""created_at then id (the list_postings ordering discipline,
|
||||
R-73 — deterministic export ordering)."""
|
||||
|
||||
Reference in New Issue
Block a user