Skip to content

test: PR checks for ulmo.1 branch#295

Open
viv-helix wants to merge 450 commits into
test/av-masterfrom
test/av-ulmo.1-testing
Open

test: PR checks for ulmo.1 branch#295
viv-helix wants to merge 450 commits into
test/av-masterfrom
test/av-ulmo.1-testing

Conversation

@viv-helix
Copy link
Copy Markdown
Member

Description

Describe what this pull request changes, and why. Include implications for people using this change.
Design decisions and their rationales should be documented in the repo (docstring / ADR), per
OEP-19, and can be
linked here.

Useful information to include:

  • Which edX user roles will this change impact? Common user roles are "Learner", "Course Author",
    "Developer", and "Operator".
  • Include screenshots for changes to the UI (ideally, both "before" and "after" screenshots, if applicable).
  • Provide links to the description of corresponding configuration changes. Remember to correctly annotate these
    changes.

Supporting information

Link to other information about the change, such as Jira issues, GitHub issues, or Discourse discussions.
Be sure to check they are publicly readable, or if not, repeat the information here.

Testing instructions

Please provide detailed step-by-step instructions for testing this change.

Deadline

"None" if there's no rush, or provide a specific date or event (and reason) if there is one.

Other information

Include anything else that will help reviewers and consumers understand the change.

  • Does this change depend on other changes elsewhere?
  • Any special concerns or limitations? For example: deprecations, migrations, security, or accessibility.
  • If your database migration can't be rolled back easily.

viv-helix and others added 30 commits December 19, 2025 22:12
* feat: add games to beta component types

* feat: auto-open editor on block creation

---------

Co-authored-by: pganesh-apphelix <pganesh-apphelix@2U.com>
Re-compilation and upgrade-package should be able to run without
updating the common_constraints.txt file.  We do this all the time when
backporting fixes to older releases.  We shouldn't pull in the latest
common_constraints.txt in those cases as they may not be compatible with
older releases.
…t_backport

build: Don't update common_constraints.txt on re-compilation.
…7796)

