learningequality / learningequality/studio

[QTI] Backend handling, validation, and publishing of assessment items from frontend and ricecooker

Open
#5,998 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

DEV: backend
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
  • type is always QTI; raw_data holds 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 QTI type with the item XML in raw_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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.