Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 2 additions & 27 deletions lms/djangoapps/certificates/generation.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,15 @@
import logging
from uuid import uuid4

from common.djangoapps.student.models import CourseEnrollment, UserProfile
from common.djangoapps.student.models import UserProfile
from lms.djangoapps.certificates.data import CertificateStatuses
from lms.djangoapps.certificates.models import GeneratedCertificate
from lms.djangoapps.certificates.utils import emit_certificate_event
from lms.djangoapps.grades.api import CourseGradeFactory

log = logging.getLogger(__name__)


def generate_course_certificate(user, course_key, status, enrollment_mode=None, course_grade=None,
generation_mode=None):
def generate_course_certificate(user, course_key, status, enrollment_mode, course_grade, generation_mode):
"""
Generate a course certificate for this user, in this course run. If the certificate has a passing status, also emit
a certificate event.
Expand All @@ -37,13 +35,6 @@ def generate_course_certificate(user, course_key, status, enrollment_mode=None,
generation_mode: used when emitting an event. Options are "self" (implying the user generated the cert
themself) and "batch" for everything else.
"""
if not enrollment_mode:
enrollment_mode = _get_enrollment_mode(user, course_key)
if not course_grade:
course_grade = _get_course_grade(user, course_key)
if not generation_mode:
generation_mode = 'batch'

cert = _generate_certificate(user=user, course_key=course_key, status=status, enrollment_mode=enrollment_mode,
course_grade=course_grade)

Expand Down Expand Up @@ -109,19 +100,3 @@ def _generate_certificate(user, course_key, status, enrollment_mode, course_grad
log.info(f'Generated certificate with status {cert.status}, mode {cert.mode} and grade {cert.grade} for {user.id} '
f': {course_key}. {created_msg}')
return cert


def _get_course_grade(user, course_key):
"""
Get the user's course grade in this course run
"""
course_grade = CourseGradeFactory().read(user, course_key=course_key)
return course_grade.percent


def _get_enrollment_mode(user, course_key):
"""
Get the user's enrollment mode in this course run
"""
enrollment_mode, __ = CourseEnrollment.enrollment_mode_for_user(user, course_key)
return enrollment_mode
16 changes: 8 additions & 8 deletions lms/djangoapps/certificates/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,20 @@ def generate_certificate(self, **kwargs): # pylint: disable=unused-argument
Generates a certificate for a single user.

kwargs:
- student: The student for whom to generate a certificate.
- student: The student for whom to generate a certificate. Required.
- course_key: The course key for the course that the student is
receiving a certificate in.
- status: Certificate status (value from the CertificateStatuses model)
- enrollment_mode: user's enrollment mode (ex. verified)
- course_grade: user's course grade
receiving a certificate in. Required.
- status: Certificate status (value from the CertificateStatuses model). Defaults to 'downloadable'.
- enrollment_mode: User's enrollment mode (ex. verified). Required.
- course_grade: User's course grade. Defaults to ''.
- generation_mode: Used when emitting an event. Options are "self" (implying the user generated the cert
themself) and "batch" for everything else.
themself) and "batch" for everything else. Defaults to 'batch'.
"""
student = User.objects.get(id=kwargs.pop('student'))
course_key = CourseKey.from_string(kwargs.pop('course_key'))
status = kwargs.pop('status', CertificateStatuses.downloadable)
enrollment_mode = kwargs.pop('enrollment_mode', None)
course_grade = kwargs.pop('course_grade', None)
enrollment_mode = kwargs.pop('enrollment_mode')
course_grade = kwargs.pop('course_grade', '')
generation_mode = kwargs.pop('generation_mode', 'batch')

generate_course_certificate(user=student, course_key=course_key, status=status, enrollment_mode=enrollment_mode,
Expand Down
19 changes: 0 additions & 19 deletions lms/djangoapps/certificates/tests/test_generation.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
Tests for certificate generation
"""
import logging
from unittest import mock

