Commit Graph

67594 Commits

Author SHA1 Message Date
Farhaan Bukhsh
810ea305ca chore: Adds sandbox requirements to ulmo
Signed-off-by: Farhaan Bukhsh <farhaan@opencraft.com>
2025-11-06 19:31:09 +05:30
edX requirements bot
baa948135d chore: Upgrade Python requirements (#37608) 2025-11-05 16:34:37 +00:00
Navin Karkera
f2f0d87e9e fix: mark container as ready to sync if any child block is deleted
Before this fix, if only a component is deleted, then its parent blocks
were not marked as ready to sync.
2025-11-05 10:36:44 +05:30
Peter Pinch
bbd53a0399 Merge pull request #37569 from mitodl/arslan/fix-validation-api
fix: validation API for certificates
2025-11-03 09:22:26 -05:00
Arslan Ashraf
4df43229bc Merge branch 'master' into arslan/fix-validation-api 2025-11-03 14:03:22 +05:00
salmannawaz
7f0375b6b9 Remove branding related code from video xblock. (#37491)
* chore: remove branding related code from video_block class as it is stop being used, we have plan to remove the specialized VIDEO_CDN_URL in the next phase as after removing URL nothing will reference the branding code so we're removing it first.
2025-11-01 09:22:45 +05:00
Serhiii Nanai
7cd4170ca7 feat: [FC-0092] Optimize Course Info Blocks API (#37122)
The Course Info Blocks API endpoint has been known to be rather slow
to return the response. Previous investigation showed that the major
time sink was the get_course_blocks function, which is called three
times in a single request. This commit aims to improve the response
times by reducing the number of times that this function is called.

Solution Summary

The first time the function get_course_blocks is called, the result
(transformed course blocks) is stored in the current WSGI request
object. Later in the same request, before the second get_course_blocks
call is triggered, the already transformed course blocks are taken
from the request object, and if they are available, get_course_blocks
is not called (if not, it is called as a fallback). Later in the
request, the function is called again as before (see Optimization
Strategy and Difficulties).

Optimization Strategy and Difficulties

The original idea was to fetch and transform the course blocks once
and reuse them in all three cases, which would reduce get_course_blocks
call count to 1. However, this did not turn out to be a viable solution
because of the arguments passed to get_course_blocks. Notably, the
allow_start_dates_in_future boolean flag affects the behavior of
StartDateTransformer, which is a filtering transformer modifying the
block structure returned.

The first two times allow_start_dates_in_future is False, the third
time it is True. Setting it to True in all three cases would mean that
some blocks would be incorrectly included in the response.

This left us with one option - optimize the first two calls. The
difference between the first two calls is the non-filtering
transformers, however the second call applies a subset of transformers
from the first call, so it was safe to apply the superset of
transformers in both cases. This allowed to reduce the number of
function calls to 2. However, the cached structure may be further
mutated by filters downstream, which means we need to cache a copy of
the course structure (not the structure itself). The copy method itself
is quite heavy (it calls deepcopy three times), making the benefits of
this solution much less tangible. In fact, another potential
optimization that was considered was to reuse the collected block
structure (pre-transformation), but since calling copy on a collected
structure proved to be more time-consuming than calling get_collected,
this change was discarded, considering that the goal is to improve
performance.

Revised Solution

To achieve a more tangible performance improvement, it was decided to
modify the previous strategy as follows:

* Pass a for_blocks_view parameter to the get_blocks function to make
  sure the new caching logic only affects the blocks view.
* Collect and cache course blocks with future dates included.
* Include start key in requested fields.
* Reuse the cached blocks in the third call, which is in
  get_course_assignments
* Before returning the response, filter out any blocks with a future
  start date, and also remove the start key if it was not in requested
  fields
2025-10-30 17:23:49 -04:00
Tobias Macey
2179109bc2 Merge branch 'master' into arslan/fix-validation-api 2025-10-30 14:20:33 -04:00
Kyle McCormick
ec1d9593d9 fix: Document modulestore_migrator API and remove extra endpoints (#37565)
The OpenAPI docs (at /api-docs) for the modulestore_migrator app were missing
some info, had duplicated info, and had some incorrect info. This brings them
up to a state where they're accurate and should have all the info needed for
someone to integrate with the API. For example:

* We move the viewset class docstrings, which have the info needed for someone
  to POST correctly, into the actual POST handler method docstring. That way,
  they show up under that POST API endpoint rather than the GET API endpoint.
* We fix the target keys to be v2 keys instead of v1 keys.  We add detail on
  all the different migration options and why a user would want to specify
  them.
* We fix the docs for `parameters` field to explain that they are always
  a _list_ of parameter objects, even for non-bulk migration tasks.

This also removes confusing & unnecessary endpoints:

* POST /api/modulestore_migrator/v1/bulk_migration/cancel
* DELETE /api/modulestore_migrator/v1/migrations/<uuid>

Finally, it sorts this endpoint to be newest-first:

* POST /api/modulestore_migrator/v1/migrations

Fixes: https://github.com/openedx/edx-platform/issues/37566
2025-10-30 15:06:46 +00:00
Feanil Patel
d76bed4bbb style: Drop unused imports. (#37572)
* style: Drop unused imports.

I was looking at these files for some other reason and saw that these
imports were unused. Some of it looks like an artifact of the hoisting
of some settings up to the `openedx/env/common.py` file and others look
like some ancient unused imports.


Co-authored-by: Kyle McCormick <kyle@axim.org>
2025-10-30 10:55:38 -04:00
Navin Karkera
72dac75710 fix: lgeacy library block child.save fails in production instance while migrating (#37573)
The child.save() call while migrating legacy library block to library version 2 fails with `InvalidScopeError` due to presence of `LmsFieldData` in` _bound_field_data` field. Removing this call does not seem to have any adverse affect.
2025-10-30 14:53:55 +00:00
Maria Grimaldi (Majo)
e68e39d957 chore: bump openedx-authz version to avoid app not installed exception (#37577) 2025-10-30 15:04:28 +01:00
Michael Roytman
1c44ca034e Merge pull request #37571 from edx/michaelroytman/COSMO2-729-exam-due-dates-self-paced
fix: incorrect LTI exam due dates for self-paced courses
2025-10-30 08:55:45 -04:00
Arslan Ashraf
b9d6a8c788 test: add test 2025-10-30 16:26:07 +05:00
edX requirements bot
48e8688e8e chore: Upgrade Python requirements (#37575) 2025-10-30 16:21:42 +05:00
Navin Karkera
2db3183958 feat: replace is_modified with downstream_customized field in upstream entity api and models (#37563)
This helps the caller to differentiate between the kind of local edits the downstream has and use it accordingly.
2025-10-29 22:22:01 +00:00
Braden MacDonald
4690913a04 feat: remove "experimental" param from reindex_studio (#37546) 2025-10-29 13:52:06 -07:00
Michael Roytman
2c82f230c9 fix: incorrect LTI exam due dates for self-paced courses
These changes fix a bug in how LTI-based exam due dates are computed and written to the exams service. Prior to this change, an LTI exam due date was computed irrespective of the course pacing type. In certain cases, this caused incorrect due dates to be written to the exams service for LTI-based exams.

For example, if a course team initially develops a course as an instructor-paced course and sets a due date on an exam subsection, that subsection due date is written to the modulestore. If the course team subsequently changes that course pacing type to self-paced, then that due date remains in the modulestore to allow course teams to switch pacing types without erasing due dates. The impact of this is that, when the course is published, the exam subsection due date is written to the exams service as the due date, even though there are no static due dates in a self-paced course. Frequently, these due dates are in the past (e.g. for course reruns), so learners automatically cannot access exams. Even if the due date is manually corrected in the exams service, every course publish reverts the due date to the incorrect due date.

This change computes the due date of LTI-based exams as...
* the exam subsection due date if the course is instructor-paced, if the subsection has a due date; else None
* the course end date if the course is self-paced, if the course has an end date; else None

In order to correct any incorrect due dates, course teams should republish their courses.
2025-10-29 16:43:07 -04:00
Kyle McCormick
b033b337a2 docs: Fix types in OldModuleStoreRuntime comments
Just a small find+replace mistake from 
834cb9482d
2025-10-29 15:49:29 -04:00
Kyle McCormick
834cb9482d refactor: rename ModuleStore runtimes now that XModules are gone (#35523)
* Consolidates and renames the runtime used as a base for all the others:
  * Before: `xmodule.x_module:DescriptorSystem` and
            `xmodule.mako_block:MakoDescriptorSystem`.
  * After:  `xmodule.x_module:ModuleStoreRuntime`.

* Co-locates and renames the runtimes for importing course OLX:
  * Before: `xmodule.x_module:XMLParsingSystem` and
            `xmodule.modulestore.xml:ImportSystem`.
  * After:  `xmodule.modulestore.xml:XMLParsingModuleStoreRuntime` and
            `xmodule.modulestore.xml:XMLImportingModuleStoreRuntime`.
  * Note: I would have liked to consolidate these, but it would have
          involved nontrivial test refactoring.

* Renames the stub Old Mongo runtime:
  * Before: `xmodule.modulestore.mongo.base:CachingDescriptorSystem`.
  * After: `xmodule.modulestore.mongo.base:OldModuleStoreRuntime`.

* Renames the Split Mongo runtime, the which is what runs courses in LMS and CMS:
  * Before: `xmodule.modulestore.split_mongo.caching_descriptor_system:CachingDescriptorSystem`.
  * After: `xmodule.modulestore.split_mongo.runtime:SplitModuleStoreRuntime`.

* Renames some of the dummy runtimes used only in unit tests.
2025-10-29 15:46:07 -04:00
Maria Grimaldi (Majo)
31b1e6ecc4 [FC-0099] feat: assign library roles after successful library creation (#37532) 2025-10-29 20:29:02 +01:00
Nathan Sprenkle
6b0af90664 feat: add a default audio codec for the HLS video player (#37525)
This seems to reduce instances of audio garbling when switching levels during HLS video streaming.
2025-10-29 15:24:33 -04:00
Ahtisham Shahid
dc7db1d3ad feat: unpinned social-auth-core (#37550)
* feat: unpinned social-auth-core

feat: unpinned social-auth-core

* fix: updated to resolve failing tests

* fix: resolved linter errors and failing tests

* fix: updated get_attr signature according to new version
2025-10-29 13:16:34 -04:00
Peter Kulko
2a473cffd3 feat: Prevent empty wrapper divs for about sections with no content (#37551) 2025-10-29 10:52:21 -04:00
Arslan Ashraf
3602540bb3 fix: validation API for certificates 2025-10-29 14:13:44 +05:00
Tarun Tak
18d5abb2f6 chore: Replace pytz with zoneinfo for UTC handling - Part 1 (#37523)
First PR to replace pytz with zoneinfo for UTC handling across codebase.

This PR migrates all UTC timezone handling from pytz to Python’s standard
library zoneinfo. The pytz library is now deprecated, and its documentation
recommends using zoneinfo for all new code. This update modernizes our
codebase, removes legacy pytz usage, and ensures compatibility with
current best practices for timezone management in Python 3.9+. No functional
changes to timezone logic - just a direct replacement for UTC handling.

https://github.com/openedx/edx-platform/issues/33980
2025-10-28 16:23:22 -04:00
Daniel Wong
6deb4f8d05 fix: add to search index when creating library from archive (#37526)
Implement full re-index process when creating a library.
2025-10-27 17:53:07 -04:00
Navin Karkera
8aaae4604a fix: index and entity link sync issues on parent block deletion (#37541)
Meilisearch index documents were not synced properly when any block with children blocks like units, subsections, sections etc. were being deleted as the `XBLOCK_DELETED` is only triggered for the deleted block.
This PR fixes it by deleting all index documents that contain the deleted block in its `breadcrumbs` field as only blocks that are children of this block will have it its breadcrumbs field.

Similarly, the entity links that store links between course and library blocks was not synced properly due to children `ContainerLinks` not being deleted.
2025-10-27 13:44:36 -05:00
Deborah Kaplan
121fee3035 feat: display the reset toggles for a report (#37556)
One retirement partner status report admin toggle has  being renamed,
and another has been added. This PR displays them on the appropriate
django admin page.
2025-10-27 17:25:38 +00:00
Taimoor Ahmed
a4c70d7f37 chore: bump forum version to 0.3.8 (#37555)
Co-authored-by: Taimoor  Ahmed <taimoor.ahmed@A006-01711.local>
2025-10-27 18:16:52 +05:00
Krish Tyagi
b86e203249 fix: Improve SAML configuration checks and update warning messages (#37377)
- Removes custom attributes for report. Uses report output only.
- Adds a count for disabled SAML configs.
- Displays disabled status of provider.
- Slug mismatch now informational only (rather than warning)
* Cleans up unit tests.
2025-10-25 00:43:35 +00:00
Deborah Kaplan
3dc96a97e9 feat: allows a reversion of the retirement partner report reset toggle (#37539)
* feat: allows a reversion of the  retirement partner report reset toggle

This allows you to set retirement partner report statuses to True as well as to False. One sample use case: if an overly large number of retirement partner reports have their status reset to false, the partner report queue can struggle to deal with the large queue.

FIXES: APER-4177
2025-10-24 17:07:40 +00:00
Muhammad Faraz Maqsood
8f7e8e3a8b fix: pasting a component with image isn't working (#37529)
- when copying a component that has image in it, and we try to paste it. Image URL
appends  `static_None`. Result in crash or image not found error.
- In this commit we have fixed this scenario, copy paste is working for components
containing images.

---------

Co-authored-by: Muhammad Faraz  Maqsood <faraz.maqsood@A006-01130.local>
2025-10-24 11:12:45 -04:00
Muhammad Farhan Khan
6dc868831c Adds aximprovements team to the code owners of xmodule (#37531)
* chore: add aximprovements team to CODEOWNERS for xmodule

The Aximprovements team is working on extracting all built-in XBlocks
to the external repository (xblocks-contrib). They need to be notified
about any changes within xmodule to stay aligned with this effort.

Ticket: https://github.com/openedx/edx-platform/issues/34827
2025-10-24 09:52:23 -04:00
Muhammad Sameer Amin
74782f4763 Merge pull request #37543 from openedx/sameeramin/upgrade-enterprise-integrated-channels-81fc0bd
feat: Upgrade Python dependency enterprise-integrated-channels
2025-10-24 17:42:57 +05:00
sameeramin
4427150790 feat: Upgrade Python dependency enterprise-integrated-channels
Commit generated by workflow `openedx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master`
2025-10-24 12:05:02 +00:00
Feanil Patel
81fc0bd85c Merge pull request #37535 from openedx/feanil/xblocks_with_children_rendering_fix
fix: Adding components to xblocks with children.
2025-10-23 16:20:08 -04:00
Feanil Patel
3c5cc6fffd fix: Adding components to xblocks with children.
Previously the container JS would remove the `add-xblock-component` for
every component that was in an iframe that was not the split test
component.  We're changing the logic to say that we should not render
the old buttons on pages where the authoring view provides an
alternative set of buttons.  Which in this case is just the
unit/vertical page.  All other containers should render the old buttons
since the new authoring MFE does not provide them.
2025-10-23 15:57:01 -04:00
Taimoor Ahmed
86d9b08b5d feat: remove last cs_comments service references (#37503)
This commit removes all remaining references to cs_comments_service
except the ForumsConfig model. The only purpose of keeping the model
and table around is so that the webapp processes don't start throwing
errors during deployment because they're running the old code for a
few minutes after the database migration has run. We can drop
ForumsConfig and add the drop-table migration after Ulmo is cut.

Also bumps the openedx-forum version to 0.3.7

---------

Co-authored-by: Taimoor  Ahmed <taimoor.ahmed@A006-01711.local>
2025-10-23 10:48:39 -04:00
Feanil Patel
604a87c417 Merge pull request #37527 from openedx/repo-tools/upgrade-python-requirements-067ca72
chore: Upgrade Python requirements
2025-10-23 08:15:43 -04:00
Sameen Fatima
3a97ff2d5e fix: do not autogenerate username if coming through SSO (#37522)
Co-authored-by: Sameen Fatima <sameen.fatima@A006-01036.local>
2025-10-23 14:47:14 +05:00
edX requirements bot
d6e1eabb9c chore: Upgrade Python requirements 2025-10-23 04:05:35 -04:00
Tarun Tak
067ca72ed0 fix: remove unused waffle switch for optimizing learner retrieval (#37513) 2025-10-22 19:53:07 -04:00
Tarun Tak
f05fb639c8 feat: remove unused USE_ENCRYPTED_USER_DATA (#37305) 2025-10-22 19:41:59 -04:00
Chris Chávez
89d3491fef fix: Unfinished migration on fail in one legacy library [FC-0107] (#37521)
- Fix the issue described in https://github.com/openedx/frontend-app-authoring/issues/2169#issuecomment-3412840187
- Adds `is_failed` field to migrations.
- Adds the logic of partial migration: If the import of a library fails, then mark it as failed and continue with the next library.
2025-10-22 17:07:03 -05:00
Chris Chávez
774f3b37cf fix: Issue when migrating legacy libraries with large keys (#37520)
The length of `purpose` in `StagedContent` is 64. The previous code used the legacy content key. So if the library had a very long key, an error occurred. The new code uses the `pk` instead of the `key`
2025-10-22 15:42:17 -05:00
Muhammad Anas
4afff6ef5c feat: shift progress calculation to backend, add never_but_include_grade (#37399)
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
2025-10-22 10:15:42 -04:00
Taylor Payne
bf8ffe4cf7 feat: add library restore endpoint (#37439)
Adds a library restore endpoint to restore a learning package from a
backup zip archive (/api/libraries/v2/restore/). The learning package
can then be used to create a content library.
2025-10-22 08:30:18 -04:00
Feanil Patel
5d01a40936 Merge pull request #37511 from openedx/repo-tools/upgrade-python-requirements-900706b
chore: Upgrade Python requirements
2025-10-21 14:08:58 -04:00
Feanil Patel
b55c44a81a Merge pull request #37510 from openedx/feanil/fix_branding_redirect_loop
feanil/fix branding redirect loop
2025-10-21 13:27:48 -04:00