learningequality / learningequality/studio
[QTI] Backend handling, validation, and publishing of assessment items from frontend and ricecooker
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 191
- Forks
- 307
- Avg merge
- 5d 6h
- Merged PRs (30d)
- 10
Description
Overview
The new QTI editor (#5970) emits one complete <qti-assessment-item> XML document per item, stored in AssessmentItem.raw_data with type='QTI'. This issue tracks the backend that stores those items, validates QTI from every source, publishes them as QTI packages (dual-publishing Perseus where the interaction type allows), and accepts QTI uploaded through the internal/ricecooker API.
Scope
In:
- Persisting authored QTI XML and round-tripping it through sync + internal API
- Authoritative QTI 3.0 schema (XSD) validation for all sources
- Publishing native QTI items as QTI/IMSCP packages
- Dual-publishing Perseus for QTI items whose interaction type Perseus can express
- Accepting arbitrary QTI via ricecooker upload
- Publishing mixed Perseus + QTI exercises as one package
- Migrating legacy studio-authored items to QTI
Out:
- The frontend editor and editability detection (#5970 and children)
- Extending the pydantic QTI models to the full spec (see Strategy)
- QTI viewer / learner preview
Strategy
typeis alwaysQTI;raw_dataholds one complete<qti-assessment-item>XML string, atomic under field-level sync.- Authoritative compliance validation is schema-based (QTI 3.0 XSD) and runs for every source.
- The pydantic models (
contentcuration/utils/assessment/qti/, #5965) stay a restricted subset: used only to generate QTI from non-QTI structured data and to read the choice/text-entry subset for Perseus derivation. They are not extended to the full spec. - Editability is a frontend round-trip concern. Arbitrary QTI from ricecooker is non-editable and published verbatim.
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 with contentcuration/utils/assessment/qti/ and trace the AssessmentItem serializer, sync/internal API paths, publishing flow, and ricecooker upload entry point named in the scope. Done means QTI XML is persisted, schema-validated from every source, uploaded through ricecooker, and published in the specified native, mixed, and dual-Perseus cases.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- api, backend, content
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 28/100