Skip to content

Comparing changes between upstream-maple and wikimedia's develop branch. - #582

Draft
ahmed-arb wants to merge 6658 commits into
upstream-maplefrom
develop
Draft

Comparing changes between upstream-maple and wikimedia's develop branch.#582
ahmed-arb wants to merge 6658 commits into
upstream-maplefrom
develop

Conversation

@ahmed-arb

Copy link
Copy Markdown
Collaborator

Comparing changes

navinkarkera and others added 30 commits March 12, 2025 17:56
Refactors downstream links API to handle multiple filters using a single API. Also adds a new route to return summary of library links for a given course.
version bump

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

feat: Upgrade Python dependency edx-enterprise
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
fix ECU table backfill command to also backfill historical table.

Commit generated by workflow `openedx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master`
fix ECU table backfill command.

Commit generated by workflow `openedx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master`
…x#36378)

If a course is deleted or unpublished, the CourseEnrollment list serializer was causing a AttributeErrors when called for a learner who had been enrolled in the formerly-existing course.

Why no test? Because cache invalidation is the worst problem. tl;dr I could create a mock response for the `course_overview` property, but if I mocked up a response to the queryset filter in `CourseEnrollmentsApiListView`, I was effectively guessing that my code worked correctly and then creating a mock response that was an assertion of correctness. That would make any mocked test deceptive; it would appear to test behavior but it would actually just test that I had constructed a mock that passed the test.

I wanted to make an actual test for what would happen if a Course was deleted, so I made one character code fix, and then spent two days unsuccessfully attempting to completely clear out the ModuleStore so I could actually test what would happen in this instance.

IMO an actual verification by hand (which I performed, and it works) was the better part of valor.

in short, cache invalidation aaaaaaaaargh.

FIXES: APER-3913
chore: upgrade optimizely-sdk to the latest version

Commit generated by workflow `openedx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master`
Merge pull request openedx#36387 from openedx/iamsobanjaved/upgrade-optimizely-sdk-0c7846c
)

* feat: add country disabling feature in embargo app

* revert: disabled countries list in env

* fix: resolved linter issues

---------

Co-authored-by: Hassan Raza <h.raza@192.168.1.12>
…ss, fix types [FC-0083] (openedx#36381)

* refactor: convert libraries API from attr.s to dataclass, fix types
* fix: make corresponding updates to 'search' code
…l to 2MB (openedx#36397)

Co-authored-by: M Umar Khan <umar.khan@A006-01609.local>
Commit generated by workflow `openedx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master`

Co-authored-by: kiram15 <31229189+kiram15@users.noreply.github.com>
Adds group_uuid field to enterprise group membership api payload.

Commit generated by workflow `openedx/edx-platform/.github/workflows/upgrade-one-python-dependency.yml@refs/heads/master`
…x#36395)

Specifically to bump the versions for edx-sga and lti-consumer-xblock
…dx-enterprise-d1415bd

feat: Upgrade Python dependency edx-enterprise
* feat: add country disabling feature in embargo app

* revert: disabled countries list in env

* fix: resolved linter issues

---------

Co-authored-by: Hassan Raza <h.raza@192.168.1.12>
fix all endpoints that were currently breaking with the discussion xblock.

Co-authored-by: Taimoor  Ahmed <taimoor.ahmed@A006-01434.local>
Co-authored-by: Taimoor  Ahmed <taimoor.ahmed@A006-01434.local>
eemaanamir and others added 24 commits October 24, 2025 14:31
…ls (#565)

* feat: added patches + updated model for bulk email skip/failure details

* chore: remove unneeded workflows
* feat: update intructor dashboard reports and permissions

* refactor: simplified changes and moved to django plugin app

* refactor: removed scss from edx-platform and moved to theme
Asset filenames with non-ASCII characters were progressively corrupted in
rendered unit HTML, e.g. an image named "Día.jpg" would render with a src of
...block@D%252525C3%252525ADa.jpg and fail to load.

StaticContent.get_canonicalized_asset_path encodes the asset path with
quote_plus, which does not treat '%' as a safe character. Studio re-runs this
function over its own output on every load/save cycle (get_block_info ->
replace_static_urls), so each cycle re-encodes the existing percent signs:
the 'í' in "Día" (UTF-8 %C3%AD) degrades into %25C3%25AD, then %2525C3%2525AD,
and so on, leaving broken <img> links.

Fully percent-decode the path before re-encoding so canonicalization is
idempotent: an already-canonicalized path now resolves to the same asset and
produces the same single-encoded output. Decoding before the asset lookup also
lets locked/digest/CDN handling find the real file instead of a key that still
contains literal '%' characters. unquote (not unquote_plus) is used so the '+'
separators in opaque asset keys are preserved.

Add a management command, repair_asset_url_encoding, to heal content already
stored corrupted: it scans the data-bearing blocks of one or more courses,
fully decodes over-encoded static/asset URLs, and rewrites course-owned
absolute asset links back to the portable /static/<filename> form. It is a dry
run unless --commit is passed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The repair command only handled multiply percent-encoded links, where the
non-ASCII bytes survive and can be decoded. A second corruption exists where the
non-ASCII character was dropped entirely (e.g. "climática" -> "climtica"), so the
link points at a filename that does not exist while the real asset still carries
the accent. Those references contain no information to decode, so the first pass
correctly left them alone -- and broken.

Add an asset-matching pass: for each course, build an index of the real asset
filenames from the contentstore and, when a decoded reference does not exist,
repoint it at the asset whose name with non-ASCII characters removed equals the
broken reference (the deterministic inverse of the corruption). Matches must be
unique; ambiguous or unmatched references are reported as WARN lines and left
untouched for manual review.

repair_text now returns (new_data, replacements, warnings) and normalize_asset_url
returns (new_url, status). Tests cover ascii_fold, AssetIndex.resolve (ok /
matched / ambiguous / unmatched) and the repoint-and-warn behaviour.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ackport

fix: Backported openedx#36820 to fix discussion threads
…-encoding

fix: make static asset URL canonicalization idempotent
…ctor-Certification-Generation-CSV

Fix: Instructor Issued Certificates, report links and columns in csv
The previous version returned early for courses whose topics were already
correctly linked ("healthy"), so it never seeded ForumUser records or
recomputed stats for them. Those courses were left with an empty Learners tab
(and could still 404 on the stats endpoint if any stat-bearing user lacked a
ForumUser). Only courses that happened to have orphaned topics got the user
seeding and stats recompute.

Drop the early return so that every course with threads seeds ForumUser
records for its enrolled users and recomputes per-course stats, regardless of
whether any topics needed reconnecting. Courses with no threads still return
early. Report status as "stats-refreshed" (or "would-refresh-stats" in
dry-run) when no topic changes were needed.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Syed-Ali-Abbas-568 and others added 5 commits July 31, 2026 15:21
fix: guard against None/empty input in clean_dangerous_html
update_unit_discussion_state_from_discussion_blocks runs after the course
has already been cloned successfully. Anything it raises reaches the
catch-all in rerun_course, which marks the rerun failed and deletes the
destination course, losing a complete clone over an optional migration.

Log and continue instead.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…sion-migration-failure

fix: do not discard a cloned course when discussion migration fails
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.