For legacy library_content references in courses, this PR:
- **Removes the spurious sync after updating a reference to a migrated
  library**, so that users don't need to "update" their content _after_
  updating their reference, _unless_ there were real content edits that
  happened since they last synced. We do this by correctly associating a
  DraftChangeLogRecord with the ModulestoreBlockSource migration artifact,
  and then comparing that version information before offering a sync.
  (related issue:
  openedx/frontend-app-authoring#2626).
- **Prompts users to update a reference to a migrated library with higher
  priority than prompting them to sync legacy content updates for that
  reference**, so that users don't end up needing to accept legacy content
  updates in order to get a to a point where they can update to V2 content.
- **Ensures the library references in courses always follow the correct
  migration,** as defined by the data `forwarded` fields in the data model,
  which are populated based on the REST API spec and the stated product UI
  requirements.

For the migration itself, this PR:
- **Allows non-admins to migrate libraries**, fixing:
  openedx#37774
- **When triggered via the UI, ensures the migration uses nice title-based
  target slugs instead of ugly source-hash-based slugs.** We've had this as an
  option for a long time, but preserve_url_slugs defaulted to True instead of
  False in the REST API serializer, so we weren't taking advantage of it.
- **Unifies logic between single-source and bulk migration**. These were
  implement as two separate code paths, with drift in their implementations. In
  particular, the collection update-vs-create-new logic was completely
  different for single-souce vs. bulk.
- **When using the Skip or Update strategies for repeats, it consistently
  follows mappings established by the latest successful migration** rather than
  following mappings across arbitrary previous migrations.
- **We log unexpected exceptions more often**, although there is so much more
  room for improvement here.
- **Adds more validation to the REST API** so that client mistakes more often
  become 400s with validation messages rather than 500s.

For developers, this PR:
- Adds unit tests to the REST API
- Ensures that all migration business logic now goes through a general-purpose
  Python API.
- Ensures that the data model (specifically `forwarded`, and
  `change_log_record`) is now populated and respected.
- Adds more type annotations.

Backports: 91e521e
Backport note: Compared to the original commit, this backport commit
excludes the REST APIs which were not defined at the time of the
Ulmo cutoff:
* /api/v1/modulestore_migrator/libraries
* /api/v1/modulestore_migrator/migration_info
* /api/v1/modulestore_migrator/migration_blocks
This is to fix an issue in the following common migration situation:

1. An existing course references content in a legacy content library.
2. The legacy content library is migrated to the new library system.
3. The user clicks on "Update reference" from the Randomized Content
   Block in the course.

This action is supposed to update the children of the
LibraryContentBlock (usually ProblemBlocks) so that the "upstream"
attribute is set to point at the UsageKeys of the content in the new
libraries they were migrated to. What was happening instead was that the
upstream entries for these child blocks were left blank, breaking the
upstream/sync connection and making it so that the courses did not
receive any updates from the migrated libraries.

There were two issues:

1. get_forwarding_for_blocks() was being called with the child UsageKeys
   in the course, when it should have been called with the v1 library
   usage keys instead (since those are the things being forwarded).
2. We were checking that the target_key was a v2 Library key, but really
   the upstream target_key is supposed to be a LibraryUsageLocatorV2,
   i.e. the key of the specific piece of content, not the library it
   ended up in.

Note on testing:

Although there were unit tests for the migration of legacy content
libraries, there were not any unit tests for the migration of legacy
library *blocks*.

This commit adds a minimal test, which would have caught the bug we're
fixing. It would be good to add more comprehensive testing unit testing
for this part of the migration flow.

---------

Co-authored-by: Kyle McCormick <kyle@axim.org>
Implements soft delete functionality for discussion threads, responses, and comments using the is_deleted flag instead of permanently deleting records.
This enables safe deletion and restoration of discussion content while preserving existing data.
This commit migrates the data calculation logic for the GradeSummary
table, which was previously in the frontend-app-learning.

This commit also introduces a new visibility option for assignment
scores: “Never show individual assessment results, but show overall
assessment results after the due date.”

With this option, learners cannot see question-level correctness or
scores at any time. However, once the due date has passed, they can
view their overall score in the total grades section on the Progress
page.

These two changes are coupled with each other because it compromises
the integrity of this data to do the score hiding logic on the front
end.

The corresponding frontend PR is: openedx/frontend-app-learning#1797

Co-authored-by: Muhammad Anas <88967643+Anas12091101@users.noreply.github.com>
* fix: improve beta label contrast in gamesxblock

* fix: address copilot comment

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
There is a singleton SplitMongoModuleStore instance that is returned
whenever we call the ubiquitous modulestore() function (wrapped in a
MixedModuleStore). During initialization, SplitMongoModuleStore sets
up a small handful of XBlock runtime services that are intended to be
shared globally: i18n, fs, cache.

When we get an individual block back from the store using get_item(),
SplitMongoModuleStore creates a SplitModuleStoreRuntime using
SplitMongoModuleStore.create_runtime(). These runtimes are intended to
be modified on a per-item, and later per-user basis (using
prepare_runtime_for_user()).

Prior to this commit, the create_runtime() method was assigning the
globally shared SplitMongoModuleStore.services dict directly to the
newly instantiated SplitModuleStoreRuntime. This meant that even though
each block had its own _services dict, they were all in fact pointing
to the same underlying object. This exposed us to a risk of multiple
threads contaminating each other's SplitModuleStoreRuntime services
when deployed under load in multithreaded mode. We believe this led to
a race condition that caused student submissions to be mis-scored in
some cases.

This commit makes a copy of the SplitMongoModuleStore.services dict for
each SplitModuleStoreRuntime. The baseline global services are still
shared, but other per-item and per-user services are now better
isolated from each other.

This commit also includes a small modification to the PartitionService,
which up until this point had relied on the (incorrect) shared instance
behavior. The details are provided in the comments in the
PartitionService __init__().

It's worth noting that the historical rationale for having a singleton
ModuleStore instance is that the ModuleStore used to be extremely
expensive to initialize. This was because at one point, the init
process required reading entire XML-based courses into memory, or
pre-computing complex field inheritance caches. This is no longer the
case, and SplitMongoModuleStore initialization is in the 1-2 ms range,
with most of that being for PyMongo's connection setup. We should try
to fully remove the global singleton in the Verawood release cycle in
order to make this kind of bug less likely.
Commit generated by workflow `edx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/release-ulmo`
* feat: add new API to retrieve all components in a unit

* feat: add waffle flag to enable unit expanded view

* fix: test cases
…97a2a0

feat: Upgrade Python dependency edx-enterprise
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix: restrict PDF rendering to relative paths

* fix: enhance PDF viewer security by removing file param and communicating via postMessage

* fix: remove HTML escaping from chapter URLs and titles in PDF viewer

* fix: refactor PDF viewer integration for improved chapter navigation and security

* fix: enhance security in StaticPdfBookTest by removing file parameter exposure

* fix: secure PDF viewer iframe by removing unnecessary file parameter

* fix: add newline at end of static_pdfbook.html for proper file termination

---------

Co-authored-by: papphelix <ppatro-apphelix@2u.com>
chore: updated version of enterprise-integrated-channels
Implements soft delete functionality for discussion threads, responses, and comments using the is_deleted flag instead of permanently deleting records.
This enables safe deletion and restoration of discussion content while preserving existing data.
This commit updates the logic in the build_block_structure function to
ensure that block locations are consistently normalized by removing
branch and version information. This change addresses issues when
creating a BlockStructure from modulestore using the published_only
branch. Without this change, we end up comparing versioned keys to
unversioned ones later on, which always yields False.
Co-authored-by: papphelix <ppatro-apphelix@2u.com>
…store (#85)

* fix: use target user enrollment for org-level bulk delete and bulk restore
Upgrade snowflake connector version

Commit generated by workflow `edx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/release-ulmo`
…tegrated-channels-b3b7258

feat: Upgrade Python dependency enterprise-integrated-channels
Added permission for privileged users to restore deleted content .
pwnage101 and others added 30 commits April 14, 2026 15:15
Other steps taken too:

- Add ADR and URL routes comment for migrated SAML admin views to
  help ensure people don't inadvertantly register conflicting URL routes.
- Remove validate_uuid4_string, convert_saml_slug_provider_id, and
  fetch_metadata_xml from third_party_auth/utils.py (migrated to
  edx-enterprise)
- Remove test_convert_saml_slug_provider_id test and import
- Add TestCreateOrUpdateBulkSAMLProviderData test class with 4 tests
  covering create, update, bulk_update, and multiple keys paths
- Remove unused imports: logging, requests, uuid.UUID

ENT-11567

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: centralize authn MFE branding and remove duplicate context

* fix: add authn MFE branding helper tests and remove dead imports
* feat: add audio description upload & playback backend

* fix: audio description upload flow in devstack

* refactor: extract LMS-safe audio description download URL helper

* feat: gate audio description upload with contentstore waffle flag

* feat: add audio description functionality to video player

* fix: refactor for audio description

* fix: refactor code

* refactor: rename audio description upload toggle to audio description

* feat: enhance audio description synchronization and playback handling

* fix: update audio description handlers and imports for consistency

---------

Co-authored-by: Aditya Bhalsod <abhalsod-sonata@2u.com>
feat: remove SAML provider admin views from openedx-platform
hotfix for broken SAML views

Commit generated by workflow `edx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/release-ulmo`
…fd38

feat: Upgrade Python dependency edx-enterprise
feat: add phase 1 Datadog instrumentation for thread creation
Introduce _UpstreamKeyString class to handle XML serialization.
feat: integrated channels 0.1.57

Commit generated by workflow `edx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/release-ulmo`
…rumentation

feat: add forum telemetry for thread update and delete
…mentation

feat: add forum telemetry for thread vote and unvote
* feat: add audio description upload & playback backend

* fix: audio description upload flow in devstack

* refactor: extract LMS-safe audio description download URL helper

* feat: gate audio description upload with contentstore waffle flag

* feat: add audio description functionality to video player

* fix: refactor for audio description

* fix: refactor code

* refactor: rename audio description upload toggle to audio description

* feat: enhance audio description synchronization and playback handling

* fix: update audio description handlers and imports for consistency

---------

Co-authored-by: Devasia Joseph <djoseph-apphelix@2u.com>
…grated-channels-358748b

feat: Upgrade Python dependency enterprise-integrated-channels
…tion

feat: add forum telemetry for comment create update and delete
…umentation

feat: add forum telemetry for comment vote and unvote
…port (#207)

* feat: add SES routing for account activation emails with fallback support

* refactor: simplify SES routing and fallback logic per review feedback
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.