from common.djangoapps.course_modes.models import CourseMode
from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
Expand All @@ -16,9 +15,6 @@

log = logging.getLogger(__name__)

ENROLLMENT_METHOD = 'lms.djangoapps.certificates.generation._get_enrollment_mode'
GRADE_METHOD = 'lms.djangoapps.certificates.generation._get_course_grade'


class CertificateTests(EventTestMixin, ModuleStoreTestCase):
"""
Expand Down Expand Up @@ -163,18 +159,3 @@ def test_generation_creates_verify_uuid_when_needed(self):
self.enrollment_mode, self.grade, self.gen_mode)
assert generated_cert.status, CertificateStatuses.downloadable
assert generated_cert.verify_uuid != ''

def test_generation_few_params(self):
"""
Test that ensures we retrieve values as needed
"""
grade = '.33'
enrollment_mode = CourseMode.AUDIT

with mock.patch(ENROLLMENT_METHOD, return_value=enrollment_mode):
with mock.patch(GRADE_METHOD, return_value=grade):
generated_cert = generate_course_certificate(self.u, self.key, CertificateStatuses.downloadable)

assert generated_cert.status, CertificateStatuses.downloadable
assert generated_cert.mode, enrollment_mode
assert generated_cert.grade, grade
26 changes: 16 additions & 10 deletions lms/djangoapps/certificates/tests/test_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,16 @@ def setUp(self):
super().setUp()

self.user = UserFactory()
self.course_key = 'course-v1:edX+DemoX+Demo_Course'

@ddt.data('student', 'course_key')
@ddt.data('student', 'course_key', 'enrollment_mode')
def test_missing_args(self, missing_arg):
kwargs = {'student': 'a', 'course_key': 'b', 'otherarg': 'c'}
kwargs = {
'student': self.user.id,
'course_key': self.course_key,
'other_arg': 'shiny',
'enrollment_mode': CourseMode.MASTERS
}
del kwargs[missing_arg]

with patch('lms.djangoapps.certificates.tasks.User.objects.get'):
Expand All @@ -39,32 +45,32 @@ def test_generation(self):
"""
Verify the task handles certificate generation
"""
course_key = 'course-v1:edX+DemoX+Demo_Course'
enrollment_mode = CourseMode.VERIFIED

with mock.patch(
'lms.djangoapps.certificates.tasks.generate_course_certificate',
return_value=None
) as mock_generate_cert:
kwargs = {
'student': self.user.id,
'course_key': course_key
'course_key': self.course_key,
'enrollment_mode': enrollment_mode
}

generate_certificate.apply_async(kwargs=kwargs)
mock_generate_cert.assert_called_with(
user=self.user,
course_key=CourseKey.from_string(course_key),
course_key=CourseKey.from_string(self.course_key),
status=CertificateStatuses.downloadable,
enrollment_mode=None,
course_grade=None,
enrollment_mode=enrollment_mode,
course_grade='',
generation_mode='batch'
)

def test_generation_custom(self):
"""
Verify the task handles certificate generation custom params
"""
course_key = 'course-v1:edX+DemoX+Demo_Course'
gen_mode = 'self'
status = CertificateStatuses.notpassing
enrollment_mode = CourseMode.AUDIT
Expand All @@ -77,7 +83,7 @@ def test_generation_custom(self):
kwargs = {
'status': status,
'student': self.user.id,
'course_key': course_key,
'course_key': self.course_key,
'course_grade': course_grade,
'enrollment_mode': enrollment_mode,
'generation_mode': gen_mode,
Expand All @@ -87,7 +93,7 @@ def test_generation_custom(self):
generate_certificate.apply_async(kwargs=kwargs)
mock_generate_cert.assert_called_with(
user=self.user,
course_key=CourseKey.from_string(course_key),
course_key=CourseKey.from_string(self.course_key),
status=status,
enrollment_mode=enrollment_mode,
course_grade=course_grade,
Expand Down