Skip to content

Release 1.150.5 - #3595

Merged
odlbot merged 8 commits into
releasefrom
release-candidate
May 20, 2026
Merged

odlbot merged 8 commits into
releasefrom
release-candidate

Conversation

@odlbot

@odlbot odlbot commented May 20, 2026 •

Copy link
Copy Markdown
Contributor

annagav

Muhammad Arslan

cp-at-mit

Dan Subak

renovate[bot]

James Kachel

@github-actions

Copy link
Copy Markdown

OpenAPI Changes

Show/hide ## Changes for v0.yaml:
## Changes for v0.yaml:
21 changes: 19 error, 0 warning, 2 info
error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/course_certificates/{cert_uuid}/
		the response property `course_run/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/courses/
		the response property `results/items/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/courses/{id}/
		the response property `page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/enrollments/
		the response property `items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/enrollments/
		the response property `run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `201`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/pages/?fields=*&type=cms.coursepage
		the response property `items/items/course_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/pages/?fields=*&type=cms.programpage
		the response property `items/items/program_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/pages/{id}/
		the response property `oneOf[#/components/schemas/CoursePageItem]/course_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/pages/{id}/
		the response property `oneOf[#/components/schemas/ProgramPageItem]/program_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_certificates/{cert_uuid}/
		the response property `program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/
		the response property `items/enrollments/items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/
		the response property `items/program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property `items/enrollments/items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property `items/program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property `enrollments/items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property `program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/programs/
		the response property `results/items/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/programs/{id}/
		the response property `page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/verified_program_enrollments/{courserun_id}/
		the response property `run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `201`

info	[response-required-property-added] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/course_certificates/{cert_uuid}/
		added the required property `issue_date` to the response with the `200` status

info	[response-required-property-added] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_certificates/{cert_uuid}/
		added the required property `issue_date` to the response with the `200` status



## Changes for v1.yaml:
21 changes: 19 error, 0 warning, 2 info
error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/course_certificates/{cert_uuid}/
		the response property `course_run/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/courses/
		the response property `results/items/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/courses/{id}/
		the response property `page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/enrollments/
		the response property `items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/enrollments/
		the response property `run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `201`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/pages/?fields=*&type=cms.coursepage
		the response property `items/items/course_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/pages/?fields=*&type=cms.programpage
		the response property `items/items/program_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/pages/{id}/
		the response property `oneOf[#/components/schemas/CoursePageItem]/course_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/pages/{id}/
		the response property `oneOf[#/components/schemas/ProgramPageItem]/program_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_certificates/{cert_uuid}/
		the response property `program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/
		the response property `items/enrollments/items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/
		the response property `items/program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property `items/enrollments/items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property `items/program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property `enrollments/items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property `program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/programs/
		the response property `results/items/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/programs/{id}/
		the response property `page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/verified_program_enrollments/{courserun_id}/
		the response property `run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `201`

info	[response-required-property-added] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/course_certificates/{cert_uuid}/
		added the required property `issue_date` to the response with the `200` status

info	[response-required-property-added] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_certificates/{cert_uuid}/
		added the required property `issue_date` to the response with the `200` status



## Changes for v2.yaml:
21 changes: 19 error, 0 warning, 2 info
error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/course_certificates/{cert_uuid}/
		the response property `course_run/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/courses/
		the response property `results/items/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/courses/{id}/
		the response property `page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/enrollments/
		the response property `items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API POST /api/v2/enrollments/
		the response property `run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `201`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/pages/?fields=*&type=cms.coursepage
		the response property `items/items/course_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/pages/?fields=*&type=cms.programpage
		the response property `items/items/program_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/pages/{id}/
		the response property `oneOf[#/components/schemas/CoursePageItem]/course_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/pages/{id}/
		the response property `oneOf[#/components/schemas/ProgramPageItem]/program_details/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_certificates/{cert_uuid}/
		the response property `program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_enrollments/
		the response property `items/enrollments/items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_enrollments/
		the response property `items/program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property `items/enrollments/items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property `items/program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property `enrollments/items/run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property `program/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/programs/
		the response property `results/items/page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/programs/{id}/
		the response property `page` became nullable for the status `200`

error	[response-property-became-nullable] at head/openapi/specs/v2.yaml	
	in API POST /api/v2/verified_program_enrollments/{courserun_id}/
		the response property `run/allOf[#/components/schemas/V2CourseRunWithCourse]/course/allOf[#/components/schemas/V2Course]/page` became nullable for the status `201`

info	[response-required-property-added] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/course_certificates/{cert_uuid}/
		added the required property `issue_date` to the response with the `200` status

info	[response-required-property-added] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_certificates/{cert_uuid}/
		added the required property `issue_date` to the response with the `200` status



Unexpected changes? Ensure your branch is up-to-date with main (consider rebasing).

Comment thread hubspot_sync/api.py
Comment on lines 610 to 615
},
],
},
{
"name": "unique_app_id",
"label": "Unique App ID",
"description": "The unique app ID for the lineitem",
"groupName": "lineiteminformation",
"type": "string",
"fieldType": "text",
"hasUniqueValue": True,
"hidden": True,
},
{
"name": "enrollment_mode",
"label": "Enrollment Mode",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The unique_app_id property for line items is removed from the HubSpot schema but is still used when creating and searching, causing sync failures or duplicates.
Severity: HIGH

Suggested Fix

Either restore the unique_app_id property to the CUSTOM_ECOMMERCE_PROPERTIES["line_items"] definition or remove all usage of unique_app_id from the line item serialization and search logic, including LineSerializer and the _ensure_target_line_item_for_line function.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.

Location: hubspot_sync/api.py#L610-L615

Potential issue: The removal of the `unique_app_id` property definition from
`CUSTOM_ECOMMERCE_PROPERTIES["line_items"]` prevents its creation in new HubSpot
accounts. However, the application code, specifically `LineSerializer` and
`_ensure_target_line_item_for_line`, continues to send and search for line items using
this property. This discrepancy will cause the search function
`_find_target_line_item_id_by_unique_app_id` to fail silently by returning `None`.
Consequently, the sync process will attempt to create a new line item on every run,
leading to the creation of duplicate line items and data integrity issues.

Did we get this right? 👍 / 👎 to inform future reviews.

Comment on lines +451 to +455
@extend_schema_field(ProgramPageSerializer(allow_null=True))
def get_page(self, instance):
if hasattr(instance, "page"):
if hasattr(instance, "page") and instance.page is not None:
return ProgramPageSerializer(instance.page).data
else:
return {"feature_image_src": get_thumbnail_url(None)}
return None

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The ProgramSerializer now returns null for page instead of a fallback object, which will cause a frontend crash when accessing properties of program.page.
Severity: CRITICAL

Suggested Fix

Update ProgramSerializer.get_page() to return a default dictionary with expected keys (e.g., feature_image_src) when a program has no page, restoring the previous behavior and preventing frontend crashes. Alternatively, add null-checking in all frontend components that consume program.page.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.

Location: courses/serializers/v2/programs.py#L451-L455

Potential issue: The `ProgramSerializer.get_page()` method now returns `null` for
programs without a CMS page, where it previously returned a fallback object. Frontend
React components, such as `ProgramInfoBox.js`, expect `program.page` to be an object and
access its properties (e.g., `program.page.length`) without null-checking. This change
will cause a `TypeError: Cannot read properties of null` when rendering a program
without a page, crashing the React component tree and preventing the page from loading.

Did we get this right? 👍 / 👎 to inform future reviews.

@odlbot
odlbot merged commit 0484715 into release May 20, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants