Skip to main content

An Open edX CMS plugin that automates the generation of industry- and length-specific UAI course variants using direct Open edX modulestore APIs.

Version Compatibility

Supports Open edX releases from Sumac and onwards.

For this plugin’s compatibility with Open edX, see the Open edX Release Compatibility table.

Installing The Plugin

For detailed installation instructions, please refer to the plugin installation guide.

Installation required in:

  • CMS

Overview

For each unique (course_key, industry, duration) row group in the CSV the command clones the source course into a new UAI-specific key, removes every existing section from the clone, and rebuilds the content from the CSV data. This produces multiple industry- and length-specific variants per source course while preserving all course settings (grading policy, certificates, pacing, advanced settings) from the original.

Supported industry/length combinations:

Industry

Code

Length code

Length

Healthcare

HC

S

Short

Healthcare

HC

F

Full

Finance

F

S

Short

Finance

F

F

Full

Energy

E

S

Short

Energy

E

F

Full

Original

—

S

Short

Original

—

F

Full

Course Key Format

course-v1:ORG+NUMBER.<DURATION>[.<INDUSTRY>]+RUN

For the Original industry, no industry code is appended:

course-v1:UAI_SOURCE+UAI.3.S+1T2026   ← Original, Short
course-v1:UAI_SOURCE+UAI.3.F+1T2026   ← Original, Full
course-v1:UAI_SOURCE+UAI.3.S.HC+1T2026 ← Healthcare, Short

Course Structure

Each generated course has the following structure:

Course (<display name>)
├── Introduction  (section, optional)
    └── Introduction  (subsection)
        └── Introduction  (unit)
            └── Introduction  (HTML block)
└── Lectures  (section)
    └── <Video Title>  (subsection)
        └── <Video Title>  (unit)
            └── <Video Title>  (video block with edX video ID)

Usage

Prerequisites

You will need a single CSV file:

Processed videos CSV — produced by the video customization workflow. Required columns:

  • course_key — the Open edX course key of the source course to clone (e.g. course-v1:UAI_SOURCE+UAI.2+1T2026). This course must already exist in the CMS modulestore before the command runs. The command validates all source keys up-front and aborts with an error if any are missing.

  • industry — one of: Healthcare, Finance, Energy, Original

  • duration — short or long

  • video_file_name — file name of the video (for reference/display)

  • video_title — display name for the subsection/unit/video

  • module_name — used to build the course display name

  • edx_video_id — the Open edX UUID for the video (exported from Studio / OVS after uploading the customized video)

  • course_intro — optional introduction content for the generated course. If this value contains HTML tags, it is used as-is. If it is plain text, the command HTML-escapes it and wraps it in <p>...</p>.

    Intro resolution precedence for each generated (course_key, industry, duration) variant:

    1. exact match on (course_key, industry, duration)

    2. fallback to (course_key, industry) (industry-only intro, reused for both short and long)

    3. fallback to (course_key, Original industry) (reused across all industries and durations for that source course)

    If no intro is resolved, no Introduction section is created for that variant.

Running the Command

Run the management command from inside the CMS container (e.g. Tutor dev shell):

python manage.py cms generate_uai_course_versions \
    --processed-videos-csv /path/to/processed_videos.csv \
    [--username studio_worker] \
    [--dry-run]

--processed-videos-csv also accepts the URL of a publicly readable Google Sheet, so you can point the command directly at the sheet instead of downloading a CSV first:

python manage.py cms generate_uai_course_versions \
    --processed-videos-csv "https://docs.google.com/spreadsheets/d/<SHEET_ID>/edit#gid=0" \
    [--username studio_worker] \
    [--dry-run]

The sheet must be shared as “Anyone with the link can view” (or published to the web). Any standard docs.google.com share/edit link works — the command derives the CSV export link automatically, using the gid from the URL to select the right tab. Only docs.google.com Sheets links are accepted; any other http(s) URL is rejected with an error.

Options

--processed-videos-csv

Path to the processed video metadata CSV file, or the URL of a publicly readable Google Sheet (docs.google.com share/edit or export link — no other URL is accepted). Required.

--username

Username of the platform user under whose authority the courses are created. Defaults to studio_worker.

--dry-run

Print what would be created without writing anything to the modulestore. Use this to verify CSV mapping before committing.

How It Works

For each unique (course_key, industry, duration) group the command:

  1. Validates all source course keys against the live modulestore before making any writes (fail-fast — aborts if any source is missing).

  2. Clones the source course into the new UAI-specific key, inheriting all course settings.

  3. Deletes every existing section (chapter) from the clone.

  4. Rebuilds the content tree from the CSV rows:

    Course  (cloned — settings inherited)
    ├── Introduction  (optional, created only when ``course_intro`` resolves)
        └── Introduction  (subsection)
            └── Introduction  (unit)
                └── Introduction  (HTML block)
    └── Lectures  (section)
        └── <Video Title>  (subsection)
            └── <Video Title>  (unit)
                └── <Video Title>  (video block)
  5. Publishes the course.

Development

# Install dependencies
uv sync --dev

# Run tests (requires Open edX environment — see AGENTS.md)
./run_edx_integration_tests.sh --plugin ol_openedx_uai_content_customization --skip-build

Metadata

Release files for ol-openedx-uai-content-customization 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ol-openedx-uai-content-customization 0.4.0
File Size Uploaded
ol_openedx_uai_content_customization-0.4.0.tar.gz 13.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ol-openedx-uai-content-customization 0.4.0
File Interpreter ABI Platform
ol_openedx_uai_content_customization-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 31.1 kB

Release files / ol_openedx_uai_content_customization-0.4.0.tar.gz

Download URL ol_openedx_uai_content_customization-0.4.0.tar.gz
Size 13.1 kB
Tags Source
SHA-256 checksum
How to use checksums
13751d20c9c0816508390b8619369da0c5bf3c0e45818b0dc3a7904b64050677
BLAKE2b-256 checksum
How to use checksums
5816a38b286f2bc51c502d52fcb8192e67c57e1c2d7c7a412b853fcbb8d45737
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release files / ol_openedx_uai_content_customization-0.4.0-py3-none-any.whl

Download URL ol_openedx_uai_content_customization-0.4.0-py3-none-any.whl
Size 18.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8aaafdf2a82554883a899732c4804e1a877484bcba379974125b0ff52d03315c
BLAKE2b-256 checksum
How to use checksums
fb67ad645cbc04733acb7fbc52cb1ca9d4b99059832c22668d896d93751a2f14
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.7

Release history Release notifications | RSS feed

0.5.1

2 release files

0.5.0

2 release files

This release

0.4.0 This release

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page