fix: scrub training public list detail privacy
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user