feat(cases): enforce purpose-bound case governance
Module Package Release / publish-packages (push) Successful in 12s

This commit is contained in:
2026-08-24 20:05:31 +02:00
parent 9435116299
commit 17415d8831
28 changed files with 786 additions and 142 deletions
+9 -1
View File
@@ -9,7 +9,7 @@ from urllib.parse import parse_qs, quote, urlsplit
from sqlalchemy.orm import Session
from govoplan_core.core.institutional import EvidenceReference
from govoplan_cases.backend.domain import CaseRecord
from govoplan_cases.backend.domain import DEFAULT_CASE_ACCESS_PURPOSE, CaseRecord
from govoplan_cases.backend.service import CaseStoreError, get_case, update_case
@@ -31,12 +31,14 @@ def link_case_evidence(
recorded_at: datetime,
change_reason: str,
idempotency_key: str,
purpose: str = DEFAULT_CASE_ACCESS_PURPOSE,
) -> CaseRecord:
base = _base_revision(
session,
principal,
case_id=case_id,
expected_revision=expected_revision,
purpose=purpose,
)
evidence = _validated_evidence(reference, tenant_id=base.reference.tenant_id)
if any(item.evidence_id == evidence.evidence_id for item in base.evidence_refs):
@@ -50,6 +52,7 @@ def link_case_evidence(
recorded_at=recorded_at,
change_reason=change_reason,
idempotency_key=idempotency_key,
purpose=purpose,
)
@@ -63,12 +66,14 @@ def unlink_case_evidence(
recorded_at: datetime,
change_reason: str,
idempotency_key: str,
purpose: str = DEFAULT_CASE_ACCESS_PURPOSE,
) -> CaseRecord:
base = _base_revision(
session,
principal,
case_id=case_id,
expected_revision=expected_revision,
purpose=purpose,
)
evidence = next(
(item for item in base.evidence_refs if item.evidence_id == evidence_id),
@@ -89,6 +94,7 @@ def unlink_case_evidence(
recorded_at=recorded_at,
change_reason=change_reason,
idempotency_key=idempotency_key,
purpose=purpose,
)
@@ -119,12 +125,14 @@ def _base_revision(
*,
case_id: str,
expected_revision: int,
purpose: str,
) -> CaseRecord:
base = get_case(
session,
principal,
case_id=case_id,
revision=expected_revision,
purpose=purpose,
)
if base is None:
raise LookupError("Case revision not found.")