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. That said, it is actively used in production at thinkelearn.com.

Supported versions:

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

Selected 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

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

# Cache-Control rules for SCORM assets (exact MIME, wildcard, and default)
WAGTAIL_LMS_CACHE_CONTROL = {
    "text/html": "no-cache",
    "text/css": "max-age=86400",
    "application/javascript": "max-age=86400",
    "text/javascript": "max-age=86400",
    "image/*": "max-age=604800",
    "font/*": "max-age=604800",
    "default": "max-age=86400",
}

# Redirect audio/video assets to storage URLs (useful for S3 backends)
WAGTAIL_LMS_REDIRECT_MEDIA = 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

An example project is available in example_project/ for local development and testing. See its README for setup instructions.

Running Tests

The project includes a comprehensive test suite. See current 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.8.1.tar.gz (18.5 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.8.1-py3-none-any.whl (24.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: wagtail_lms-0.8.1.tar.gz
  • Upload date:
  • Size: 18.5 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.8.1.tar.gz
Algorithm Hash digest
SHA256 426074a8bb6a1501ec3e45f906a64dace3abfc1a982986d4ce54312914507d18
MD5 01401179ad0cf832d712623ff3a94590
BLAKE2b-256 6341c17548b6f1011bd7343ca79f2433e6f6ba683f1ce1e08bbaed1f934bb6e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for wagtail_lms-0.8.1.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.8.1-py3-none-any.whl.

File metadata

  • Download URL: wagtail_lms-0.8.1-py3-none-any.whl
  • Upload date:
  • Size: 24.7 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.8.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7b0da9327e0d455d0ec47cab0efa1d4ae38916c230e21cb6d17d06f26b57ee1d
MD5 253feaebe3ba8fa218bc957f6cc48e95
BLAKE2b-256 2f3e02f3fe28a725468b453a576dad059c367904a3c75c35f8a5bb557a56ae38

See more details on using hashes here.

Provenance

The following attestation bundles were made for wagtail_lms-0.8.1-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