SIGN IN SIGN UP

feat: fix OpenAPI schemas for SDK compatibility (#38845)

* feat: fix OpenAPI schemas for SDK compatibility

Three changes driven by integration testing with openedx-platform-sdk:

1. authoring_grading serializer — expose grade_cutoffs, grace_period,
   and minimum_grade_credit as proper typed schema fields.
   CourseGradingModel.update_from_json requires all three, but they were
   absent from the serializer so the generated SDK had no typed fields for
   them, forcing callers to smuggle values in via additional_properties.
   Adds GracePeriodSerializer (hours / minutes / seconds) and documents
   that grade_cutoffs and grace_period must be present in every PATCH.

2. course_details serializer — mark certificate_available_date as
   allow_null=True. The field is legitimately null for many courses, but
   the missing flag caused the SDK client to crash with
   fromisoformat(None) when deserialising the response.

3. v4 HomeCoursesViewSet — add _HomeCoursesAutoSchema (same pattern as
   the existing v3 _HomeAutoSchema). The viewset builds its paginator
   manually inside list() rather than via pagination_class, so
   drf-spectacular's _is_list_view() returns True and generates an array
   schema. Overriding _is_list_view() for the list action and using an
   inline_serializer makes the schema reflect the actual paginated object
   shape (count, num_pages, current_page, start, next, previous,
   results).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: sort imports in v4 home view to satisfy ruff I001

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: wrap long lines in v4 home view inline_serializer fields

Fixes pylint C0301 (line-too-long) — lines 175 and 177 exceeded the
120-character limit.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
M
Muhammad Faraz Maqsood committed
ef554c5b61b98f052dbe81178a0287912bb6c70d
Parent: 8ce7291
Committed by Feanil Patel <feanil@axim.org> on 7/29/2026, 2:26:48 PM