Add course grades to programs dashboard.
This commit is contained in:
@@ -12,3 +12,4 @@ class ProgressFactory(factory.Factory):
|
||||
completed = 0
|
||||
in_progress = 0
|
||||
not_started = 0
|
||||
grades = dict()
|
||||
|
||||
@@ -18,6 +18,7 @@ from course_modes.models import CourseMode
|
||||
from lms.djangoapps.certificates.api import MODES
|
||||
from lms.djangoapps.commerce.tests.test_utils import update_commerce_config
|
||||
from lms.djangoapps.commerce.utils import EcommerceService
|
||||
from lms.djangoapps.grades.tests.utils import mock_passing_grade
|
||||
from openedx.core.djangoapps.catalog.tests.factories import (
|
||||
generate_course_run_key,
|
||||
ProgramFactory,
|
||||
@@ -138,7 +139,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
self.assertEqual(meter.engaged_programs, [program])
|
||||
self._assert_progress(
|
||||
meter,
|
||||
ProgressFactory(uuid=program['uuid'], in_progress=1)
|
||||
ProgressFactory(uuid=program['uuid'], in_progress=1, grades={course_run_key: 0.0})
|
||||
)
|
||||
self.assertEqual(meter.completed_programs, [])
|
||||
|
||||
@@ -169,7 +170,8 @@ class TestProgramProgressMeter(TestCase):
|
||||
uuid=program['uuid'],
|
||||
completed=[],
|
||||
in_progress=[program['courses'][0]],
|
||||
not_started=[]
|
||||
not_started=[],
|
||||
grades={course_run_key: 0.0},
|
||||
)
|
||||
]
|
||||
|
||||
@@ -205,7 +207,8 @@ class TestProgramProgressMeter(TestCase):
|
||||
uuid=program['uuid'],
|
||||
completed=[],
|
||||
in_progress=[program['courses'][0]],
|
||||
not_started=[]
|
||||
not_started=[],
|
||||
grades={course_run_key: 0.0},
|
||||
)
|
||||
]
|
||||
|
||||
@@ -246,7 +249,8 @@ class TestProgramProgressMeter(TestCase):
|
||||
uuid=program['uuid'],
|
||||
completed=0,
|
||||
in_progress=1 if offset in [None, 1] else 0,
|
||||
not_started=1 if offset in [-1] else 0
|
||||
not_started=1 if offset in [-1] else 0,
|
||||
grades={course_run_key: 0.0},
|
||||
)
|
||||
]
|
||||
|
||||
@@ -285,9 +289,14 @@ class TestProgramProgressMeter(TestCase):
|
||||
self._attach_detail_url(data)
|
||||
programs = data[:2]
|
||||
self.assertEqual(meter.engaged_programs, programs)
|
||||
|
||||
grades = {
|
||||
newer_course_run_key: 0.0,
|
||||
older_course_run_key: 0.0,
|
||||
}
|
||||
self._assert_progress(
|
||||
meter,
|
||||
*(ProgressFactory(uuid=program['uuid'], in_progress=1) for program in programs)
|
||||
*(ProgressFactory(uuid=program['uuid'], in_progress=1, grades=grades) for program in programs)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs, [])
|
||||
|
||||
@@ -330,9 +339,15 @@ class TestProgramProgressMeter(TestCase):
|
||||
self._attach_detail_url(data)
|
||||
programs = data[:3]
|
||||
self.assertEqual(meter.engaged_programs, programs)
|
||||
|
||||
grades = {
|
||||
solo_course_run_key: 0.0,
|
||||
shared_course_run_key: 0.0,
|
||||
}
|
||||
|
||||
self._assert_progress(
|
||||
meter,
|
||||
*(ProgressFactory(uuid=program['uuid'], in_progress=1) for program in programs)
|
||||
*(ProgressFactory(uuid=program['uuid'], in_progress=1, grades=grades) for program in programs)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs, [])
|
||||
|
||||
@@ -366,7 +381,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
program, program_uuid = data[0], data[0]['uuid']
|
||||
self._assert_progress(
|
||||
meter,
|
||||
ProgressFactory(uuid=program_uuid, in_progress=1, not_started=1)
|
||||
ProgressFactory(uuid=program_uuid, in_progress=1, not_started=1, grades={first_course_run_key: 0.0})
|
||||
)
|
||||
self.assertEqual(meter.completed_programs, [])
|
||||
|
||||
@@ -375,7 +390,14 @@ class TestProgramProgressMeter(TestCase):
|
||||
meter = ProgramProgressMeter(self.site, self.user)
|
||||
self._assert_progress(
|
||||
meter,
|
||||
ProgressFactory(uuid=program_uuid, in_progress=2)
|
||||
ProgressFactory(
|
||||
uuid=program_uuid,
|
||||
in_progress=2,
|
||||
grades={
|
||||
first_course_run_key: 0.0,
|
||||
second_course_run_key: 0.0,
|
||||
},
|
||||
)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs, [])
|
||||
|
||||
@@ -386,7 +408,15 @@ class TestProgramProgressMeter(TestCase):
|
||||
meter = ProgramProgressMeter(self.site, self.user)
|
||||
self._assert_progress(
|
||||
meter,
|
||||
ProgressFactory(uuid=program_uuid, completed=1, in_progress=1)
|
||||
ProgressFactory(
|
||||
uuid=program_uuid,
|
||||
completed=1,
|
||||
in_progress=1,
|
||||
grades={
|
||||
first_course_run_key: 0.0,
|
||||
second_course_run_key: 0.0,
|
||||
}
|
||||
)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs, [])
|
||||
|
||||
@@ -398,7 +428,15 @@ class TestProgramProgressMeter(TestCase):
|
||||
meter = ProgramProgressMeter(self.site, self.user)
|
||||
self._assert_progress(
|
||||
meter,
|
||||
ProgressFactory(uuid=program_uuid, completed=1, in_progress=1)
|
||||
ProgressFactory(
|
||||
uuid=program_uuid,
|
||||
completed=1,
|
||||
in_progress=1,
|
||||
grades={
|
||||
first_course_run_key: 0.0,
|
||||
second_course_run_key: 0.0,
|
||||
}
|
||||
)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs, [])
|
||||
|
||||
@@ -410,7 +448,14 @@ class TestProgramProgressMeter(TestCase):
|
||||
meter = ProgramProgressMeter(self.site, self.user)
|
||||
self._assert_progress(
|
||||
meter,
|
||||
ProgressFactory(uuid=program_uuid, completed=2)
|
||||
ProgressFactory(
|
||||
uuid=program_uuid,
|
||||
completed=2,
|
||||
grades={
|
||||
first_course_run_key: 0.0,
|
||||
second_course_run_key: 0.0,
|
||||
}
|
||||
)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs, [program_uuid])
|
||||
|
||||
@@ -443,7 +488,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
program, program_uuid = data[0], data[0]['uuid']
|
||||
self._assert_progress(
|
||||
meter,
|
||||
ProgressFactory(uuid=program_uuid, completed=1)
|
||||
ProgressFactory(uuid=program_uuid, completed=1, grades={course_run_key: 0.0})
|
||||
)
|
||||
self.assertEqual(meter.completed_programs, [program_uuid])
|
||||
|
||||
@@ -549,6 +594,38 @@ class TestProgramProgressMeter(TestCase):
|
||||
mock_completed_course_runs.return_value = [{'course_run_id': course_run_key, 'type': 'verified'}]
|
||||
self.assertEqual(meter._is_course_complete(course), True)
|
||||
|
||||
def test_course_grade_results(self, mock_get_programs):
|
||||
grade_percent = .8
|
||||
with mock_passing_grade(percent=grade_percent):
|
||||
course_run_key = generate_course_run_key()
|
||||
data = [
|
||||
ProgramFactory(
|
||||
courses=[
|
||||
CourseFactory(course_runs=[
|
||||
CourseRunFactory(key=course_run_key),
|
||||
]),
|
||||
]
|
||||
)
|
||||
]
|
||||
mock_get_programs.return_value = data
|
||||
|
||||
self._create_enrollments(course_run_key)
|
||||
|
||||
meter = ProgramProgressMeter(self.site, self.user)
|
||||
|
||||
program = data[0]
|
||||
expected = [
|
||||
ProgressFactory(
|
||||
uuid=program['uuid'],
|
||||
completed=[],
|
||||
in_progress=[program['courses'][0]],
|
||||
not_started=[],
|
||||
grades={course_run_key: grade_percent},
|
||||
)
|
||||
]
|
||||
|
||||
self.assertEqual(meter.progress(count_only=False), expected)
|
||||
|
||||
|
||||
def _create_course(self, course_price, course_run_count=1):
|
||||
"""
|
||||
|
||||
@@ -22,6 +22,8 @@ from course_modes.models import CourseMode
|
||||
from lms.djangoapps.certificates import api as certificate_api
|
||||
from lms.djangoapps.commerce.utils import EcommerceService
|
||||
from lms.djangoapps.courseware.access import has_access
|
||||
from lms.djangoapps.courseware.courses import get_course_with_access
|
||||
from lms.djangoapps.grades.course_grade_factory import CourseGradeFactory
|
||||
from openedx.core.djangoapps.catalog.utils import get_programs
|
||||
from openedx.core.djangoapps.commerce.utils import ecommerce_api_client
|
||||
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
|
||||
@@ -89,6 +91,8 @@ class ProgramProgressMeter(object):
|
||||
# We can't use dict.keys() for this because the course run ids need to be ordered
|
||||
self.course_run_ids.append(enrollment_id)
|
||||
|
||||
self.course_grade_factory = CourseGradeFactory()
|
||||
|
||||
if uuid:
|
||||
self.programs = [get_programs(self.site, uuid=uuid)]
|
||||
else:
|
||||
@@ -216,11 +220,17 @@ class ProgramProgressMeter(object):
|
||||
else:
|
||||
not_started.append(course)
|
||||
|
||||
grades = {}
|
||||
for run in self.course_run_ids:
|
||||
grade = self.course_grade_factory.read(self.user, course_key=CourseKey.from_string(run))
|
||||
grades[run] = grade.percent
|
||||
|
||||
progress.append({
|
||||
'uuid': program_copy['uuid'],
|
||||
'completed': len(completed) if count_only else completed,
|
||||
'in_progress': len(in_progress) if count_only else in_progress,
|
||||
'not_started': len(not_started) if count_only else not_started,
|
||||
'grades': grades,
|
||||
})
|
||||
|
||||
return progress
|
||||
@@ -325,7 +335,7 @@ class ProgramProgressMeter(object):
|
||||
|
||||
course_data = {
|
||||
'course_run_id': unicode(certificate['course_key']),
|
||||
'type': certificate_type
|
||||
'type': certificate_type,
|
||||
}
|
||||
|
||||
if certificate_api.is_passing_status(certificate['status']):
|
||||
|
||||
Reference in New Issue
Block a user