You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Catalog About sidebar showed "Free" for paid non-USD courses because get_course_prices() forces PAID_COURSE_REGISTRATION_CURRENCY (USD) and falls back to "Free" on a currency mismatch.
Added get_course_display_price() in common/djangoapps/course_modes/models.py that reads the course's own paid mode (verified preferred, else first paid mode) and formats min_price with that mode's own currency symbol via Babel.
Wired it into CoursewareMeta.course_price (courseware_api/views.py). get_course_prices() is untouched for all other callers; genuinely free courses still return "Free".
Behavior
Paid USD course: $1000 (unchanged)
Paid INR/EUR/etc course: ₹1000 / €40 (was "Free")
Free course: "Free" (unchanged)
Verified
Catalog About sidebar shows correct currency+price for all the currencies.
Findings: Open edX ecommerce direction + the catalog price fix
The strategic direction: LMS should NOT own pricing
Open edX's stated approach is to not maintain its own commerce service, but to expose a robust set of APIs/hooks to integrate best-of-breed external systems. WooCommerce is the reference implementation.
The key statement of intent (from the Oct 4, 2024 community design): the LMS "would not have any knowledge of concepts like bundles, discounts, offers, or even prices." (same wiki page above)
The newer In-App Purchases proposal reinforces it: a thin Purchase Gateway + provider (RevenueCat/Stripe), where "prices come from store metadata/provider offerings (never hard-coded)" — i.e., the client fetches price from the external store, not the LMS.
Important caveat: gradual, hook-based, no firm timeline
Maintainers explicitly said removal will be gradual and that they will likely add filters/hooks so operators can plug in their own commerce system for pricing lookups before pricing is removed from the platform.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
get_course_prices()forcesPAID_COURSE_REGISTRATION_CURRENCY(USD) and falls back to "Free" on a currency mismatch.get_course_display_price()incommon/djangoapps/course_modes/models.pythat reads the course's own paid mode (verified preferred, else first paid mode) and formatsmin_pricewith that mode's own currency symbol via Babel.CoursewareMeta.course_price(courseware_api/views.py).get_course_prices()is untouched for all other callers; genuinely free courses still return "Free".Behavior
$1000(unchanged)₹1000/€40(was "Free")Verified