If enrollment mode is credit then upgrade message should not appear.
Fixing certificates for credit mode. ECOM-1988
This commit is contained in:
@@ -111,6 +111,8 @@ class GeneratedCertificate(models.Model):
|
||||
|
||||
MODES = Choices('verified', 'honor', 'audit')
|
||||
|
||||
VERIFIED_CERTS_MODES = [CourseMode.VERIFIED, CourseMode.CREDIT_MODE]
|
||||
|
||||
user = models.ForeignKey(User)
|
||||
course_id = CourseKeyField(max_length=255, blank=True, default=None)
|
||||
verify_uuid = models.CharField(max_length=32, blank=True, default='')
|
||||
|
||||
@@ -15,6 +15,7 @@ from courseware import grades
|
||||
from xmodule.modulestore.django import modulestore
|
||||
from capa.xqueue_interface import XQueueInterface
|
||||
from capa.xqueue_interface import make_xheader, make_hashkey
|
||||
from course_modes.models import CourseMode
|
||||
from student.models import UserProfile, CourseEnrollment
|
||||
from verify_student.models import SoftwareSecurePhotoVerification
|
||||
|
||||
@@ -256,9 +257,14 @@ class XQueueCertInterface(object):
|
||||
is_whitelisted = self.whitelist.filter(user=student, course_id=course_id, whitelist=True).exists()
|
||||
grade = grades.grade(student, self.request, course)
|
||||
enrollment_mode, __ = CourseEnrollment.enrollment_mode_for_user(student, course_id)
|
||||
mode_is_verified = (enrollment_mode == GeneratedCertificate.MODES.verified)
|
||||
mode_is_verified = enrollment_mode in GeneratedCertificate.VERIFIED_CERTS_MODES
|
||||
user_is_verified = SoftwareSecurePhotoVerification.user_is_verified(student)
|
||||
cert_mode = enrollment_mode
|
||||
|
||||
# For credit mode generate verified certificate
|
||||
if cert_mode == CourseMode.CREDIT_MODE:
|
||||
cert_mode = CourseMode.VERIFIED
|
||||
|
||||
if mode_is_verified and user_is_verified:
|
||||
template_pdf = "certificate-template-{id.org}-{id.course}-verified.pdf".format(id=course_id)
|
||||
elif mode_is_verified and not user_is_verified:
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Tests for the XQueue certificates interface. """
|
||||
from contextlib import contextmanager
|
||||
import ddt
|
||||
import json
|
||||
from mock import patch, Mock
|
||||
from nose.plugins.attrib import attr
|
||||
@@ -28,8 +29,10 @@ from certificates.models import (
|
||||
GeneratedCertificate,
|
||||
CertificateStatuses,
|
||||
)
|
||||
from verify_student.tests.factories import SoftwareSecurePhotoVerificationFactory
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
@attr('shard_1')
|
||||
@override_settings(CERT_QUEUE='certificates')
|
||||
class XQueueCertInterfaceAddCertificateTest(ModuleStoreTestCase):
|
||||
@@ -46,6 +49,8 @@ class XQueueCertInterfaceAddCertificateTest(ModuleStoreTestCase):
|
||||
mode="honor",
|
||||
)
|
||||
self.xqueue = XQueueCertInterface()
|
||||
self.user_2 = UserFactory.create()
|
||||
SoftwareSecurePhotoVerificationFactory.create(user=self.user_2, status='approved')
|
||||
|
||||
def test_add_cert_callback_url(self):
|
||||
with patch('courseware.grades.grade', Mock(return_value={'grade': 'Pass', 'percent': 0.75})):
|
||||
@@ -73,6 +78,50 @@ class XQueueCertInterfaceAddCertificateTest(ModuleStoreTestCase):
|
||||
self.assertEqual(certificate.status, CertificateStatuses.downloadable)
|
||||
self.assertIsNotNone(certificate.verify_uuid)
|
||||
|
||||
@ddt.data('honor', 'audit')
|
||||
def test_add_cert_with_honor_certificates(self, mode):
|
||||
"""Test certificates generations for honor and audit modes."""
|
||||
template_name = 'certificate-template-{id.org}-{id.course}.pdf'.format(
|
||||
id=self.course.id
|
||||
)
|
||||
self.assert_queue_response(mode, mode, template_name)
|
||||
|
||||
@ddt.data('credit', 'verified')
|
||||
def test_add_cert_with_verified_certificates(self, mode):
|
||||
"""Test if enrollment mode is verified or credit along with valid
|
||||
software-secure verification than verified certificate should be generated.
|
||||
"""
|
||||
template_name = 'certificate-template-{id.org}-{id.course}-verified.pdf'.format(
|
||||
id=self.course.id
|
||||
)
|
||||
|
||||
self.assert_queue_response(mode, 'verified', template_name)
|
||||
|
||||
def assert_queue_response(self, mode, expected_mode, expected_template_name):
|
||||
"""Dry method for course enrollment and adding request to queue."""
|
||||
CourseEnrollmentFactory(
|
||||
user=self.user_2,
|
||||
course_id=self.course.id,
|
||||
is_active=True,
|
||||
mode=mode,
|
||||
)
|
||||
with patch('courseware.grades.grade', Mock(return_value={'grade': 'Pass', 'percent': 0.75})):
|
||||
with patch.object(XQueueInterface, 'send_to_queue') as mock_send:
|
||||
mock_send.return_value = (0, None)
|
||||
self.xqueue.add_cert(self.user_2, self.course.id)
|
||||
|
||||
# Verify that the task was sent to the queue with the correct callback URL
|
||||
self.assertTrue(mock_send.called)
|
||||
__, kwargs = mock_send.call_args_list[0]
|
||||
|
||||
actual_header = json.loads(kwargs['header'])
|
||||
self.assertIn('https://edx.org/update_certificate?key=', actual_header['lms_callback_url'])
|
||||
certificate = GeneratedCertificate.objects.get(user=self.user_2, course_id=self.course.id)
|
||||
self.assertEqual(certificate.mode, expected_mode)
|
||||
|
||||
body = json.loads(kwargs['body'])
|
||||
self.assertIn(expected_template_name, body['template_pdf'])
|
||||
|
||||
|
||||
@attr('shard_1')
|
||||
@override_settings(CERT_QUEUE='certificates')
|
||||
|
||||
Reference in New Issue
Block a user