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.1.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.1-py3-none-any.whl (21.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: wagtail_lms-0.4.1.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.1.tar.gz
Algorithm Hash digest
SHA256 0a71db7296378ce6fb9d5c8d466cd7413e84dfa3cc935f6cdfb93cd33a57a04b
MD5 9ab7b3b2d58642f7ada5761fa1364aa5
BLAKE2b-256 f24fc94493cb8de602515ca3a15e870686eb132b45b0b332345e265e5b6086ef

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: wagtail_lms-0.4.1-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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 be8b7f15f331f51924a143390fa2c7a8b2ea5c4c730a33d9832d4824c992bf5e
MD5 ab9c67d0251c8871aa1df1270daf56c7
BLAKE2b-256 0eaee923a44cf4a93da5b5d086be59fc4d3d23322b987a4719dcc61d60419445

See more details on using hashes here.

Provenance

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