Skip to main content

A Learning Management System extension for Wagtail with SCORM 1.2/2004 support

Project description

Wagtail LMS

CI codecov PyPI version Python 3.11+ License: MIT pre-commit.ci status

A Learning Management System extension for Wagtail CMS with SCORM 1.2/2004 support.

⚠️ Alpha Release

This package is in early development.

Supported versions:

  • Python: 3.11, 3.12, 3.13
  • Django: 4.2 (LTS), 5.0, 5.1, 5.2 (LTS)
  • Wagtail: 6.0, 6.1, 6.2, 6.3, 7.0 (LTS), 7.1

All combinations are tested in CI. See our compatibility matrix for specific version combinations.

Features

  • 📚 Course Management - Integrate courses into Wagtail's page system
  • 📦 SCORM Support - Full SCORM 1.2 and 2004 package compatibility
  • 👥 Enrollment Tracking - Automatic student enrollment and progress monitoring
  • 📊 SCORM API - Complete runtime API implementation for content interactivity
  • 🔒 Secure Delivery - Path-validated content serving with iframe support
  • 💾 Progress Persistence - CMI data model storage with suspend/resume capability
  • 🔄 Concurrency Handling - Retry logic for SQLite database lock scenarios
  • 🎨 Framework Agnostic - Minimal default styling, easy to customize with any CSS framework

Development Status

Core functionality tested and working

  • Comprehensive test suite with 86% code coverage
  • 65+ tests covering models, views, API, and integration workflows
  • Example project fully functional for development and testing
  • Database lock handling for concurrent SCORM operations
  • Wagtail preview mode fully supported

See example_project/README.md for setup instructions.

Installation

pip install wagtail-lms

Quick Start

  1. Add to INSTALLED_APPS in your Django settings:

    INSTALLED_APPS = [
        # ...
        'wagtail_lms',
        # ...
    ]
    
  2. Add wagtail-lms URLs to your urls.py:

    from django.urls import path, include
    
    urlpatterns = [
        # ...
        path('lms/', include('wagtail_lms.urls')),
        # ...
    ]
    
  3. Run migrations:

    python manage.py migrate wagtail_lms
    
  4. Collect static files:

    python manage.py collectstatic
    

Configuration

Optional settings in your Django settings:

# SCORM package upload directory
WAGTAIL_LMS_SCORM_UPLOAD_PATH = 'scorm_packages/'

# Extracted SCORM content directory
WAGTAIL_LMS_CONTENT_PATH = 'scorm_content/'

# Auto-enroll users when they visit a course
WAGTAIL_LMS_AUTO_ENROLL = False

Usage

Creating a Course

  1. Log into Wagtail admin
  2. Create a new "Course Page" under Pages
  3. Upload a SCORM package via Django Admin → SCORM Packages
  4. Assign the SCORM package to your course page

SCORM Package Requirements

  • Must be a valid SCORM 1.2 or 2004 ZIP file
  • Must contain imsmanifest.xml at the root
  • Launch file must be specified in the manifest

Customizing Templates

The package includes minimal, functional styling that works out of the box. To match your project's design:

  • Quick: Override the CSS classes in your own stylesheet
  • Full control: Override the templates in your project (standard Django approach)
  • Examples: See Template Customization Guide for Bootstrap, Tailwind CSS, and Bulma examples

For API-first projects, the templates are optional and can be ignored entirely.

Development

Running Tests

The project includes a comprehensive test suite with 86% code coverage.

# Install testing dependencies (pytest, pytest-django, pytest-cov)
uv sync --extra testing

# Run all tests
PYTHONPATH=. uv run pytest

# Run with coverage report
PYTHONPATH=. uv run pytest --cov=src/wagtail_lms --cov-report=term-missing

# Run specific test file
PYTHONPATH=. uv run pytest tests/test_models.py -v

Database Considerations

SQLite: The package includes retry logic with exponential backoff to handle database lock errors during concurrent SCORM API operations. For development with the example project:

# example_project/settings.py
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": "db.sqlite3",
        "OPTIONS": {
            "timeout": 20,  # Increased timeout for SCORM operations
        },
    }
}

Production: For production deployments, PostgreSQL is recommended for better concurrency handling:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "wagtail_lms",
        # ... other PostgreSQL settings
    }
}

Acknowledgments

License

This project is licensed under the MIT License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wagtail_lms-0.4.0.tar.gz (15.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wagtail_lms-0.4.0-py3-none-any.whl (21.5 kB view details)

Uploaded Python 3

File details

Details for the file wagtail_lms-0.4.0.tar.gz.

File metadata

  • Download URL: wagtail_lms-0.4.0.tar.gz
  • Upload date:
  • Size: 15.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for wagtail_lms-0.4.0.tar.gz
Algorithm Hash digest
SHA256 4551ac32e2423ead2476a9592066e9ad6fb5a93f0d49cf0e795ab87e810554e3
MD5 27a091ec1beaba1fa758cad173785884
BLAKE2b-256 587e78b82bd39c80e5db27a56b2b145d2a9515cd5190d8cd78932b81ab7dd463

See more details on using hashes here.

Provenance

The following attestation bundles were made for wagtail_lms-0.4.0.tar.gz:

Publisher: publish.yml on dr-rompecabezas/wagtail-lms

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wagtail_lms-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: wagtail_lms-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 21.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for wagtail_lms-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 17942747b2b05512192c2da355e415f327c64de2de24f8f8e992dcad6b01da7c
MD5 baaf43c81a48617d95fa191fd5e4b5df
BLAKE2b-256 67db3e29f1dfac2b1ef1c2f3f00a71f95c628a053732624638ee9ae3d20ce563

See more details on using hashes here.

Provenance

The following attestation bundles were made for wagtail_lms-0.4.0-py3-none-any.whl:

Publisher: publish.yml on dr-rompecabezas/wagtail-lms

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page