Skip to main content

An Open edX plugin to generate industry/length-specific UAI custom courses from video CSV data.

Project description

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.

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

  • durationshort 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 generate_uai_course_versions \
    --processed-videos-csv /path/to/processed_videos.csv \
    [--username studio_worker] \
    [--dry-run]

Options

--processed-videos-csv

Path to the processed video metadata CSV file. 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

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

ol_openedx_uai_content_customization-0.2.0.tar.gz (11.6 kB view details)

Uploaded Source

Built Distribution

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

File details

Details for the file ol_openedx_uai_content_customization-0.2.0.tar.gz.

File metadata

File hashes

Hashes for ol_openedx_uai_content_customization-0.2.0.tar.gz
Algorithm Hash digest
SHA256 1f88fcb811f614ea7da24c118b1889831453139bf49b2e2a9318ab8398150be1
MD5 623fadf94cd7a6f437357aa441dd9285
BLAKE2b-256 5782bc5cf8c5aab9a7503e59c5089fc19902f73d6910f7f0dddc96d0bb312d04

See more details on using hashes here.

File details

Details for the file ol_openedx_uai_content_customization-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for ol_openedx_uai_content_customization-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9ba5e92b688983e8b0e4639461503c5a0be577b2c5d1d56439cdd3cad37284a2
MD5 78aedcb5053c45b93b1d83c1d898e961
BLAKE2b-256 266bc60d7b1de6abfca7f36c0c11b275f672ccd1332a2b14295a79c0d6215e44

See more details on using hashes here.

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