diff --git a/openedx/core/djangoapps/enrollments/serializers.py b/openedx/core/djangoapps/enrollments/serializers.py index decd06e218bb..7a0a68d2e93d 100644 --- a/openedx/core/djangoapps/enrollments/serializers.py +++ b/openedx/core/djangoapps/enrollments/serializers.py @@ -38,10 +38,13 @@ class CourseSerializer(serializers.Serializer): # pylint: disable=abstract-meth course_id = serializers.CharField(source="id") course_name = serializers.CharField(source="display_name_with_default") - enrollment_start = serializers.DateTimeField(format=None) - enrollment_end = serializers.DateTimeField(format=None) - course_start = serializers.DateTimeField(source="start", format=None) - course_end = serializers.DateTimeField(source="end", format=None) + # These are null for courses with no dates set, so they must be declared + # nullable — otherwise the published schema tells every generated client + # the fields are always present and parsing null raises. + enrollment_start = serializers.DateTimeField(format=None, allow_null=True) + enrollment_end = serializers.DateTimeField(format=None, allow_null=True) + course_start = serializers.DateTimeField(source="start", format=None, allow_null=True) + course_end = serializers.DateTimeField(source="end", format=None, allow_null=True) invite_only = serializers.BooleanField(source="invitation_only") course_modes = serializers.SerializerMethodField() pacing_type = serializers.SerializerMethodField() diff --git a/openedx/core/djangoapps/enrollments/v2/views.py b/openedx/core/djangoapps/enrollments/v2/views.py index 4b13e247d8f6..f5f192a521f8 100644 --- a/openedx/core/djangoapps/enrollments/v2/views.py +++ b/openedx/core/djangoapps/enrollments/v2/views.py @@ -402,6 +402,10 @@ def unenroll(self, request): url_path="enrollment_allowed", permission_classes=[permissions.IsAdminUser], throttle_classes=[EnrollmentUserThrottle], + # GET returns a plain list. Actions inherit the viewset's + # pagination_class, which would otherwise make drf-spectacular publish + # a paginated envelope this endpoint never returns. + pagination_class=None, ) def allowed(self, request): """Retrieve, create, or delete CourseEnrollmentAllowed records. Admin-only."""