Fix certificates API for old deleted XML course certificates.

Certificates API is retuning 500 error for old XML courses in which learners
have a valid certificate.

PROD-1247
This commit is contained in:
Waheed Ahmed
2020-02-13 16:22:35 +05:00
parent 230bee9a06
commit 9bd85dc929
2 changed files with 46 additions and 1 deletions

View File

@@ -384,3 +384,29 @@ class CertificatesListRestApiTest(AuthAndScopesTestMixin, SharedModuleStoreTestC
kwargs = {"certificate_uuid": self.cert.verify_uuid}
expected_download_url = reverse('certificates:render_cert_by_uuid', kwargs=kwargs)
self.assert_success_response_for_student(response, download_url=expected_download_url)
@patch('lms.djangoapps.certificates.apis.v0.views.get_course_run_details')
def test_certificate_without_course(self, mock_get_course_run_details):
"""
Verify that certificates are returned for deleted XML courses.
"""
expected_course_name = 'Test Course Title'
mock_get_course_run_details.return_value = {'title': expected_course_name}
xml_course_key = self.store.make_course_key('edX', 'testDeletedCourse', '2020')
cert_for_deleted_course = GeneratedCertificateFactory.create(
user=self.student,
course_id=xml_course_key,
status=CertificateStatuses.downloadable,
mode='honor',
download_url='www.edx.org/honor-cert-for-deleted-course.pdf',
grade="0.88"
)
response = self.get_response(
AuthType.jwt,
requesting_user=self.student,
requested_user=self.student,
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertContains(response, cert_for_deleted_course.download_url)
self.assertContains(response, expected_course_name)

View File

@@ -18,6 +18,7 @@ from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from lms.djangoapps.certificates.api import get_certificate_for_user, get_certificates_for_user
from openedx.core.djangoapps.catalog.utils import get_course_run_details
from openedx.core.djangoapps.certificates.api import certificates_viewable_for_course
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from openedx.core.djangoapps.user_api.accounts.api import visible_fields
@@ -270,14 +271,32 @@ class CertificatesListView(APIView):
for course_key, course_overview in CourseOverview.get_from_ids(
list(passing_certificates.keys())
).items():
if not course_overview:
# For deleted XML courses in which learners have a valid certificate.
# i.e. MITx/7.00x/2013_Spring
course_overview = self._get_pseudo_course_overview(course_key)
if certificates_viewable_for_course(course_overview):
course_certificate = passing_certificates[course_key]
# add certificate into viewable certificate list only if it's a PDF certificate
# or there is an active certificate configuration.
if course_certificate['is_pdf_certificate'] or course_overview.has_any_active_web_certificate:
course_certificate['course_display_name'] = course_overview.display_name_with_default
course_display_name = course_overview.display_name
if not course_overview.pk:
course_display_name = course_overview.display_name_with_default
course_certificate['course_display_name'] = course_display_name
course_certificate['course_organization'] = course_overview.display_org_with_default
viewable_certificates.append(course_certificate)
viewable_certificates.sort(key=lambda certificate: certificate['created'])
return viewable_certificates
def _get_pseudo_course_overview(self, course_key):
"""
Returns a pseudo course overview object for deleted courses.
"""
course_run = get_course_run_details(course_key, ['title'])
return CourseOverview(
display_name=course_run.get('title'),
display_org_with_default=course_key.org,
certificates_show_before_end=True
)