From ac5298e9ad1bb4f4ed733ff7ef7fcc0e24e2070d Mon Sep 17 00:00:00 2001 From: Anna Date: Tue, 12 May 2026 21:36:19 -0400 Subject: [PATCH 1/5] remove price on ProductPage --- cms/api.py | 9 --------- cms/blocks.py | 14 -------------- cms/models.py | 9 --------- cms/serializers.py | 11 ----------- cms/serializers_test.py | 5 ----- 5 files changed, 48 deletions(-) diff --git a/cms/api.py b/cms/api.py index c788aef2f9..216046540b 100644 --- a/cms/api.py +++ b/cms/api.py @@ -356,15 +356,6 @@ def get_optional_placeholder_values_for_courseware_type( # Might make sense to use faker for some of this or allow selection of values from different presets # For now though, this sets up a page which is reasonably complete and can be immediately published values = { - "price": [ - ( - "price_details", - { - "text": "PLACEHOLDER - Three easy payments of 99.99", - "link": "https://example.com/pricing", - }, - ) - ], "min_weeks": 1, "max_weeks": 1, "effort": "PLACEHOLDER - 1-2 hours per week", diff --git a/cms/blocks.py b/cms/blocks.py index ee10348ec0..03ffd0b0f3 100644 --- a/cms/blocks.py +++ b/cms/blocks.py @@ -17,20 +17,6 @@ class ResourceBlock(blocks.StructBlock): detail = blocks.RichTextBlock() -class PriceBlock(blocks.StructBlock): - """ - A custom block for price field. - """ - - text = blocks.CharBlock( - max_length=150, - help="Displayed over the product detail page under the price tile.", - ) - link = blocks.URLBlock( - required=False, - help="Specify the URL to redirect the user for the product's price details page.", - ) - class CourseRunFieldBlock(blocks.FieldBlock): """ diff --git a/cms/models.py b/cms/models.py index 694d0c15c4..c818779cef 100644 --- a/cms/models.py +++ b/cms/models.py @@ -51,7 +51,6 @@ from cms.blocks import ( CourseRunCertificateOverrides, - PriceBlock, ResourceBlock, validate_unique_readable_ids, ) @@ -1113,12 +1112,6 @@ class Meta: help_text="A short description indicating how much effort is required (e.g. 1-3 hours per week).", ) - price = StreamField( - StreamBlock([("price_details", PriceBlock())], max_num=1), - help_text="Specify the product price details.", - use_json_field=True, - ) - min_price = models.SmallIntegerField( default=0, null=False, @@ -1226,7 +1219,6 @@ class Meta: FieldPanel("max_weekly_hours"), FieldPanel("min_weeks"), FieldPanel("max_weeks"), - FieldPanel("price"), FieldPanel("min_price"), FieldPanel("max_price"), FieldPanel("prerequisites"), @@ -1284,7 +1276,6 @@ class Meta: APIField("max_weekly_hours"), APIField("min_weeks"), APIField("max_weeks"), - APIField("price"), APIField("min_price"), APIField("max_price"), APIField("prerequisites", serializer=RichTextSerializer()), diff --git a/cms/serializers.py b/cms/serializers.py index df58c9d04d..4b81842622 100644 --- a/cms/serializers.py +++ b/cms/serializers.py @@ -260,7 +260,6 @@ class ProgramPageSerializer(serializers.ModelSerializer): feature_image_src = serializers.SerializerMethodField() page_url = serializers.SerializerMethodField() - price = serializers.SerializerMethodField() list_price = serializers.SerializerMethodField() financial_assistance_form_url = serializers.SerializerMethodField() description = serializers.SerializerMethodField() @@ -288,15 +287,6 @@ def get_description(self, instance): return bleach.clean(instance.description, tags={}, strip=True) return "" - @extend_schema_field(str) - def get_price(self, instance): - """Get the price text from the program page.""" - if hasattr(instance, "price") and instance.price: - return ( - instance.price[0].value.get("text") if len(instance.price) > 0 else None - ) - return None - @extend_schema_field(serializers.DecimalField(max_digits=10, decimal_places=2)) def get_list_price(self, instance): """Get the page list price or fall back to the linked program product price.""" @@ -389,7 +379,6 @@ class Meta: "include_in_learn_catalog", "length", "effort", - "price", "list_price", ] diff --git a/cms/serializers_test.py b/cms/serializers_test.py index 8f8ec9ae0c..cb0113d12f 100644 --- a/cms/serializers_test.py +++ b/cms/serializers_test.py @@ -411,7 +411,6 @@ def test_serialize_program_page( "live": True, "length": program_page.length, "effort": program_page.effort, - "price": None, "list_price": 99.99, "include_in_learn_catalog": False, }, @@ -463,7 +462,6 @@ def test_serialize_program_page__form_child_of_course_with_program_fk( "live": True, "length": program_page.length, "effort": program_page.effort, - "price": None, "list_price": None, "include_in_learn_catalog": False, }, @@ -503,7 +501,6 @@ def test_serialize_program_page__with_related_financial_form( "live": True, "length": program_page.length, "effort": program_page.effort, - "price": None, "list_price": None, "include_in_learn_catalog": False, }, @@ -537,7 +534,6 @@ def test_serialize_program_page__no_financial_form( "live": True, "length": program_page.length, "effort": program_page.effort, - "price": None, "list_price": None, "include_in_learn_catalog": False, }, @@ -574,7 +570,6 @@ def test_serialize_program_page__with_related_program_no_financial_form( "live": True, "length": program_page.length, "effort": program_page.effort, - "price": None, "list_price": None, "include_in_learn_catalog": False, }, From 227e747fb2bc8b5b349198e752efc2c56dc37baa Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 13 May 2026 07:46:28 -0400 Subject: [PATCH 2/5] migration --- .../0062_remove_productpage_price.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 cms/migrations/0062_remove_productpage_price.py diff --git a/cms/migrations/0062_remove_productpage_price.py b/cms/migrations/0062_remove_productpage_price.py new file mode 100644 index 0000000000..9a1b0f63c8 --- /dev/null +++ b/cms/migrations/0062_remove_productpage_price.py @@ -0,0 +1,21 @@ +# Generated by Django 5.1.15 on 2026-05-12 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("cms", "0061_programpage_list_price"), + ] + + operations = [ + migrations.RemoveField( + model_name="coursepage", + name="price", + ), + migrations.RemoveField( + model_name="programpage", + name="price", + ), + ] + From 84d57d46bc52bffcaa019a313fe7d6f7821d920a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 11:50:35 +0000 Subject: [PATCH 3/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- cms/blocks.py | 1 - cms/migrations/0062_remove_productpage_price.py | 1 - 2 files changed, 2 deletions(-) diff --git a/cms/blocks.py b/cms/blocks.py index 03ffd0b0f3..f2b3355978 100644 --- a/cms/blocks.py +++ b/cms/blocks.py @@ -17,7 +17,6 @@ class ResourceBlock(blocks.StructBlock): detail = blocks.RichTextBlock() - class CourseRunFieldBlock(blocks.FieldBlock): """ Block class that allows selecting a course run diff --git a/cms/migrations/0062_remove_productpage_price.py b/cms/migrations/0062_remove_productpage_price.py index 9a1b0f63c8..49dfd7a5ca 100644 --- a/cms/migrations/0062_remove_productpage_price.py +++ b/cms/migrations/0062_remove_productpage_price.py @@ -18,4 +18,3 @@ class Migration(migrations.Migration): name="price", ), ] - From 079dcd7f881d86eaf16aa97165fcdb13aba3297d Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 13 May 2026 08:08:06 -0400 Subject: [PATCH 4/5] spec --- openapi/specs/v0.yaml | 5 ----- openapi/specs/v1.yaml | 5 ----- openapi/specs/v2.yaml | 5 ----- 3 files changed, 15 deletions(-) diff --git a/openapi/specs/v0.yaml b/openapi/specs/v0.yaml index 7c3d7dab51..8865ac4324 100644 --- a/openapi/specs/v0.yaml +++ b/openapi/specs/v0.yaml @@ -7114,10 +7114,6 @@ components: description: A short description indicating how much effort is required (e.g. 1-3 hours per week). maxLength: 100 - price: - type: string - description: Get the price text from the program page. - readOnly: true list_price: type: string format: decimal @@ -7130,7 +7126,6 @@ components: - list_price - live - page_url - - price ProgramPageItem: type: object description: Serializer for individual program page items, including all relevant diff --git a/openapi/specs/v1.yaml b/openapi/specs/v1.yaml index dcf9f3c5b6..eb41a1c34c 100644 --- a/openapi/specs/v1.yaml +++ b/openapi/specs/v1.yaml @@ -7114,10 +7114,6 @@ components: description: A short description indicating how much effort is required (e.g. 1-3 hours per week). maxLength: 100 - price: - type: string - description: Get the price text from the program page. - readOnly: true list_price: type: string format: decimal @@ -7130,7 +7126,6 @@ components: - list_price - live - page_url - - price ProgramPageItem: type: object description: Serializer for individual program page items, including all relevant diff --git a/openapi/specs/v2.yaml b/openapi/specs/v2.yaml index a17ee84594..3caa7d41fa 100644 --- a/openapi/specs/v2.yaml +++ b/openapi/specs/v2.yaml @@ -7114,10 +7114,6 @@ components: description: A short description indicating how much effort is required (e.g. 1-3 hours per week). maxLength: 100 - price: - type: string - description: Get the price text from the program page. - readOnly: true list_price: type: string format: decimal @@ -7130,7 +7126,6 @@ components: - list_price - live - page_url - - price ProgramPageItem: type: object description: Serializer for individual program page items, including all relevant From fd205338b8464fc7ed653756bd798009700d69c1 Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 13 May 2026 08:17:06 -0400 Subject: [PATCH 5/5] drf_lint --- drf_lint_baseline.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drf_lint_baseline.json b/drf_lint_baseline.json index 6bca0f6360..dd5e96148d 100644 --- a/drf_lint_baseline.json +++ b/drf_lint_baseline.json @@ -1,9 +1,9 @@ [ "cms/serializers.py:114:16:ORM001", "cms/serializers.py:153:41:ORM001", - "cms/serializers.py:320:12:ORM001", - "cms/serializers.py:355:20:ORM001", - "cms/serializers.py:366:39:ORM001", + "cms/serializers.py:310:12:ORM001", + "cms/serializers.py:345:20:ORM001", + "cms/serializers.py:356:39:ORM001", "cms/serializers.py:83:12:ORM001", "cms/serializers.py:96:12:ORM001", "courses/serializers/base.py:53:16:ORM001",