Commit 2e00fd58 by Simon Chen Committed by GitHub

Merge pull request #14116 from edx/schen/ECOM-5790

Support the display of downloadable PDF course certs
parents 1b5597af 6dbfb326
...@@ -2,10 +2,12 @@ ...@@ -2,10 +2,12 @@
from contextlib import contextmanager from contextlib import contextmanager
import ddt import ddt
from functools import wraps from functools import wraps
import uuid
from django.test import TestCase, RequestFactory from django.test import TestCase, RequestFactory
from django.test.utils import override_settings from django.test.utils import override_settings
from django.conf import settings from django.conf import settings
from django.core.urlresolvers import reverse
from mock import patch from mock import patch
from nose.plugins.attrib import attr from nose.plugins.attrib import attr
from opaque_keys.edx.locator import CourseLocator from opaque_keys.edx.locator import CourseLocator
...@@ -323,43 +325,48 @@ class CertificateGetTests(SharedModuleStoreTestCase): ...@@ -323,43 +325,48 @@ class CertificateGetTests(SharedModuleStoreTestCase):
super(CertificateGetTests, cls).setUpClass() super(CertificateGetTests, cls).setUpClass()
cls.student = UserFactory() cls.student = UserFactory()
cls.student_no_cert = UserFactory() cls.student_no_cert = UserFactory()
cls.course_1 = CourseFactory.create( cls.uuid = uuid.uuid4().hex
cls.web_cert_course = CourseFactory.create(
org='edx', org='edx',
number='verified_1', number='verified_1',
display_name='Verified Course 1' display_name='Verified Course 1',
cert_html_view_enabled=True
) )
cls.course_2 = CourseFactory.create( cls.pdf_cert_course = CourseFactory.create(
org='edx', org='edx',
number='verified_2', number='verified_2',
display_name='Verified Course 2' display_name='Verified Course 2',
cert_html_view_enabled=False
) )
# certificate for the first course # certificate for the first course
GeneratedCertificateFactory.create( GeneratedCertificateFactory.create(
user=cls.student, user=cls.student,
course_id=cls.course_1.id, course_id=cls.web_cert_course.id,
status=CertificateStatuses.downloadable, status=CertificateStatuses.downloadable,
mode='verified', mode='verified',
download_url='www.google.com', download_url='www.google.com',
grade="0.88", grade="0.88",
verify_uuid=cls.uuid,
) )
# certificate for the second course # certificate for the second course
GeneratedCertificateFactory.create( GeneratedCertificateFactory.create(
user=cls.student, user=cls.student,
course_id=cls.course_2.id, course_id=cls.pdf_cert_course.id,
status=CertificateStatuses.downloadable, status=CertificateStatuses.downloadable,
mode='honor', mode='honor',
download_url='www.gmail.com', download_url='www.gmail.com',
grade="0.99", grade="0.99",
verify_uuid=cls.uuid,
) )
def test_get_certificate_for_user(self): def test_get_certificate_for_user(self):
""" """
Test to get a certificate for a user for a specific course. Test to get a certificate for a user for a specific course.
""" """
cert = certs_api.get_certificate_for_user(self.student.username, self.course_1.id) cert = certs_api.get_certificate_for_user(self.student.username, self.web_cert_course.id)
self.assertEqual(cert['username'], self.student.username) self.assertEqual(cert['username'], self.student.username)
self.assertEqual(cert['course_key'], self.course_1.id) self.assertEqual(cert['course_key'], self.web_cert_course.id)
self.assertEqual(cert['type'], CourseMode.VERIFIED) self.assertEqual(cert['type'], CourseMode.VERIFIED)
self.assertEqual(cert['status'], CertificateStatuses.downloadable) self.assertEqual(cert['status'], CertificateStatuses.downloadable)
self.assertEqual(cert['grade'], "0.88") self.assertEqual(cert['grade'], "0.88")
...@@ -373,8 +380,8 @@ class CertificateGetTests(SharedModuleStoreTestCase): ...@@ -373,8 +380,8 @@ class CertificateGetTests(SharedModuleStoreTestCase):
self.assertEqual(len(certs), 2) self.assertEqual(len(certs), 2)
self.assertEqual(certs[0]['username'], self.student.username) self.assertEqual(certs[0]['username'], self.student.username)
self.assertEqual(certs[1]['username'], self.student.username) self.assertEqual(certs[1]['username'], self.student.username)
self.assertEqual(certs[0]['course_key'], self.course_1.id) self.assertEqual(certs[0]['course_key'], self.web_cert_course.id)
self.assertEqual(certs[1]['course_key'], self.course_2.id) self.assertEqual(certs[1]['course_key'], self.pdf_cert_course.id)
self.assertEqual(certs[0]['type'], CourseMode.VERIFIED) self.assertEqual(certs[0]['type'], CourseMode.VERIFIED)
self.assertEqual(certs[1]['type'], CourseMode.HONOR) self.assertEqual(certs[1]['type'], CourseMode.HONOR)
self.assertEqual(certs[0]['status'], CertificateStatuses.downloadable) self.assertEqual(certs[0]['status'], CertificateStatuses.downloadable)
...@@ -389,7 +396,7 @@ class CertificateGetTests(SharedModuleStoreTestCase): ...@@ -389,7 +396,7 @@ class CertificateGetTests(SharedModuleStoreTestCase):
Test the case when there is no certificate for a user for a specific course. Test the case when there is no certificate for a user for a specific course.
""" """
self.assertIsNone( self.assertIsNone(
certs_api.get_certificate_for_user(self.student_no_cert.username, self.course_1.id) certs_api.get_certificate_for_user(self.student_no_cert.username, self.web_cert_course.id)
) )
def test_no_certificates_for_user(self): def test_no_certificates_for_user(self):
...@@ -401,6 +408,48 @@ class CertificateGetTests(SharedModuleStoreTestCase): ...@@ -401,6 +408,48 @@ class CertificateGetTests(SharedModuleStoreTestCase):
[] []
) )
@patch.dict(settings.FEATURES, {'CERTIFICATES_HTML_VIEW': True})
def test_get_web_certificate_url(self):
"""
Test the get_certificate_url with a web cert course
"""
expected_url = reverse(
'certificates:render_cert_by_uuid',
kwargs=dict(certificate_uuid=self.uuid)
)
cert_url = certs_api.get_certificate_url(
user_id=self.student.id, # pylint: disable=no-member
course_id=self.web_cert_course.id,
uuid=self.uuid
)
self.assertEqual(expected_url, cert_url)
expected_url = reverse(
'certificates:html_view',
kwargs={
"user_id": str(self.student.id), # pylint: disable=no-member
"course_id": unicode(self.web_cert_course.id),
}
)
cert_url = certs_api.get_certificate_url(
user_id=self.student.id, # pylint: disable=no-member
course_id=self.web_cert_course.id
)
self.assertEqual(expected_url, cert_url)
@patch.dict(settings.FEATURES, {'CERTIFICATES_HTML_VIEW': True})
def test_get_pdf_certificate_url(self):
"""
Test the get_certificate_url with a pdf cert course
"""
cert_url = certs_api.get_certificate_url(
user_id=self.student.id, # pylint: disable=no-member
course_id=self.pdf_cert_course.id,
uuid=self.uuid
)
self.assertEqual('www.gmail.com', cert_url)
@attr(shard=1) @attr(shard=1)
@override_settings(CERT_QUEUE='certificates') @override_settings(CERT_QUEUE='certificates')
......
...@@ -373,6 +373,8 @@ class ProgramDataExtender(object): ...@@ -373,6 +373,8 @@ class ProgramDataExtender(object):
certificate_data = certificate_api.certificate_downloadable_status(self.user, self.course_key) certificate_data = certificate_api.certificate_downloadable_status(self.user, self.course_key)
certificate_uuid = certificate_data.get('uuid') certificate_uuid = certificate_data.get('uuid')
run_mode['certificate_url'] = certificate_api.get_certificate_url( run_mode['certificate_url'] = certificate_api.get_certificate_url(
user_id=self.user.id, # Providing user_id allows us to fall back to PDF certificates
# if web certificates are not configured for a given course.
course_id=self.course_key, course_id=self.course_key,
uuid=certificate_uuid, uuid=certificate_uuid,
) if certificate_uuid else None ) if certificate_uuid else None
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment