Skip to content

Commit 37cedee

Browse files
committed
🔖(chore) bump to 3.2.0
Added - Add `discounted_price`, `discount`, `certificate_discounted_price` and `certificate_discount` fields to `CourseRun` model - Add search indexation for new `CourseRun` model fields - Add `discounted_price` to the course glimpse template - Add autoplay for carousel slides Changed - Hide courses that are not `is_listed` in public pages - Replace order groups by computed properties coming from Joanie - Allow configuration of the `STORAGES` setting via environment variables - Rename `CourseProductRelation` to `Offer` - Only display payment schedule for credential products - Provide `postgresql` as default value for `ACTIVATED_DB` variable. - Update Offer type with rules property which contains all applicable offer rules - Rename again `CourseProductRelation` to `Offering` - Improve product display styling on course detail pages - Display discounted prices in catalog and course detail pages - Display certificate and normal discount prices for Syllabus Course Run Fixed - Prevent indexation failure when any thumbnail generation fails - Display discounted price for the purchase of a certificate product from student dashboard in sale tunnel informations - Clear the page and search caches when syncing a course run
1 parent 6f7c468 commit 37cedee

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+3714
-779
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Versioning](https://semver.org/spec/v2.0.0.html).
88

99
## [Unreleased]
1010

11+
## [3.2.0] - 2025-08-26
12+
1113
### Added
1214

1315
- Add `discounted_price`, `discount`, `certificate_discounted_price` and
@@ -2356,7 +2358,8 @@ us:
23562358
- finish integrating the missing pages and improve the sandbox environment;
23572359
- test and polish the use of richie as a django app / node dependency.
23582360

2359-
[unreleased]: https://github.com/openfun/richie/compare/v3.1.2...master
2361+
[unreleased]: https://github.com/openfun/richie/compare/v3.2.0...master
2362+
[3.2.0]: https://github.com/openfun/richie/compare/v3.1.2...v3.2.0
23602363
[3.1.2]: https://github.com/openfun/richie/compare/v3.1.1...v3.1.2
23612364
[3.1.1]: https://github.com/openfun/richie/compare/v3.1.0...v3.1.1
23622365
[3.1.0]: https://github.com/openfun/richie/compare/v3.0.0...v3.1.0

cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/requirements/base.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ django-storages==1.13.2
55
dockerflow==2022.8.0
66
gunicorn==23.0.0
77
psycopg2-binary==2.9.9
8-
richie==3.1.2
8+
richie==3.2.0
99
mysqlclient==2.2.6
1010
unidecode==1.3.6 # required by django-check-seo
1111
sentry-sdk==2.11.0

cookiecutter/{{cookiecutter.organization}}-richie-site-factory/template/{{cookiecutter.site}}/src/frontend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"CMS"
2222
],
2323
"dependencies": {
24-
"richie-education": "3.1.2"
24+
"richie-education": "3.2.0"
2525
},
2626
"devDependencies": {
2727
"@formatjs/cli": "6.3.11",

docs/cookiecutter.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ If you chose to install Cookiecutter, you can now run it against our
2525
[template][2] as follows:
2626

2727
```bash
28-
cookiecutter gh:openfun/richie --directory cookiecutter --checkout v3.1.2
28+
cookiecutter gh:openfun/richie --directory cookiecutter --checkout v3.2.0
2929
```
3030

3131
If you didn't want to install it on your machine, we provide a Docker image
3232
built with our [own repository][4] that you can use as follows:
3333

3434
```bash
3535
docker run --rm -it -u $(id -u):$(id -g) -v $PWD:/app \
36-
fundocker/cookiecutter gh:openfun/richie --directory cookiecutter --checkout v3.1.2
36+
fundocker/cookiecutter gh:openfun/richie --directory cookiecutter --checkout v3.2.0
3737
```
3838

3939
The `--directory` option is to indicate that our Cookiecutter template is in

src/frontend/i18n/locales/ar-SA.json

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,18 @@
227227
"description": "Course run languages",
228228
"message": "Available in {languages}"
229229
},
230+
"components.CourseProductItem.discount_rate": {
231+
"description": "Discount rate information",
232+
"message": "-{rate}%"
233+
},
234+
"components.CourseProductItem.discounted_price": {
235+
"description": "Label for the discounted price of a product",
236+
"message": "Discounted price:"
237+
},
238+
"components.CourseProductItem.from": {
239+
"description": "Discount start date information",
240+
"message": "from {from}"
241+
},
230242
"components.CourseProductItem.fromTo": {
231243
"description": "Course run date range",
232244
"message": "From {from} {to, select, undefined {} other {to {to}}}"
@@ -243,10 +255,18 @@
243255
"description": "Message displayed when no seats are available for the product",
244256
"message": "Sorry, no seats available for now"
245257
},
258+
"components.CourseProductItem.original_price": {
259+
"description": "Label for the original price of a product",
260+
"message": "Original price:"
261+
},
246262
"components.CourseProductItem.purchased": {
247263
"description": "Message displayed when authenticated user owned the product",
248264
"message": "Purchased"
249265
},
266+
"components.CourseProductItem.to": {
267+
"description": "Discount end date information",
268+
"message": "to {to}"
269+
},
250270
"components.CourseProductsList.end": {
251271
"description": "End label displayed in the header of course run dates section",
252272
"message": "End"
@@ -1927,8 +1947,8 @@
19271947
"description": "Sub title of the dashboard sidebar",
19281948
"message": "You are on your teacher dashboard"
19291949
},
1930-
"components.TeacherDashboardTraining.errorNoCourseProductRelation": {
1931-
"description": "Message displayed when requested course product relation is not found",
1950+
"components.TeacherDashboardTraining.errorNoOffering": {
1951+
"description": "Message displayed when requested offering is not found",
19321952
"message": "This product doesn't exist"
19331953
},
19341954
"components.TeacherDashboardTrainingLoader.loading": {
@@ -2047,14 +2067,6 @@
20472067
"description": "Error message shown to the user when orders fetch request fails.",
20482068
"message": "An error occurred while fetching orders. Please retry later."
20492069
},
2050-
"hooks.useCourseProductRelations.errorGet": {
2051-
"description": "Error message shown to the user when course product relation fetch request fails.",
2052-
"message": "An error occurred while fetching trainings. Please retry later."
2053-
},
2054-
"hooks.useCourseProductRelations.errorNotFound": {
2055-
"description": "Error message shown to the user when no course product relation matches.",
2056-
"message": "Cannot find the training."
2057-
},
20582070
"hooks.useCourseProductUnion.errorGet": {
20592071
"description": "Error message shown to the user when trainings fetch request fails.",
20602072
"message": "An error occurred while fetching trainings. Please retry later."
@@ -2147,6 +2159,14 @@
21472159
"description": "Error message shown to the user when it isn't logged.",
21482160
"message": "You aren't logged in."
21492161
},
2162+
"hooks.useOfferings.errorGet": {
2163+
"description": "Error message shown to the user when offering fetch request fails.",
2164+
"message": "An error occurred while fetching trainings. Please retry later."
2165+
},
2166+
"hooks.useOfferings.errorNotFound": {
2167+
"description": "Error message shown to the user when no offering matches.",
2168+
"message": "Cannot find the training."
2169+
},
21502170
"hooks.useOpenEdxProfile.errorGet": {
21512171
"description": "Error message shown to the user when openEdx profile fetch request fails.",
21522172
"message": "An error occurred while fetching your profile. Please retry later."

src/frontend/i18n/locales/es-ES.json

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,18 @@
227227
"description": "Course run languages",
228228
"message": "Available in {languages}"
229229
},
230+
"components.CourseProductItem.discount_rate": {
231+
"description": "Discount rate information",
232+
"message": "-{rate}%"
233+
},
234+
"components.CourseProductItem.discounted_price": {
235+
"description": "Label for the discounted price of a product",
236+
"message": "Discounted price:"
237+
},
238+
"components.CourseProductItem.from": {
239+
"description": "Discount start date information",
240+
"message": "from {from}"
241+
},
230242
"components.CourseProductItem.fromTo": {
231243
"description": "Course run date range",
232244
"message": "From {from} {to, select, undefined {} other {to {to}}}"
@@ -243,10 +255,18 @@
243255
"description": "Message displayed when no seats are available for the product",
244256
"message": "Sorry, no seats available for now"
245257
},
258+
"components.CourseProductItem.original_price": {
259+
"description": "Label for the original price of a product",
260+
"message": "Original price:"
261+
},
246262
"components.CourseProductItem.purchased": {
247263
"description": "Message displayed when authenticated user owned the product",
248264
"message": "Purchased"
249265
},
266+
"components.CourseProductItem.to": {
267+
"description": "Discount end date information",
268+
"message": "to {to}"
269+
},
250270
"components.CourseProductsList.end": {
251271
"description": "End label displayed in the header of course run dates section",
252272
"message": "Fin"
@@ -1927,8 +1947,8 @@
19271947
"description": "Sub title of the dashboard sidebar",
19281948
"message": "You are on your teacher dashboard"
19291949
},
1930-
"components.TeacherDashboardTraining.errorNoCourseProductRelation": {
1931-
"description": "Message displayed when requested course product relation is not found",
1950+
"components.TeacherDashboardTraining.errorNoOffering": {
1951+
"description": "Message displayed when requested offering is not found",
19321952
"message": "This product doesn't exist"
19331953
},
19341954
"components.TeacherDashboardTrainingLoader.loading": {
@@ -2047,14 +2067,6 @@
20472067
"description": "Error message shown to the user when orders fetch request fails.",
20482068
"message": "An error occurred while fetching orders. Please retry later."
20492069
},
2050-
"hooks.useCourseProductRelations.errorGet": {
2051-
"description": "Error message shown to the user when course product relation fetch request fails.",
2052-
"message": "An error occurred while fetching trainings. Please retry later."
2053-
},
2054-
"hooks.useCourseProductRelations.errorNotFound": {
2055-
"description": "Error message shown to the user when no course product relation matches.",
2056-
"message": "Cannot find the training."
2057-
},
20582070
"hooks.useCourseProductUnion.errorGet": {
20592071
"description": "Error message shown to the user when trainings fetch request fails.",
20602072
"message": "An error occurred while fetching trainings. Please retry later."
@@ -2147,6 +2159,14 @@
21472159
"description": "Error message shown to the user when it isn't logged.",
21482160
"message": "You aren't logged in."
21492161
},
2162+
"hooks.useOfferings.errorGet": {
2163+
"description": "Error message shown to the user when offering fetch request fails.",
2164+
"message": "An error occurred while fetching trainings. Please retry later."
2165+
},
2166+
"hooks.useOfferings.errorNotFound": {
2167+
"description": "Error message shown to the user when no offering matches.",
2168+
"message": "Cannot find the training."
2169+
},
21502170
"hooks.useOpenEdxProfile.errorGet": {
21512171
"description": "Error message shown to the user when openEdx profile fetch request fails.",
21522172
"message": "An error occurred while fetching your profile. Please retry later."

src/frontend/i18n/locales/fa-IR.json

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,18 @@
227227
"description": "Course run languages",
228228
"message": "Available in {languages}"
229229
},
230+
"components.CourseProductItem.discount_rate": {
231+
"description": "Discount rate information",
232+
"message": "-{rate}%"
233+
},
234+
"components.CourseProductItem.discounted_price": {
235+
"description": "Label for the discounted price of a product",
236+
"message": "Discounted price:"
237+
},
238+
"components.CourseProductItem.from": {
239+
"description": "Discount start date information",
240+
"message": "from {from}"
241+
},
230242
"components.CourseProductItem.fromTo": {
231243
"description": "Course run date range",
232244
"message": "From {from} {to, select, undefined {} other {to {to}}}"
@@ -243,10 +255,18 @@
243255
"description": "Message displayed when no seats are available for the product",
244256
"message": "Sorry, no seats available for now"
245257
},
258+
"components.CourseProductItem.original_price": {
259+
"description": "Label for the original price of a product",
260+
"message": "Original price:"
261+
},
246262
"components.CourseProductItem.purchased": {
247263
"description": "Message displayed when authenticated user owned the product",
248264
"message": "Purchased"
249265
},
266+
"components.CourseProductItem.to": {
267+
"description": "Discount end date information",
268+
"message": "to {to}"
269+
},
250270
"components.CourseProductsList.end": {
251271
"description": "End label displayed in the header of course run dates section",
252272
"message": "End"
@@ -1927,8 +1947,8 @@
19271947
"description": "Sub title of the dashboard sidebar",
19281948
"message": "You are on your teacher dashboard"
19291949
},
1930-
"components.TeacherDashboardTraining.errorNoCourseProductRelation": {
1931-
"description": "Message displayed when requested course product relation is not found",
1950+
"components.TeacherDashboardTraining.errorNoOffering": {
1951+
"description": "Message displayed when requested offering is not found",
19321952
"message": "This product doesn't exist"
19331953
},
19341954
"components.TeacherDashboardTrainingLoader.loading": {
@@ -2047,14 +2067,6 @@
20472067
"description": "Error message shown to the user when orders fetch request fails.",
20482068
"message": "An error occurred while fetching orders. Please retry later."
20492069
},
2050-
"hooks.useCourseProductRelations.errorGet": {
2051-
"description": "Error message shown to the user when course product relation fetch request fails.",
2052-
"message": "An error occurred while fetching trainings. Please retry later."
2053-
},
2054-
"hooks.useCourseProductRelations.errorNotFound": {
2055-
"description": "Error message shown to the user when no course product relation matches.",
2056-
"message": "Cannot find the training."
2057-
},
20582070
"hooks.useCourseProductUnion.errorGet": {
20592071
"description": "Error message shown to the user when trainings fetch request fails.",
20602072
"message": "An error occurred while fetching trainings. Please retry later."
@@ -2147,6 +2159,14 @@
21472159
"description": "Error message shown to the user when it isn't logged.",
21482160
"message": "You aren't logged in."
21492161
},
2162+
"hooks.useOfferings.errorGet": {
2163+
"description": "Error message shown to the user when offering fetch request fails.",
2164+
"message": "An error occurred while fetching trainings. Please retry later."
2165+
},
2166+
"hooks.useOfferings.errorNotFound": {
2167+
"description": "Error message shown to the user when no offering matches.",
2168+
"message": "Cannot find the training."
2169+
},
21502170
"hooks.useOpenEdxProfile.errorGet": {
21512171
"description": "Error message shown to the user when openEdx profile fetch request fails.",
21522172
"message": "An error occurred while fetching your profile. Please retry later."

src/frontend/i18n/locales/fr-CA.json

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,18 @@
227227
"description": "Course run languages",
228228
"message": "Disponible en {languages}"
229229
},
230+
"components.CourseProductItem.discount_rate": {
231+
"description": "Discount rate information",
232+
"message": "-{rate}%"
233+
},
234+
"components.CourseProductItem.discounted_price": {
235+
"description": "Label for the discounted price of a product",
236+
"message": "Discounted price:"
237+
},
238+
"components.CourseProductItem.from": {
239+
"description": "Discount start date information",
240+
"message": "from {from}"
241+
},
230242
"components.CourseProductItem.fromTo": {
231243
"description": "Course run date range",
232244
"message": "From {from} {to, select, undefined {} other {to {to}}}"
@@ -243,10 +255,18 @@
243255
"description": "Message displayed when no seats are available for the product",
244256
"message": "Sorry, no seats available for now"
245257
},
258+
"components.CourseProductItem.original_price": {
259+
"description": "Label for the original price of a product",
260+
"message": "Original price:"
261+
},
246262
"components.CourseProductItem.purchased": {
247263
"description": "Message displayed when authenticated user owned the product",
248264
"message": "Acheté"
249265
},
266+
"components.CourseProductItem.to": {
267+
"description": "Discount end date information",
268+
"message": "to {to}"
269+
},
250270
"components.CourseProductsList.end": {
251271
"description": "End label displayed in the header of course run dates section",
252272
"message": "Fin"
@@ -1927,9 +1947,9 @@
19271947
"description": "Sub title of the dashboard sidebar",
19281948
"message": "Vous êtes sur votre tableau de bord enseignant"
19291949
},
1930-
"components.TeacherDashboardTraining.errorNoCourseProductRelation": {
1931-
"description": "Message displayed when requested course product relation is not found",
1932-
"message": "Ce produit n’existe pas"
1950+
"components.TeacherDashboardTraining.errorNoOffering": {
1951+
"description": "Message displayed when requested offering is not found",
1952+
"message": "This product doesn't exist"
19331953
},
19341954
"components.TeacherDashboardTrainingLoader.loading": {
19351955
"description": "Message displayed while loading a course",
@@ -2047,14 +2067,6 @@
20472067
"description": "Error message shown to the user when orders fetch request fails.",
20482068
"message": "An error occurred while fetching orders. Please retry later."
20492069
},
2050-
"hooks.useCourseProductRelations.errorGet": {
2051-
"description": "Error message shown to the user when course product relation fetch request fails.",
2052-
"message": "Une erreur s'est produite lors de la récupération des formations. Veuillez réessayer plus tard."
2053-
},
2054-
"hooks.useCourseProductRelations.errorNotFound": {
2055-
"description": "Error message shown to the user when no course product relation matches.",
2056-
"message": "Formation introuvable."
2057-
},
20582070
"hooks.useCourseProductUnion.errorGet": {
20592071
"description": "Error message shown to the user when trainings fetch request fails.",
20602072
"message": "Une erreur s'est produite lors de la récupération des formations. Veuillez réessayer plus tard."
@@ -2147,6 +2159,14 @@
21472159
"description": "Error message shown to the user when it isn't logged.",
21482160
"message": "You aren't logged in."
21492161
},
2162+
"hooks.useOfferings.errorGet": {
2163+
"description": "Error message shown to the user when offering fetch request fails.",
2164+
"message": "An error occurred while fetching trainings. Please retry later."
2165+
},
2166+
"hooks.useOfferings.errorNotFound": {
2167+
"description": "Error message shown to the user when no offering matches.",
2168+
"message": "Cannot find the training."
2169+
},
21502170
"hooks.useOpenEdxProfile.errorGet": {
21512171
"description": "Error message shown to the user when openEdx profile fetch request fails.",
21522172
"message": "An error occurred while fetching your profile. Please retry later."

0 commit comments

Comments
 (0)