fix: scrub training public list detail privacy

This commit is contained in:
2026-04-30 22:07:27 -04:00
parent f6ed2fbebd
commit 2705dde8bc
2 changed files with 16 additions and 8 deletions
@@ -31,11 +31,11 @@ class TrainingCaseService:
instrument_id=instrument_id,
limit=limit,
)
return [_without_answer_key(case) for case in cases]
return [_sanitize_public_export(case) for case in cases]
def get_case(self, case_id: int) -> Optional[dict]:
case = self.repository.get_case(case_id, include_answer_key=False)
return _without_answer_key(case) if case else None
return _sanitize_public_export(case) if case else None
def create_attempt(
self,
@@ -99,12 +99,6 @@ class TrainingCaseService:
return import_training_cases(payload, repository=self.repository)
def _without_answer_key(row: dict) -> dict:
cleaned = dict(row)
cleaned.pop("answer_key", None)
return cleaned
def _sanitize_public_export(value):
if isinstance(value, dict):
public_value = {}
@@ -73,6 +73,9 @@ class _NestedPrivateRepository:
}
][:limit]
def get_case(self, case_id: int, **kwargs):
return self.list_cases(limit=1)[0] | {"id": case_id}
def _case_package_with_nested_private_material() -> dict:
return {
@@ -168,6 +171,17 @@ class TrainingPublicExportPrivacyM15Tests(unittest.TestCase):
self.assertEqual(item["metadata"]["metadata_note"]["public_label"], "visible")
self.assertPublicPayloadHasNoPrivateMaterial(export_result)
def test_service_public_list_and_detail_scrub_nested_solution_material(self) -> None:
service = TrainingCaseService(repository=_NestedPrivateRepository())
list_result = service.list_cases(limit=100)
detail_result = service.get_case(151)
self.assertEqual(list_result[0]["meta"]["tasks"][0]["meta"]["public_hint"], "Focus on context.")
self.assertEqual(detail_result["meta"]["metadata_note"]["public_label"], "visible")
self.assertPublicPayloadHasNoPrivateMaterial({"items": list_result})
self.assertPublicPayloadHasNoPrivateMaterial(detail_result)
def test_cli_smoke_public_export_scrubs_nested_solution_material(self) -> None:
with tempfile.TemporaryDirectory() as tmpdir:
package_path = Path(tmpdir) / "training_case_package.json"