Merge pull request #31588 from mitodl/aliraza/mitxonline/1339-add-certificate_available_date-in-edXs-course-details-API

feat: Add "certificate_available_date" in edX's Course Details API
This commit is contained in:
Peter Pinch
2023-02-23 21:04:27 -05:00
committed by GitHub
5 changed files with 50 additions and 3 deletions

View File

@@ -2196,6 +2196,9 @@ paths:
* `"timestamp"`: generated from the `start` timestamp
* `"empty"`: no start date is specified
* pacing: Course pacing. Possible values: instructor, self
* certificate_available_date (optional): Date the certificate will be available,
in ISO 8601 notation if the `certificates.auto_certificate_generation`
waffle switch is enabled
Deprecated fields:
@@ -2240,7 +2243,8 @@ paths:
"start": "2015-07-17T12:00:00Z",
"start_display": "July 17, 2015",
"start_type": "timestamp",
"pacing": "instructor"
"pacing": "instructor",
"certificate_available_date": "2015-08-14T00:00:00Z"
}
parameters: []
responses:

View File

@@ -9,6 +9,7 @@ from django.urls import reverse
from edx_django_utils import monitoring as monitoring_utils
from rest_framework import serializers
from lms.djangoapps.certificates.api import can_show_certificate_available_date_field
from openedx.core.djangoapps.content.course_overviews.models import \
CourseOverview # lint-amnesty, pylint: disable=unused-import
from openedx.core.djangoapps.models.course_details import CourseDetails
@@ -159,6 +160,16 @@ class CourseDetailSerializer(CourseSerializer): # pylint: disable=abstract-meth
# from the CourseOverview object in SQL.
return CourseDetails.fetch_about_attribute(course_overview.id, 'overview')
def to_representation(self, instance):
"""
Get the `certificate_available_date` in response
if the `certificates.auto_certificate_generation` waffle switch is enabled
"""
response = super().to_representation(instance)
if can_show_certificate_available_date_field(instance):
response['certificate_available_date'] = instance.certificate_available_date
return response
class CourseKeySerializer(serializers.BaseSerializer): # pylint:disable=abstract-method
"""

View File

@@ -25,6 +25,7 @@ class CourseApiFactoryMixin:
end=end,
enrollment_start=datetime(2015, 6, 15, 0, 0, 0),
enrollment_end=datetime(2015, 7, 15, 0, 0, 0),
certificate_available_date=datetime(2015, 8, 14, 0, 0, 0),
emit_signals=True,
**kwargs
)

View File

@@ -4,7 +4,7 @@ Test data created by CourseSerializer and CourseDetailSerializer
from datetime import datetime
from unittest import TestCase
from unittest import TestCase, mock
import ddt
from opaque_keys.edx.locator import CourseLocator
@@ -15,6 +15,7 @@ from xmodule.course_block import DEFAULT_START_DATE
from xmodule.modulestore.tests.django_utils import TEST_DATA_MONGO_AMNESTY_MODULESTORE, ModuleStoreTestCase
from xmodule.modulestore.tests.factories import check_mongo_calls
from lms.djangoapps.certificates.api import can_show_certificate_available_date_field
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from openedx.core.djangoapps.models.course_details import CourseDetails
@@ -166,6 +167,32 @@ class TestCourseDetailSerializer(TestCourseSerializer): # lint-amnesty, pylint:
overview_template = about_descriptor.get_template('overview.yaml')
self.expected_data['overview'] = overview_template.get('data')
# override test case
@mock.patch(
"lms.djangoapps.certificates.api.can_show_certificate_available_date_field",
mock.Mock(return_value=[True, False])
)
def test_basic(self):
"""
Overridden from Test CourseDetailSerializer to
test certificate_available_date according to waffle
switch `certificates.auto_certificate_generation`
from CourseDetailSerializer serializer class.
"""
course = self.create_course()
CourseDetails.update_about_video(course, 'test_youtube_id', self.staff_user.id)
course_overview = CourseOverview.get_from_id(course.id)
with check_mongo_calls(self.expected_mongo_calls):
result = self._get_result(course)
if can_show_certificate_available_date_field(course_overview):
self.expected_data['certificate_available_date'] = '2015-08-14T00:00:00Z'
result['certificate_available_date'] = (
result['certificate_available_date'].strftime('%Y-%m-%dT%H:%M:%SZ')
if isinstance(result['certificate_available_date'], datetime)
else None
)
self.assertDictEqual(result, self.expected_data)
class TestCourseKeySerializer(TestCase): # lint-amnesty, pylint: disable=missing-class-docstring

View File

@@ -59,6 +59,9 @@ class CourseDetailView(DeveloperErrorViewMixin, RetrieveAPIView):
* `"timestamp"`: generated from the `start` timestamp
* `"empty"`: no start date is specified
* pacing: Course pacing. Possible values: instructor, self
* certificate_available_date (optional): Date the certificate will be available,
in ISO 8601 notation if the `certificates.auto_certificate_generation`
waffle switch is enabled
Deprecated fields:
@@ -103,7 +106,8 @@ class CourseDetailView(DeveloperErrorViewMixin, RetrieveAPIView):
"start": "2015-07-17T12:00:00Z",
"start_display": "July 17, 2015",
"start_type": "timestamp",
"pacing": "instructor"
"pacing": "instructor",
"certificate_available_date": "2015-08-14T00:00:00Z"
}
"""