Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
fd644d4
fix: Ensure problem response reports include all descendant problems …
efortish Feb 5, 2026
fd15557
refactor: remove deprecated sidebar toggles (#37983)
brian-smith-tcril Feb 9, 2026
c338f09
feat: Add Waffle flag for AuthZ for Course Authoring (#37985)
rodmgwgu Feb 9, 2026
d0a2212
build: Upgrade to `ora2==6.17.2` which removes loremipsum base dep (#…
kdmccormick Feb 9, 2026
3c4cf0e
fix: Nits on styles of library icon [FC-0114] (#37980)
ChrisChV Feb 9, 2026
8ca70db
refactor: xblock api upstream info and course details api (#37971)
navinkarkera Feb 9, 2026
24468b6
feat: Add enable_authz_course_authoring flag to course_waffle_flags e…
rodmgwgu Feb 10, 2026
d20b87b
Discussion service to enable permission and access provider (#37912)
salman2013 Feb 11, 2026
ef8b03b
fix: Typo in unsupported reason message in content libraries [FC-0114…
ChrisChV Feb 12, 2026
d847d22
fix: migrations to make postgresql compatible. (#35762)
qasimgulzar Feb 12, 2026
a55c1dd
chore: Switch to new openedx-learning import paths (#38004)
kdmccormick Feb 13, 2026
8dd99de
chore: optimize/correct the VideoBlock code (#38012)
farhan Feb 17, 2026
b98e41e
feat: add v2 REST API endpoints for instructor dashboard data downlo…
wgu-jesse-stewart Feb 17, 2026
4369055
fix: Add group_id and user_partition_id support to Cohorts API v1 (#3…
brianjbuck-wgu Feb 17, 2026
5e75d3c
feat: Make selectable component cards (#38010)
ChrisChV Feb 18, 2026
c70bfe9
build!: Switch to openedx-core (renamed from openedx-learning) (#38011)
kdmccormick Feb 18, 2026
7601818
Use runtime-provided XQueueService instead of constructing it in Prob…
irtazaakram Feb 19, 2026
8b3c3fd
feat: Simplify content groups v2 response JSON (#37976)
brianjbuck-wgu Feb 19, 2026
7499a5f
feat: authorize advanced settings endpoints via openedx-authz when fl…
wgu-taylor-payne Feb 19, 2026
f4ce78d
fix: Upgrade openedx-core to fix LanguageTaxonomy data bug
kdmccormick Feb 20, 2026
e5ebde8
build: Loosen openedx-core constraint to allow patch upgrades
kdmccormick Feb 20, 2026
873f42a
refactor: update openedx_content contents -> media(#38037)
ormsbee Feb 24, 2026
ee35515
test: Move VideoConfigService related tests near inside its app (#38008)
farhan Feb 24, 2026
616c966
fix: calculate last_grade_publish_date for all unreleased subsections
asajjad2 Dec 11, 2025
7d162c3
Merge pull request #37748 from asajjad2/areeb/last-publish-grade-calc…
pdpinch Feb 24, 2026
7aa28fc
feat: Upgrade Python dependency lti-consumer-xblock (#38048)
github-actions[bot] Feb 24, 2026
ef783a1
chore: bump edx-enterprise-integrated-channels to 0.1.42 (#38049)
pwnage101 Feb 25, 2026
3e522d5
feat: bump opaque-keys to get case-sensitivity support + default max_…
bradenmacdonald Feb 23, 2026
12e9af4
fix!: split modulestore's has_course(ignore_case=True) was not workin…
bradenmacdonald Feb 19, 2026
d9293af
chore: Upgrade Python dependency edx-enterprise (#38051)
github-actions[bot] Feb 25, 2026
b968eed
feat: add optional API for hiding the dates tab (#37923)
Anas12091101 Feb 26, 2026
0a9f789
feat: Upgrade Python dependency enterprise-integrated-channels (#38053)
github-actions[bot] Feb 26, 2026
7c9f468
refactor: Drop the unused legacy video upload page.
feanil Oct 30, 2025
cd7f2ae
fix: use correct Django settings for each service in CI
feanil Feb 2, 2026
e1757eb
feat!: Bump xblocks-contrib to install PDF block by default (#38055)
Kelketek Feb 26, 2026
85e81b3
feat: add full screen modal option to base_modal (#38001)
rpenido Feb 27, 2026
b367336
feat: make ACCOUNT_MICROFRONTEND_URL site aware.
anfbermudezme Mar 2, 2026
efb3a57
chore: deprecate content library authorization rest apis and models
BryanttV Feb 25, 2026
d05f39c
refactor: remove ContentLibraryPermissionInline from admin interface
BryanttV Feb 25, 2026
de2c47c
chore: deprecate legacy content library permissions and APIs.
BryanttV Feb 25, 2026
71ecea9
chore: update deprecation warnings to include alternative methods and…
BryanttV Feb 27, 2026
7866c68
chore: geoip2: update maxmind geolite country database
feanil Mar 1, 2026
90eae7d
build(deps): bump actions/upload-artifact from 6 to 7
dependabot[bot] Mar 2, 2026
5e36a38
build(deps): bump actions/download-artifact from 7 to 8
dependabot[bot] Mar 2, 2026
2fcce12
feat: make marketing email and research opt-in checkboxs selectively …
iloveagent57 Feb 23, 2026
a31e256
refactor: Remove old unused stub asset script (#37967)
kdmccormick Mar 2, 2026
9c89a1b
build: Constrain astroid to fix make upgrade.
feanil Mar 2, 2026
35b5582
build: Explicitly add types-requests to development requirements.
feanil Mar 2, 2026
5cc1883
chore: Run `make upgrade`
feanil Mar 2, 2026
d30c730
feat: initialize pyproject.toml with build system
feanil Jan 20, 2026
642fa02
feat: migrate package metadata to pyproject.toml
feanil Jan 20, 2026
e548ba8
feat: migrate XBlock entry points to pyproject.toml
feanil Jan 20, 2026
5949f8d
feat: migrate XBlock Asides entry points to pyproject.toml
feanil Jan 20, 2026
2cdccb3
feat: migrate course tab entry points to pyproject.toml
feanil Jan 20, 2026
a325904
feat: migrate course app entry points to pyproject.toml
feanil Jan 20, 2026
2e01492
feat: migrate course tool entry points to pyproject.toml
feanil Jan 20, 2026
682bbc1
feat: migrate LMS Django app entry points to pyproject.toml
feanil Jan 20, 2026
0db5414
feat: migrate CMS Django app entry points to pyproject.toml
feanil Jan 20, 2026
cadeb0e
feat: migrate block transformer entry points to pyproject.toml
feanil Jan 20, 2026
af55bcf
feat: migrate remaining plugin entry points to pyproject.toml
feanil Jan 20, 2026
bbc12f1
feat: migrate pytest configuration to pyproject.toml
feanil Jan 20, 2026
b81a81c
feat: migrate import linter configuration to pyproject.toml
feanil Jan 20, 2026
98ec84a
feat: delete setup.py - migration complete
feanil Jan 20, 2026
8143796
docs: update references from setup.py to pyproject.toml
feanil Jan 26, 2026
4452109
fix: optimize enrollment counts to use read replica and show all conf…
brianjbuck-wgu Feb 12, 2026
15a252f
feat: The API now returns learner_count and staff_count alongside the…
brianjbuck-wgu Feb 19, 2026
ce3e8b2
feat: Upgrade Python dependency Django
feanil Mar 3, 2026
72c2bf6
chore(deps): update dependency underscore to v1.13.8 [security] (#38077)
renovate[bot] Mar 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/js-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ jobs:
npm run test

- name: Save Job Artifacts
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: Build-Artifacts
path: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/quality-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ jobs:

- name: Save Job Artifacts
if: always()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: Build-Artifacts
path: |
Expand Down
5 changes: 2 additions & 3 deletions .github/workflows/static-assets-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,6 @@ jobs:
env:
LMS_CFG: lms/envs/minimal.yml
CMS_CFG: lms/envs/minimal.yml
DJANGO_SETTINGS_MODULE: lms.envs.production
run: |
./manage.py lms collectstatic --noinput
./manage.py cms collectstatic --noinput
DJANGO_SETTINGS_MODULE=lms.envs.production ./manage.py lms collectstatic --noinput
DJANGO_SETTINGS_MODULE=cms.envs.production ./manage.py cms collectstatic --noinput
14 changes: 7 additions & 7 deletions .github/workflows/unit-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ jobs:

- name: save pytest warnings json file
if: success()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: pytest-warnings-json-${{ matrix.shard_name }}-${{ matrix.python-version }}-${{ matrix.django-version }}-${{ matrix.mongo-version }}-${{ matrix.os-version }}
path: |
Expand All @@ -143,7 +143,7 @@ jobs:
mv reports/.coverage reports/${{ matrix.shard_name }}_${{ matrix.python-version }}_${{ matrix.django-version }}_${{ matrix.mongo-version }}_${{ matrix.os-version }}.coverage

- name: Upload coverage
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: coverage-${{ matrix.shard_name }}-${{ matrix.python-version }}-${{ matrix.django-version }}-${{ matrix.mongo-version }}-${{ matrix.os-version }}
path: reports/${{ matrix.shard_name }}_${{ matrix.python-version }}_${{ matrix.django-version }}_${{ matrix.mongo-version }}_${{ matrix.os-version }}.coverage
Expand Down Expand Up @@ -230,7 +230,7 @@ jobs:
steps:
- uses: actions/checkout@v6
- name: collect pytest warnings files
uses: actions/download-artifact@v7
uses: actions/download-artifact@v8
with:
pattern: pytest-warnings-json-*
merge-multiple: true
Expand All @@ -245,7 +245,7 @@ jobs:

- name: save warning report
if: success()
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: pytest-warning-report-html
path: |
Expand All @@ -257,14 +257,14 @@ jobs:
needs: [compile-warnings-report]
steps:
- name: Merge Pytest Warnings JSON Artifacts
uses: actions/upload-artifact/merge@v6
uses: actions/upload-artifact/merge@v7
with:
name: pytest-warnings-json
pattern: pytest-warnings-json-*
delete-merged: true

- name: Merge Coverage Artifacts
uses: actions/upload-artifact/merge@v6
uses: actions/upload-artifact/merge@v7
with:
name: coverage
pattern: coverage-*
Expand All @@ -289,7 +289,7 @@ jobs:
python-version: ${{ matrix.python-version }}

- name: Download all artifacts
uses: actions/download-artifact@v7
uses: actions/download-artifact@v8
with:
pattern: coverage-*
merge-multiple: true
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ lms/envs/private.py
cms/envs/private.py
.venv/
CLAUDE.md
.claude/
AGENTS.md
# end-noclean

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import django.db.migrations.operations.special
import django.db.models.deletion
import opaque_keys.edx.django.models
import openedx_learning.lib.fields
import openedx_learning.lib.validators
import openedx_django_lib.fields
import openedx_django_lib.validators
import uuid
from django.conf import settings
from django.db import migrations, models
Expand Down Expand Up @@ -107,8 +107,8 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('context_key', opaque_keys.edx.django.models.CourseKeyField(help_text='Linking status for course context key', max_length=255, unique=True)),
('status', models.CharField(choices=[('pending', 'Pending'), ('processing', 'Processing'), ('failed', 'Failed'), ('completed', 'Completed')], help_text='Status of links in given learning context/course.', max_length=20)),
('created', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('created', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
],
options={
'verbose_name': 'Learning Context Links status',
Expand All @@ -121,13 +121,13 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='UUID')),
('upstream_usage_key', opaque_keys.edx.django.models.UsageKeyField(help_text='Upstream block usage key, this value cannot be null and useful to track upstream library blocks that do not exist yet', max_length=255)),
('upstream_context_key', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, db_index=True, help_text='Upstream context key i.e., learning_package/library key', max_length=500)),
('upstream_context_key', openedx_django_lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, db_index=True, help_text='Upstream context key i.e., learning_package/library key', max_length=500)),
('downstream_usage_key', opaque_keys.edx.django.models.UsageKeyField(max_length=255, unique=True)),
('downstream_context_key', opaque_keys.edx.django.models.CourseKeyField(db_index=True, max_length=255)),
('version_synced', models.IntegerField()),
('version_declined', models.IntegerField(blank=True, null=True)),
('created', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('created', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
('upstream_block', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='links', to='openedx_content.component')),
],
options={
Expand All @@ -140,13 +140,13 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='UUID')),
('upstream_context_key', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, db_index=True, help_text='Upstream context key i.e., learning_package/library key', max_length=500)),
('upstream_context_key', openedx_django_lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, db_index=True, help_text='Upstream context key i.e., learning_package/library key', max_length=500)),
('downstream_usage_key', opaque_keys.edx.django.models.UsageKeyField(max_length=255, unique=True)),
('downstream_context_key', opaque_keys.edx.django.models.CourseKeyField(db_index=True, max_length=255)),
('version_synced', models.IntegerField()),
('version_declined', models.IntegerField(blank=True, null=True)),
('created', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('created', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
('upstream_container_key', opaque_keys.edx.django.models.ContainerKeyField(help_text='Upstream block key (e.g. lct:...), this value cannot be null and is useful to track upstream library blocks that do not exist yet or were deleted.', max_length=255)),
('upstream_container', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='links', to='openedx_content.container')),
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

import django.db.models.deletion
import opaque_keys.edx.django.models
import openedx_learning.lib.fields
import openedx_learning.lib.validators
import openedx_django_lib.fields
import openedx_django_lib.validators
from django.db import migrations, models


Expand Down Expand Up @@ -39,8 +39,8 @@ class Migration(migrations.Migration):
max_length=20,
),
),
('created', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('created', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
],
options={
'verbose_name': 'Learning Context Links status',
Expand All @@ -61,7 +61,7 @@ class Migration(migrations.Migration):
),
(
'upstream_context_key',
openedx_learning.lib.fields.MultiCollationCharField(
openedx_django_lib.fields.MultiCollationCharField(
db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'},
db_index=True,
help_text='Upstream context key i.e., learning_package/library key',
Expand All @@ -72,8 +72,8 @@ class Migration(migrations.Migration):
('downstream_context_key', opaque_keys.edx.django.models.CourseKeyField(db_index=True, max_length=255)),
('version_synced', models.IntegerField()),
('version_declined', models.IntegerField(blank=True, null=True)),
('created', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('created', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
(
'upstream_block',
models.ForeignKey(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

import django.db.models.deletion
import opaque_keys.edx.django.models
import openedx_learning.lib.fields
import openedx_learning.lib.validators
import openedx_django_lib.fields
import openedx_django_lib.validators
from django.db import migrations, models


Expand Down Expand Up @@ -40,13 +40,13 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='UUID')),
('upstream_context_key', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, db_index=True, help_text='Upstream context key i.e., learning_package/library key', max_length=500)),
('upstream_context_key', openedx_django_lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, db_index=True, help_text='Upstream context key i.e., learning_package/library key', max_length=500)),
('downstream_usage_key', opaque_keys.edx.django.models.UsageKeyField(max_length=255, unique=True)),
('downstream_context_key', opaque_keys.edx.django.models.CourseKeyField(db_index=True, max_length=255)),
('version_synced', models.IntegerField()),
('version_declined', models.IntegerField(blank=True, null=True)),
('created', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
('created', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
('updated', models.DateTimeField(validators=[openedx_django_lib.validators.validate_utc_datetime])),
('upstream_container_key', opaque_keys.edx.django.models.ContainerKeyField(help_text='Upstream block key (e.g. lct:...), this value cannot be null and is useful to track upstream library blocks that do not exist yet or were deleted.', max_length=255)),
('upstream_container', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='links', to='oel_publishing.container')),
],
Expand Down
13 changes: 5 additions & 8 deletions cms/djangoapps/contentstore/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
from opaque_keys.edx.django.models import ContainerKeyField, CourseKeyField, UsageKeyField
from opaque_keys.edx.keys import CourseKey, UsageKey
from opaque_keys.edx.locator import LibraryContainerLocator
from openedx_learning.api.authoring import get_published_version
from openedx_learning.api.authoring_models import Component, Container
from openedx_learning.lib.fields import (
from openedx_content.api import get_published_version
from openedx_content.models_api import Component, Container
from openedx_django_lib.fields import (
immutable_uuid_field,
key_field,
manual_date_time_field,
Expand Down Expand Up @@ -97,9 +97,9 @@ class EntityLinkBase(models.Model):
)
# A downstream entity can only link to single upstream entity
# whereas an entity can be upstream for multiple downstream entities.
downstream_usage_key = UsageKeyField(max_length=255, unique=True)
downstream_usage_key = UsageKeyField(unique=True)
# Search by course/downstream key
downstream_context_key = CourseKeyField(max_length=255, db_index=True)
downstream_context_key = CourseKeyField(db_index=True)
# This is present if the creation of this link is a consequence of
# importing a container that has one or more levels of children.
# This represents the parent (container) in the top level
Expand Down Expand Up @@ -152,7 +152,6 @@ class ComponentLink(EntityLinkBase):
blank=True,
)
upstream_usage_key = UsageKeyField(
max_length=255,
help_text=_(
"Upstream block usage key, this value cannot be null"
" and useful to track upstream library blocks that do not exist yet"
Expand Down Expand Up @@ -324,7 +323,6 @@ class ContainerLink(EntityLinkBase):
blank=True,
)
upstream_container_key = ContainerKeyField(
max_length=255,
help_text=_(
"Upstream block key (e.g. lct:...), this value cannot be null "
"and is useful to track upstream library blocks that do not exist yet "
Expand Down Expand Up @@ -564,7 +562,6 @@ class LearningContextLinksStatus(models.Model):
course or a learning context.
"""
context_key = CourseKeyField(
max_length=255,
# Single entry for a learning context or course
unique=True,
help_text=_("Linking status for course context key"),
Expand Down
Loading