feat: honor temporal read context

This commit is contained in:
2026-08-05 00:03:32 +02:00
parent bc98372d93
commit 10ea54f38d
4 changed files with 56 additions and 10 deletions
+1 -1
View File
@@ -66,7 +66,7 @@ manifest = ModuleManifest(
id="parties.procedure-and-representation",
title="Procedure parties and representation",
summary="Keep procedure roles and authority distinct from subject master data.",
body="Parties stores immutable procedure participation and explicit representation powers. Powers cannot disappear silently and delivery uses frozen contact snapshots.",
body="Parties stores immutable procedure participation and explicit representation powers. Powers cannot disappear silently and delivery uses frozen contact snapshots. Unversioned reads follow the titlebar valid-time and recorded-time selection; explicit procedure resolution times take precedence and current authorization is unchanged.",
layer="configured",
documentation_types=("admin", "user"),
audience=("user", "operator", "module_admin", "auditor"),
+13 -8
View File
@@ -3,7 +3,6 @@ from __future__ import annotations
from datetime import UTC, datetime
from typing import Any, Mapping, Sequence
from sqlalchemy import or_
from sqlalchemy.orm import Session
from govoplan_core.core.institutional import (
@@ -15,6 +14,8 @@ from govoplan_core.core.institutional import (
revise_procedure_party,
revoke_party_representation,
)
from govoplan_core.core.temporal import TemporalDataContext
from govoplan_core.db.temporal import apply_temporal_revision_filter
from govoplan_parties.backend.db.models import ProcedurePartyRevision
@@ -123,7 +124,7 @@ def get_procedure_party(
ProcedurePartyRevision.party_id == party_id,
)
if revision is None:
query = query.filter(ProcedurePartyRevision.superseded_at.is_(None))
query = apply_temporal_revision_filter(query, ProcedurePartyRevision)
else:
query = query.filter(ProcedurePartyRevision.revision == revision)
row = query.order_by(ProcedurePartyRevision.recorded_at.desc()).first()
@@ -151,13 +152,17 @@ class SqlPartyResolver:
ProcedurePartyRevision.procedure_owner_module == procedure_ref.owner_module,
ProcedurePartyRevision.procedure_id == procedure_ref.object_id,
)
if effective_at is None:
query = query.filter(ProcedurePartyRevision.superseded_at.is_(None))
else:
query = query.filter(
or_(ProcedurePartyRevision.valid_from.is_(None), ProcedurePartyRevision.valid_from <= effective_at),
or_(ProcedurePartyRevision.valid_to.is_(None), ProcedurePartyRevision.valid_to > effective_at),
context = None
if effective_at is not None:
context = TemporalDataContext(
validity_mode="at",
valid_at=effective_at,
)
query = apply_temporal_revision_filter(
query,
ProcedurePartyRevision,
context=context,
)
rows = query.order_by(
ProcedurePartyRevision.party_id.asc(),
ProcedurePartyRevision.recorded_at.desc(),