Skip to content
Snippets Groups Projects
Unverified Commit 08877db8 authored by adeelehsan's avatar adeelehsan Committed by GitHub
Browse files

Merge pull request #22243 from edx/aehsan/prod-612/allow_certificate_regenration_for_exisiting

Allow certification regenration for existing honor certificates
parents 9543f4c1 1adc01b4
No related branches found
No related tags found
No related merge requests found
...@@ -757,7 +757,7 @@ class CourseMode(models.Model): ...@@ -757,7 +757,7 @@ class CourseMode(models.Model):
return min(mode.min_price for mode in modes if mode.currency.lower() == currency.lower()) return min(mode.min_price for mode in modes if mode.currency.lower() == currency.lower())
@classmethod @classmethod
def is_eligible_for_certificate(cls, mode_slug): def is_eligible_for_certificate(cls, mode_slug, status=None):
""" """
Returns whether or not the given mode_slug is eligible for a Returns whether or not the given mode_slug is eligible for a
certificate. Currently all modes other than 'audit' grant a certificate. Currently all modes other than 'audit' grant a
...@@ -769,7 +769,11 @@ class CourseMode(models.Model): ...@@ -769,7 +769,11 @@ class CourseMode(models.Model):
ineligible_modes = [cls.AUDIT] ineligible_modes = [cls.AUDIT]
if settings.FEATURES['DISABLE_HONOR_CERTIFICATES']: if settings.FEATURES['DISABLE_HONOR_CERTIFICATES']:
ineligible_modes.append(cls.HONOR) # Adding check so that we can regenerate the certificate for learners who have
# already earned the certificate using honor mode
from lms.djangoapps.certificates.models import CertificateStatuses
if mode_slug == cls.HONOR and status != CertificateStatuses.downloadable:
ineligible_modes.append(cls.HONOR)
return mode_slug not in ineligible_modes return mode_slug not in ineligible_modes
......
...@@ -291,7 +291,8 @@ class XQueueCertInterface(object): ...@@ -291,7 +291,8 @@ class XQueueCertInterface(object):
mode_is_verified = enrollment_mode in GeneratedCertificate.VERIFIED_CERTS_MODES mode_is_verified = enrollment_mode in GeneratedCertificate.VERIFIED_CERTS_MODES
user_is_verified = IDVerificationService.user_is_verified(student) user_is_verified = IDVerificationService.user_is_verified(student)
cert_mode = enrollment_mode cert_mode = enrollment_mode
is_eligible_for_certificate = is_whitelisted or CourseMode.is_eligible_for_certificate(enrollment_mode) is_eligible_for_certificate = is_whitelisted or CourseMode.is_eligible_for_certificate(enrollment_mode,
cert_status)
unverified = False unverified = False
# For credit mode generate verified certificate # For credit mode generate verified certificate
if cert_mode in (CourseMode.CREDIT_MODE, CourseMode.MASTERS): if cert_mode in (CourseMode.CREDIT_MODE, CourseMode.MASTERS):
......
...@@ -8,11 +8,14 @@ import json ...@@ -8,11 +8,14 @@ import json
import ddt import ddt
import six import six
from mock import patch
from django.conf import settings from django.conf import settings
from django.test.utils import override_settings from django.test.utils import override_settings
from django.urls import reverse from django.urls import reverse
from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.keys import CourseKey
from lms.djangoapps.grades.tests.utils import mock_passing_grade
from lms.djangoapps.certificates import api
from lms.djangoapps.certificates.models import CertificateInvalidation, CertificateStatuses, GeneratedCertificate from lms.djangoapps.certificates.models import CertificateInvalidation, CertificateStatuses, GeneratedCertificate
from lms.djangoapps.certificates.tests.factories import CertificateInvalidationFactory from lms.djangoapps.certificates.tests.factories import CertificateInvalidationFactory
from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory
...@@ -22,6 +25,7 @@ from student.tests.factories import UserFactory ...@@ -22,6 +25,7 @@ from student.tests.factories import UserFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.factories import CourseFactory
FEATURES_WITH_CERTS_ENABLED = settings.FEATURES.copy() FEATURES_WITH_CERTS_ENABLED = settings.FEATURES.copy()
FEATURES_WITH_CERTS_ENABLED['CERTIFICATES_HTML_VIEW'] = True FEATURES_WITH_CERTS_ENABLED['CERTIFICATES_HTML_VIEW'] = True
...@@ -299,6 +303,23 @@ class CertificateRegenerateTests(CertificateSupportTestCase): ...@@ -299,6 +303,23 @@ class CertificateRegenerateTests(CertificateSupportTestCase):
cert = GeneratedCertificate.eligible_certificates.get(user=self.student) cert = GeneratedCertificate.eligible_certificates.get(user=self.student)
self.assertEqual(cert.status, CertificateStatuses.notpassing) self.assertEqual(cert.status, CertificateStatuses.notpassing)
@patch('lms.djangoapps.certificates.queue.XQueueCertInterface._generate_cert')
def test_regenerate_certificate_for_honor_mode(self, mock_generate_cert):
"""Test web certificate regenration for the users who have earned the
certificate in honor mode
"""
self.cert.mode = 'honor'
self.cert.download_url = ''
self.cert.save()
with mock_passing_grade(percent=0.75):
with patch('course_modes.models.CourseMode.mode_for_course') as mock_mode_for_course:
mock_mode_for_course.return_value = 'honor'
api.regenerate_user_certificates(self.student, self.course.id,
course=self.course)
mock_generate_cert.assert_called()
def test_regenerate_certificate_missing_params(self): def test_regenerate_certificate_missing_params(self):
# Missing username # Missing username
response = self._regenerate(course_key=self.CERT_COURSE_KEY) response = self._regenerate(course_key=self.CERT_COURSE_KEY)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment