Skip to main content

OL Open edX UAI Content Customization

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 industries are managed in Django admin (Industry model, under OL Open edX UAI Content Customization), not hardcoded — add a row there to support a new industry without a code change. Each row has a name (as used in the industry CSV column) and a short_code used as the course-key suffix. The Original industry — meaning no industry-specific variant, only the duration suffix — is identified by a blank short_code; exactly one Industry row may have one. Length is always one of short/long (code S/F).

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 — must match the name of an Industry row configured in Django admin (case-insensitive), e.g. 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.5.1

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.5.1
File Size Uploaded
ol_openedx_uai_content_customization-0.5.1.tar.gz 15.1 kB Details

Built distribution (wheel)

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

Total release size: 36.3 kB

Release files / ol_openedx_uai_content_customization-0.5.1.tar.gz

Download URL ol_openedx_uai_content_customization-0.5.1.tar.gz
Size 15.1 kB
Tags Source
SHA-256 checksum
How to use checksums
e39f55179ccef01f6caf57171f7b6bc0e2935523c52fcdee1806a3bc01e09976
BLAKE2b-256 checksum
How to use checksums
bd3943f37255f0805300a3205df13ed6d060f74ab793fd0c159c20e6601042e5
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.5.1-py3-none-any.whl

Download URL ol_openedx_uai_content_customization-0.5.1-py3-none-any.whl
Size 21.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5e4b9fd18d1d1262b6b13ddbc98cd18f59481fb9d55acf360bf04d48ab250af9
BLAKE2b-256 checksum
How to use checksums
9a73d59ccf6af2eff08d327f63715199117f82fb695b97d3d563e1419cb83f15
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

This release

0.5.1 This release

2 release files

0.5.0

2 release files

0.4.0

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