Skip to content

Improve /api/v2/enrollments/ performance#3268

Open
rhysyngsun wants to merge 1 commit intomainfrom
nl/user-enrollments-perf
Open

Improve /api/v2/enrollments/ performance#3268
rhysyngsun wants to merge 1 commit intomainfrom
nl/user-enrollments-perf

Conversation

@rhysyngsun
Copy link
Collaborator

@rhysyngsun rhysyngsun commented Feb 4, 2026

What are the relevant tickets?

Part of https://github.com/mitodl/hq/issues/9559

Description (What does it do?)

This adds a couple of performance tweaks:

  • Moves some fetches from select_related to prefetch_related
    • This reduces the number of joins we're doing here so should be a bit more performant.
    • The joins I left are ones that the API either already or potentially joins on anyway due to filtering.
  • Prefetches the certificate instead of N+1 queries in the serializer

Note that the OpenAPI checks are failing because I made some modifications to more explicitly specify grades and readonly to prevent drf_spectacular from putting an input type for grades into the spec (no idea why it was trying to do that) and while the check doesn't see an issue with that, it's taking issue with the fact that maxLength was dropped as a result, which really never matters because it's read-only data.

How can this be tested?

  • Ensure you have multiple enrollments locally
  • You should be able to load the mitxonline and learn dashboards and they should look and function the same but the API should return faster

@github-actions
Copy link

github-actions bot commented Feb 4, 2026

OpenAPI Changes

Show/hide ## Changes for v0.yaml:
## Changes for v0.yaml:
104 changes: 13 error, 0 warning, 91 info
error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/enrollments/
		the '/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API POST /api/v1/enrollments/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '201'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/
		the '/items/enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the 'enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the 'enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/enrollments/
		the '/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/enrollments/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '201'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/
		the '/items/enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the '/items/enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the 'enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/enrollments/
		the response optional property '/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/enrollments/
		the response optional property '/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/enrollments/
		the response optional property '/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/enrollments/
		the response property '/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/enrollments/
		the response property '/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/enrollments/
		the response property '/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/enrollments/
		the response required property '/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v1/enrollments/
		the response optional property 'grades/items/letter_grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v1/enrollments/
		the response optional property 'grades/items/passed' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v1/enrollments/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '201'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API POST /api/v1/enrollments/
		the response property 'grades/items/letter_grade' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API POST /api/v1/enrollments/
		the response property 'grades/items/passed' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API POST /api/v1/enrollments/
		the response property 'grades/items/set_by_admin' became required for the status '201'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v1/enrollments/
		the response required property 'grades/items/grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response optional property 'grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response optional property 'grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response property 'grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response property 'grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response property 'grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response required property 'grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response optional property 'grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response optional property 'grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response property 'grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response property 'grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response property 'grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response required property 'grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/
		the response property '/items/enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/
		the response property '/items/enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/
		the response property '/items/enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/
		the response required property '/items/enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response required property 'enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response required property 'enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/enrollments/
		the response optional property '/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/enrollments/
		the response optional property '/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/enrollments/
		the response optional property '/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/enrollments/
		the response property '/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/enrollments/
		the response property '/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/enrollments/
		the response property '/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/enrollments/
		the response required property '/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/enrollments/
		the response optional property 'grades/items/letter_grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/enrollments/
		the response optional property 'grades/items/passed' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/enrollments/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '201'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/enrollments/
		the response property 'grades/items/letter_grade' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/enrollments/
		the response property 'grades/items/passed' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/enrollments/
		the response property 'grades/items/set_by_admin' became required for the status '201'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/enrollments/
		the response required property 'grades/items/grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/
		the response property '/items/enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/
		the response property '/items/enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/
		the response property '/items/enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/
		the response required property '/items/enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response optional property '/items/enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response optional property '/items/enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response optional property '/items/enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property '/items/enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property '/items/enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property '/items/enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response required property '/items/enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response required property 'enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response optional property 'grades/items/letter_grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response optional property 'grades/items/passed' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '201'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response property 'grades/items/letter_grade' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response property 'grades/items/passed' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response property 'grades/items/set_by_admin' became required for the status '201'

info	[response-required-property-became-read-only] at head/openapi/specs/v0.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response required property 'grades/items/grade' became read-only for the status '201'



## Changes for v1.yaml:
104 changes: 13 error, 0 warning, 91 info
error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/enrollments/
		the '/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API POST /api/v1/enrollments/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '201'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/
		the '/items/enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the 'enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the 'enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/enrollments/
		the '/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/enrollments/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '201'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/
		the '/items/enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the '/items/enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the 'enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/enrollments/
		the response optional property '/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/enrollments/
		the response optional property '/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/enrollments/
		the response optional property '/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/enrollments/
		the response property '/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/enrollments/
		the response property '/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/enrollments/
		the response property '/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/enrollments/
		the response required property '/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v1/enrollments/
		the response optional property 'grades/items/letter_grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v1/enrollments/
		the response optional property 'grades/items/passed' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v1/enrollments/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '201'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API POST /api/v1/enrollments/
		the response property 'grades/items/letter_grade' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API POST /api/v1/enrollments/
		the response property 'grades/items/passed' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API POST /api/v1/enrollments/
		the response property 'grades/items/set_by_admin' became required for the status '201'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v1/enrollments/
		the response required property 'grades/items/grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response optional property 'grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response optional property 'grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response property 'grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response property 'grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response property 'grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response required property 'grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response optional property 'grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response optional property 'grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response property 'grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response property 'grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response property 'grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response required property 'grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/
		the response property '/items/enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/
		the response property '/items/enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/
		the response property '/items/enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/
		the response required property '/items/enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response required property 'enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response required property 'enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/enrollments/
		the response optional property '/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/enrollments/
		the response optional property '/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/enrollments/
		the response optional property '/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/enrollments/
		the response property '/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/enrollments/
		the response property '/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/enrollments/
		the response property '/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/enrollments/
		the response required property '/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/enrollments/
		the response optional property 'grades/items/letter_grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/enrollments/
		the response optional property 'grades/items/passed' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/enrollments/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '201'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/enrollments/
		the response property 'grades/items/letter_grade' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/enrollments/
		the response property 'grades/items/passed' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/enrollments/
		the response property 'grades/items/set_by_admin' became required for the status '201'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/enrollments/
		the response required property 'grades/items/grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/
		the response property '/items/enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/
		the response property '/items/enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/
		the response property '/items/enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/
		the response required property '/items/enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response optional property '/items/enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response optional property '/items/enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response optional property '/items/enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property '/items/enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property '/items/enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response property '/items/enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the response required property '/items/enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the response required property 'enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response optional property 'grades/items/letter_grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response optional property 'grades/items/passed' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '201'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response property 'grades/items/letter_grade' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response property 'grades/items/passed' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response property 'grades/items/set_by_admin' became required for the status '201'

info	[response-required-property-became-read-only] at head/openapi/specs/v1.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the response required property 'grades/items/grade' became read-only for the status '201'



## Changes for v2.yaml:
104 changes: 13 error, 0 warning, 91 info
error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/enrollments/
		the '/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API POST /api/v1/enrollments/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '201'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/
		the '/items/enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the 'enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the 'enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/enrollments/
		the '/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API POST /api/v2/enrollments/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '201'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_enrollments/
		the '/items/enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API DELETE /api/v2/program_enrollments/{id}/
		the '/items/enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_enrollments/{id}/
		the 'enrollments/items/grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '200'

error	[response-property-max-length-unset] at head/openapi/specs/v2.yaml	
	in API POST /api/v2/verified_program_enrollments/{program_id}/{courserun_id}/
		the 'grades/items/letter_grade' response property's maxLength was unset from '6' for the response status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/enrollments/
		the response optional property '/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/enrollments/
		the response optional property '/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/enrollments/
		the response optional property '/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/enrollments/
		the response property '/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/enrollments/
		the response property '/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/enrollments/
		the response property '/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/enrollments/
		the response required property '/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API POST /api/v1/enrollments/
		the response optional property 'grades/items/letter_grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API POST /api/v1/enrollments/
		the response optional property 'grades/items/passed' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API POST /api/v1/enrollments/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '201'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API POST /api/v1/enrollments/
		the response property 'grades/items/letter_grade' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API POST /api/v1/enrollments/
		the response property 'grades/items/passed' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API POST /api/v1/enrollments/
		the response property 'grades/items/set_by_admin' became required for the status '201'

info	[response-required-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API POST /api/v1/enrollments/
		the response required property 'grades/items/grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response optional property 'grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response optional property 'grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response property 'grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response property 'grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response property 'grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API PATCH /api/v1/enrollments/{id}/
		the response required property 'grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response optional property 'grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response optional property 'grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response property 'grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response property 'grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response property 'grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API PUT /api/v1/enrollments/{id}/
		the response required property 'grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/
		the response property '/items/enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/
		the response property '/items/enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/
		the response property '/items/enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/
		the response required property '/items/enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API DELETE /api/v1/program_enrollments/{id}/
		the response required property 'enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response optional property 'enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response property 'enrollments/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v1/program_enrollments/{id}/
		the response required property 'enrollments/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/enrollments/
		the response optional property '/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/enrollments/
		the response optional property '/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/enrollments/
		the response optional property '/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/enrollments/
		the response property '/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/enrollments/
		the response property '/items/grades/items/passed' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/enrollments/
		the response property '/items/grades/items/set_by_admin' became required for the status '200'

info	[response-required-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/enrollments/
		the response required property '/items/grades/items/grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API POST /api/v2/enrollments/
		the response optional property 'grades/items/letter_grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API POST /api/v2/enrollments/
		the response optional property 'grades/items/passed' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API POST /api/v2/enrollments/
		the response optional property 'grades/items/set_by_admin' became read-only for the status '201'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API POST /api/v2/enrollments/
		the response property 'grades/items/letter_grade' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API POST /api/v2/enrollments/
		the response property 'grades/items/passed' became required for the status '201'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API POST /api/v2/enrollments/
		the response property 'grades/items/set_by_admin' became required for the status '201'

info	[response-required-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API POST /api/v2/enrollments/
		the response required property 'grades/items/grade' became read-only for the status '201'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/letter_grade' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/passed' became read-only for the status '200'

info	[response-optional-property-became-read-only] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_enrollments/
		the response optional property '/items/enrollments/items/grades/items/set_by_admin' became read-only for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_enrollments/
		the response property '/items/enrollments/items/grades/items/letter_grade' became required for the status '200'

info	[response-property-became-required] at head/openapi/specs/v2.yaml	
	in API GET /api/v2/program_enrollments/
		the response pro...*[Comment body truncated]*

@rhysyngsun rhysyngsun changed the title Nl/user enrollments perf Improve /api/v2/enrollments/ performance Feb 4, 2026
@rhysyngsun rhysyngsun force-pushed the nl/user-enrollments-perf branch from 53d183c to 5dd8066 Compare February 5, 2026 13:56
@rhysyngsun rhysyngsun force-pushed the nl/user-enrollments-perf branch from 66eca49 to 3c0047c Compare February 5, 2026 21:26
@rhysyngsun rhysyngsun marked this pull request as ready for review February 6, 2026 14:00
@gumaerc gumaerc self-assigned this Feb 6, 2026
Copy link
Contributor

@gumaerc gumaerc left a comment

Choose a reason for hiding this comment

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

I started by doing a basic performance benchmark on a filtered courses API request on this branch:

Running benchmark...
Request 1: 0.038005s
Request 2: 0.039411s
Request 3: 0.047653s
Request 4: 0.046338s
Request 5: 0.047911s
Request 6: 0.039506s
Request 7: 0.041502s
Request 8: 0.044114s
Request 9: 0.043823s
Request 10: 0.042039s
Request 11: 0.040209s
Request 12: 0.052176s
Request 13: 0.052879s
Request 14: 0.039724s
Request 15: 0.050184s
Request 16: 0.047651s
Request 17: 0.042509s
Request 18: 0.046008s
Request 19: 0.043229s
Request 20: 0.049614s

==========================================
Results:
==========================================
Min:     0.0380s
Max:     0.0529s
Average: 0.0447s
Median:  0.0440s

vs on main:

Running benchmark...
Request 1: 0.041241s
Request 2: 0.049858s
Request 3: 0.047197s
Request 4: 0.050239s
Request 5: 0.047043s
Request 6: 0.045739s
Request 7: 0.059040s
Request 8: 0.065837s
Request 9: 0.043678s
Request 10: 0.047911s
Request 11: 0.050948s
Request 12: 0.049941s
Request 13: 0.045670s
Request 14: 0.047399s
Request 15: 0.050467s
Request 16: 0.046239s
Request 17: 0.060257s
Request 18: 0.037534s
Request 19: 0.046157s
Request 20: 0.040043s

==========================================
Results:
==========================================
Min:     0.0375s
Max:     0.0658s
Average: 0.0486s
Median:  0.0473s

I ran this a bunch of times and the results seemed to be a bit faster subjectively when I was watching the output, both in the terminal and rendering the page.


grade = serializers.FloatField(min_value=0.0, max_value=1.0)
grade = serializers.FloatField(read_only=True, min_value=0.0, max_value=1.0)

Copy link
Contributor

Choose a reason for hiding this comment

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

To fix the OpenAPI spec issue, we could add letter_grade to the serializer here:

    letter_grade = serializers.CharField(
        read_only=True, max_length=6, allow_null=True
    )

The spec error is complaining about the max length being changed to unlimited from 6, so this fixes that.

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.

2 participants