learningequality / learningequality/studio
[QTI] Backfill all non-raw AssessmentItems to QTI items
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 191
- Forks
- 307
- Avg merge
- 5d 6h
- Merged PRs (30d)
- 10
Description
❌ This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.
Overview
Run the one-time global backfill converting every legacy AssessmentItem to type='QTI' + raw_data XML via #6003's conversion, then remove the API-layer dual-read.
Complexity: Medium
Target branch: unstable
Context
- #6003 provides the reusable conversion.
- #6030 wires it into the endpoint as a transitional API dual-read.
- This issue makes that change permanent in the data.
- A data-only backfill — no schema change — over a large table.
The Change
- Backfill every legacy row to
type='QTI'+raw_dataXML via the #6003 conversion. - Leave
perseus_questionrows untouched. - Remove the API-layer dual-read (#6030) once the backfill completes.
Acceptance Criteria
- After the backfill, every legacy row is
type='QTI'withraw_dataXML; onlyperseus_questionrows remain unconverted - Rows that fail conversion are surfaced, not silently dropped
- The backfill is resumable and safe to re-run
- With the backfill complete, the API serves QTI directly without the dual-read
- Tests cover the backfill over a mixed fixture
AI usage
Architecture decided with the maintainer across an iterative session: blanket
QTItype with the item XML inraw_data; XSD-authoritative validation across all sources; a legacy→QTI global migration with an API-layer dual-read; ricecooker upload delegating to the AssessmentItem serializer; and a Perseus custom-interaction contract confirmed against the QTI 3.0 specification. Claude mapped the existing publish/validation/ricecooker code, proposed the breakdown, and drafted each issue; the maintainer steered every decision and reviewed throughout.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading the reusable conversion in #6003 and the transitional API dual-read in #6030. Design the global backfill to convert non-Perseus legacy rows, surface failures, and support safe reruns; completion means mixed-fixture tests pass and the API no longer needs the dual-read.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- api, database
- Issue type
- Refactor
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 30/100