67959 Commits

Author SHA1 Message Date
Bryann Valderrama
de2c47c1c3 chore: deprecate legacy content library permissions and APIs. 2026-03-02 08:54:51 -05:00
Bryann Valderrama
d05f39c9a8 refactor: remove ContentLibraryPermissionInline from admin interface 2026-03-02 08:54:51 -05:00
Bryann Valderrama
efb3a57d79 chore: deprecate content library authorization rest apis and models 2026-03-02 08:54:51 -05:00
Felipe Bermúdez-Mendoza
b367336d60 feat: make ACCOUNT_MICROFRONTEND_URL site aware. 2026-03-02 08:18:12 -05:00
Rômulo Penido
85e81b32e4 feat: add full screen modal option to base_modal (#38001)
Adds a "Fullscreen" button to the iframe editors for advanced XBlocks
2026-02-27 16:12:04 +00:00
Fox Piacenti
e1757ebd1e feat!: Bump xblocks-contrib to install PDF block by default (#38055)
BREAKING CHANGE: The `pdf` XBlock is now built into the platform core and
installed by default. If you previously installed a third-party pdf
implementation such as https://github.com/open-craft/xblock-pdf, then the
built-in implementation will likely work as a drop-in replacement, so you can
uninstall the third-party implementation. However, if you’d rather continue
using a third-party pdf implementation, then use the `xblock.v1.overrides`
entrypoint. In either case, the third-party implementation must be removed from
the `xblock.v1` entrypoint, otherwise you will see an AmbiguousPluginError.

Co-Authored-By: Kyle McCormick <kyle@axim.org>
2026-02-26 18:14:33 -05:00
Feanil Patel
cd7f2aeee1 fix: use correct Django settings for each service in CI
The static-assets-check workflow was setting DJANGO_SETTINGS_MODULE=lms.envs.production
globally, but then running both LMS and CMS collectstatic. Because manage.py doesn't
override DJANGO_SETTINGS_MODULE when it's already set (and --settings isn't passed),
CMS was running with LMS settings instead of CMS settings.

This meant CMS-specific RequireJS builds (cms/static/cms/js/build.js) were never being
tested, allowing issues like missing modules to slip through to sandbox deployments.

Fix by setting DJANGO_SETTINGS_MODULE explicitly for each service.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 15:59:57 -05:00
Feanil Patel
7c9f468d56 refactor: Drop the unused legacy video upload page.
The legacy video uploads page in Studio has been replaced with a new
view in the Authoring MFE.  The legacy page has not been available for
some time, so it's all dead code. This PR removes it.

Please note that there's a waffle flag which enables the MFE version
of the video uploads page: `contentstore.new_studio_mfe.use_new_video_uploads_page`.
Unlike the other Studio MFE waffles, we're NOT going to remove this one now,
because the video uploads page has always been broken for sites other
than edx.org (or sites that have reverse-engineered their video pipeline) so
we'd like to keep the flag until it's either fixed for the community or
removed (https://github.com/openedx/openedx-platform/issues/37972).

This work is part of https://github.com/openedx/edx-platform/issues/36108

Co-Authored-By: Kyle McCormick <kyle@axim.org>
2026-02-26 15:59:57 -05:00
github-actions[bot]
0a9f7898c6 feat: Upgrade Python dependency enterprise-integrated-channels (#38053)
Commit generated by workflow `openedx/openedx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master`

Co-authored-by: kiram15 <31229189+kiram15@users.noreply.github.com>
2026-02-26 10:23:35 -07:00
Muhammad Anas
b968eed88b feat: add optional API for hiding the dates tab (#37923) 2026-02-25 16:27:49 -08:00
github-actions[bot]
d9293afde4 chore: Upgrade Python dependency edx-enterprise (#38051)
Commit generated by workflow `openedx/openedx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master`

Co-authored-by: bcitro <67378070+bcitro@users.noreply.github.com>
2026-02-25 16:22:28 -05:00
Braden MacDonald
12e9af4f5c fix!: split modulestore's has_course(ignore_case=True) was not working (#38044)
BREAKING CHANGE: this forces course IDs in modulestore to be unique (case insensitive). This was always supposed to be the case, but it wasn't working properly on MySQL. Upgrading past this commit may cause a migration failure if you have conflicting course IDs - see the migration 0004 docstring for details.
2026-02-25 09:05:15 -08:00
Braden MacDonald
3e522d5272 feat: bump opaque-keys to get case-sensitivity support + default max_length (#38044)
refactor: remove some 'max_length=255' to be more DRY

feat: example of making an OpaqueKeyField case_sensitive (modulestore_migrator)

test: update test now that we're using case-insensitive collation on SQLite
2026-02-25 09:05:15 -08:00
Troy Sankey
ef783a1bca chore: bump edx-enterprise-integrated-channels to 0.1.42 (#38049)
ENT-11542
2026-02-24 20:45:57 -07:00
github-actions[bot]
7aa28fc73d feat: Upgrade Python dependency lti-consumer-xblock (#38048)
Commit generated by workflow `openedx/openedx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master`

Co-authored-by: navinkarkera <10894099+navinkarkera@users.noreply.github.com>
2026-02-24 16:25:30 +00:00
Peter Pinch
7d162c37c8 Merge pull request #37748 from asajjad2/areeb/last-publish-grade-calc-update
fix: calculate last_grade_publish_date for all unreleased subsections
2026-02-24 10:27:06 -05:00
asajjad2
616c966de7 fix: calculate last_grade_publish_date for all unreleased subsections
fix: don't update business logic

fix: comparison condition

fix: linting errors

fix: linting error

test: progress api test

test: add not-null scenario

fix: linting errors

test: fix assertion

refactor: tests
2026-02-24 18:52:14 +05:00
Muhammad Farhan Khan
ee3551538c test: Move VideoConfigService related tests near inside its app (#38008) 2026-02-24 12:18:27 +05:00
David Ormsbee
873f42ab14 refactor: update openedx_content contents -> media(#38037)
Update our calls to the openedx_content API to reflect 0.35.0's shift
in terminology from "contents" to "media".

---------

Co-authored-by: Kyle McCormick <kyle@axim.org>
2026-02-23 22:34:33 -05:00
Kyle D McCormick
e5ebde83f2 build: Loosen openedx-core constraint to allow patch upgrades 2026-02-20 20:02:59 -05:00
Kyle D McCormick
f4ce78db51 fix: Upgrade openedx-core to fix LanguageTaxonomy data bug 2026-02-20 20:02:59 -05:00
Taylor Payne
7499a5f1e6 feat: authorize advanced settings endpoints via openedx-authz when fl… (#38009) 2026-02-19 12:03:11 -07:00
brianjbuck-wgu
8b3c3fd52f feat: Simplify content groups v2 response JSON (#37976) 2026-02-19 10:43:14 -07:00
Irtaza Akram
76018183d4 Use runtime-provided XQueueService instead of constructing it in ProblemBlock (#37998)
* fix: move xqueue services
2026-02-19 11:02:00 +05:00
Kyle McCormick
c70bfe980a build!: Switch to openedx-core (renamed from openedx-learning) (#38011)
build!: Switch to openedx-core (renamed from openedx-learning)

Instead of installing openedx-learning==0.32.0, we install openedx-core==0.34.1.
We update various class names, function names, docstrings, and comments to
represent the rename:

* We say "openedx-core" when referring to the whole repo or PyPI project
  * or occasionally "Open edX Core" if we want it to look nice in the docs.
* We say "openedx_content" to refer to the Content API within openedx-core,
   which is actually the thing we have been calling "Learning Core" all along.
  * In snake-case code, it's `*_openedx_content_*`.
  * In camel-case code, it's `*OpenedXContent*`

For consistency's sake we avoid anything else like oex_core, OeXCore,
OpenEdXCore, OexContent, openedx-content, OpenEdxContent, etc.
There should be no more references to learning_core, learning-core, Learning Core,
Learning-Core, LC, openedx-learning, openedx_learning, etc.

BREAKING CHANGE: for openedx-learning/openedx-core developers:
You may need to uninstall openedx-learning and re-install openedx-core
from your venv. If running tutor, you may need to un-mount openedx-learning,
rename the directory to openedx-core, re-mount it, and re-build.
The code APIs themselves are fully backwards-compatible.

Part of: https://github.com/openedx/openedx-core/issues/470
2026-02-18 22:38:25 +00:00
Chris Chávez
5e75d3cce4 feat: Make selectable component cards (#38010)
- Styles to make component cards selectable.
- Action to select a component and send a message to the parent of the iframe
- Handler for a "deselect all" message and for selecting a specific component
2026-02-18 20:34:35 +00:00
brianjbuck-wgu
43690553f6 fix: Add group_id and user_partition_id support to Cohorts API v1 (#37982) 2026-02-17 15:09:51 -07:00
wgu-jesse-stewart
b98e41e339 feat: add v2 REST API endpoints for instructor dashboard data downloads (#37984) 2026-02-17 12:40:21 -07:00
Muhammad Farhan Khan
8dd99defac chore: optimize/correct the VideoBlock code (#38012)
- Change the `i18n` service declaration from `wants` to `needs`, since the
  runtime must provide it for the block to function correctly.

- Update the `public_view` webpack JS reference from `VideoBlockMain` to
  `VideoBlockDisplay`, as all VideoBlock JS files are bundled into
  `VideoBlockDisplay` and `VideoBlockMain` is not referring to anything
   or no longer exists in the repository.
2026-02-17 21:28:46 +05:00
Kyle McCormick
a55c1ddabf chore: Switch to new openedx-learning import paths (#38004)
Upgrades openedx-learning from 0.31.0 to 0.32.0,
incorporating a major openedx-learning Python API
restructuring: ca0b3eb
2026-02-13 20:39:05 +00:00
Muhammad Qasim Gulzar
d847d222b2 fix: migrations to make postgresql compatible. (#35762)
This commit introduces several improvements to database migration
scripts to enhance compatibility between MySQL and PostgreSQL, ensure
case-sensitive behavior where needed, and improve migration safety and
correctness. The changes include dynamic SQL generation based on the
database engine, improved transaction handling, and adjustments to
field types and adapters for better cross-database support.

Database compatibility and case sensitivity improvements:

- Migration scripts in split_modulestore_django and learning_sequences
  now dynamically generate SQL statements for altering column case
  sensitivity and uniqueness based on whether the database is MySQL or
  PostgreSQL, ensuring correct behavior across both backends.
  - common/djangoapps/split_modulestore_django/migrations/0001_initial.py
  - openedx/core/djangoapps/content/learning_sequences/migrations/0001_initial.py

- The courseware.fields module now checks for "postgresql" in the
  database engine string instead of a specific backend name, improving
  compatibility with different PostgreSQL drivers.
  - lms/djangoapps/courseware/fields.py

- The 0011_csm_id_bigint migration in courseware now supports both MySQL
  and PostgreSQL for altering column types, with specific SQL for each
  backend.
  - lms/djangoapps/courseware/migrations/0011_csm_id_bigint.py

- The 0009_readd_facebook_url migration in course_overviews now
  introspects the table structure using backend-specific SQL for MySQL
  and PostgreSQL, ensuring correct detection of existing fields.
  - openedx/core/djangoapps/content/course_overviews/migrations/0009_readd_facebook_url.py

Migration safety and correctness:

- Service user creation and deletion in the commerce app is now wrapped
  in atomic transactions to ensure database consistency.
  - lms/djangoapps/commerce/migrations/0001_data__add_ecommerce_service_user.py

- The move_overrides_to_edx_when migration in courseware now specifies
  a no-op reverse migration, preventing accidental data loss on migration
  rollback.
  - lms/djangoapps/courseware/migrations/0008_move_idde_to_edx_when.py

Adapter registration and code cleanup:

- The common_initialization app now registers custom adapters for
  CourseLocator and related classes in psycopg2 when using PostgreSQL,
  ensuring proper serialization of these types.
  - openedx/core/djangoapps/common_initialization/apps.py

- Minor code cleanup and formatting improvements in migration files,
  including import order and field formatting for readability.
  - lms/djangoapps/grades/migrations/0015_historicalpersistentsubsectiongradeoverride.py
2026-02-12 14:02:46 -05:00
Chris Chávez
ef8b03b07c fix: Typo in unsupported reason message in content libraries [FC-0114] (#38005)
- Fix a simple typo in an unsupported reason message for blocks with children in content libraries
2026-02-12 12:18:20 -05:00
salmannawaz
d20b87b180 Discussion service to enable permission and access provider (#37912)
* chore: discussion service to enable permission and access provider
2026-02-11 19:37:16 +05:00
Rodrigo Mendez
24468b6bf5 feat: Add enable_authz_course_authoring flag to course_waffle_flags endpoint (#37990) 2026-02-10 13:50:05 -07:00
Navin Karkera
8ca70db552 refactor: xblock api upstream info and course details api (#37971)
- Returns top parent key instead of boolean in upstream info api
- Adds edited_on raw time in course outline api
- Adds has_changes to course details api
2026-02-09 23:09:06 +00:00
Chris Chávez
3c4cf0e2d2 fix: Nits on styles of library icon [FC-0114] (#37980)
- Fixes the issues described in https://github.com/openedx/frontend-app-authoring/issues/2762#issuecomment-3837508959:
    - Changed the background color for the library icon in the unit page.
    - Update punctuation for the library icon tooltip in the unit page.
    - Allows breaking the tooltip into multiple lines.
2026-02-09 22:10:38 +00:00
Kyle McCormick
d0a2212a48 build: Upgrade to ora2==6.17.2 which removes loremipsum base dep (#37991)
We hope this will fix an error where loremipsum is using pkg_resources,
which setuptools dropped support for as of v82 (released yesterday).
2026-02-09 15:51:26 -05:00
Rodrigo Mendez
c338f090b0 feat: Add Waffle flag for AuthZ for Course Authoring (#37985) 2026-02-09 09:06:01 -07:00
Brian Smith
fd15557435 refactor: remove deprecated sidebar toggles (#37983)
DEPR ticket: https://github.com/openedx/public-engineering/issues/316
2026-02-09 09:32:17 -05:00
KEVYN SUAREZ
fd644d4bf6 fix: Ensure problem response reports include all descendant problems regardless of nesting or randomization (#36677)
This PR ensures that the instructor "Problem Responses" report in Open edX includes all student responses to all problems under any selected block, including those that are nested or randomized (such as those from legacy library_content blocks). Previously, the report could miss responses to problems that were not directly visible to the instructor or admin user generating the report, especially in courses using randomized content blocks or deep nesting.

In courses that use randomized content (e.g., legacy library_content blocks) or have deeply nested structures, the instructor dashboard’s problem response report was incomplete. It only included responses to problems visible in the block tree for the user generating the report (typically the admin or instructor). As a result, responses to problems served randomly to students, or problems nested in containers, were omitted from the CSV export. This led to inaccurate reporting and made it difficult for instructors to audit all student answers.
2026-02-05 11:16:56 -05:00
github-actions[bot]
a0359a5833 feat: Upgrade Python dependency edx-enterprise (#37977)
* feat: Upgrade Python dependency edx-enterprise

Commit generated by workflow `openedx/openedx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master`

* fix: typo fix to trigger tests

---------

Co-authored-by: kiram15 <31229189+kiram15@users.noreply.github.com>
2026-02-05 08:40:58 -07:00
Troy Sankey
7936e3dc47 Merge pull request #37979 from openedx/pwnage101/ENT-11229
chore: upgrade enterprise-integrated-channels to 0.1.38
2026-02-04 16:41:22 -08:00
Troy Sankey
e78223f091 chore: upgrade enterprise-integrated-channels to 0.1.38
Also bump SQL queries by +2 for the test_read_and_update() unit test
which triggers new synchronous signal handlers on grade change. See
https://github.com/openedx/enterprise-integrated-channels/pull/109

ENT-11229
2026-02-04 16:01:42 -08:00
David Ormsbee
9bf7a72a3a refactor: switch to use openedx_content app (#37924)
The openedx-learning repo was recently refactored to consolidate its
authoring apps into a single openedx_content app:

  https://github.com/openedx/openedx-platform/pull/37924

This commit makes the following changes to accommodate this:

- Bumps the openedx-learning version to 0.31.0 to get the changes.
- Creates new migrations in content_libraries, contentstore, and
  modulestore_migrator to foreign key references to authoring apps
  to point to the new openedx_content app. This is done without
  actually making database changes, since the openedx_content app
  models are taking over the existing tables that the authoring apps
  once pointed to.
- Creates new squashed migrations in these apps that create these
  foreign keys to reference openedx_content app models from the start.

The full rationale for how and why this was done is in the following
openedx-learning ADR:

  https://github.com/openedx/openedx-learning/blob/main/docs/decisions/0020-merge-authoring-apps-into-openedx-content.rst

These migrations should run fine from either a from-scratch scenario
(i.e. a new install or CI), or when upgrading from an Ulmo-or-later
database state. If you have a database state that comes from the middle
of the Ulmo development cycle (e.g. October 2025), you may encounter
migration errors in content_libraries, contentstore, or
modulestore_migrator, with an error message complaining about missing
tables. If you receive this message, run the following command:

  python manage.py lms migrate openedx_content 0001

Then try to run the migrations for the app that failed. Repeat if
necessary for multiple apps.
2026-02-04 12:41:13 -05:00
github-actions[bot]
b6904be3a4 feat: Upgrade Python dependency Django (#37974)
Required upgrade of Django.

Commit generated by workflow `openedx/openedx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master`
2026-02-03 17:35:33 +00:00
Feanil Patel
18113c63af test: update Jest snapshots for @edx/paragon 2.6.4 → 2.7.0
The caret version pinning change updated @edx/paragon from 2.6.4 to
2.7.0, which caused Icon component IDs to change from "Icon2" to
"Icon1" in snapshot tests.

This is a cosmetic change with no functional impact. The Icon
component generates unique IDs using a module-level counter in
src/utils/newId.js:

    let lastId = 0;
    const newId = (prefix = 'id') => {
      lastId += 1;
      return `${prefix}${lastId}`;
    };

The ID values depend on module import order, which changed slightly
between versions. The visual rendering and accessibility features
(screen reader text) are unaffected.

References:
- Paragon Icon component: https://github.com/edx/paragon/blob/v2.7.0/src/Icon/index.jsx
- Paragon newId utility: https://github.com/edx/paragon/blob/v2.7.0/src/utils/newId.js
- Version comparison: https://github.com/edx/paragon/compare/v2.6.4...v2.7.0

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 11:54:05 -05:00
Feanil Patel
ae7a1c857a build(deps): switch to caret version pinning for npm dependencies
Change package.json to use caret (^) pinning for flexible version
resolution. Packages >=1.0.0 pin to major version, packages <1.0.0
pin to minor version.

The following packages remain exact-pinned due to compatibility issues:

- redux (3.7.2) and redux-thunk (2.2.0): Newer versions of redux-thunk
  (2.3+) require redux@^4 as a peer dependency. Since the codebase uses
  redux 3.x, allowing redux-thunk to upgrade would cause peer dependency
  conflicts and potential runtime issues.

- @edx/frontend-component-cookie-policy-banner (2.2.0): Newer versions
  (2.6.0+) depend on @openedx/paragon@21.x which requires PNG file loaders
  and uses SCSS files incompatible with the current webpack/sass-loader
  configuration.

- bootstrap (4.0.0): Newer versions (4.6.x) use a `deprecate` mixin in
  their SCSS that the current sass compilation setup doesn't support.

- jasmine-core@2.6.4: Newer 2.x versions (2.99+) enforce stricter
  afterEach placement rules that break edx-ui-toolkit's ajax-helpers.js

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 11:54:05 -05:00
M. Tayyab Tahir Qureshi
bcddf9cd53 refactor: enable extracted LTI block (#37833) 2026-02-02 14:05:50 +05:00
Akanshu Aich
50da280144 fix: handle CourseOverview.DoesNotExist exception in optout creation (#77) (#37885)
User retirement failed when CourseOverview records were missing, causing CourseOverview.DoesNotExist exceptions
in bulk email signal handler. These records were missing when the course was deleted.

Solution:

Add exception handling in force_optout_all signal handler:
- Wrapped Optout.objects.get_or_create() in try/except block
- Log warning and skip enrollment when CourseOverview is missing.
2026-01-30 19:08:37 +00:00
Brian Buck
c9704c28ee feat: Add Content Groups API v2 endpoints for Instructor Dashboard
- Add GET /api/instructor/v2/courses/{course_id}/group_configurations
- Add GET /api/instructor/v2/courses/{course_id}/group_configurations/{id}
- Create shared constants module for course groups
2026-01-30 11:58:51 -05:00