diff --git a/lms/djangoapps/course_home_api/outline/v1/serializers.py b/lms/djangoapps/course_home_api/outline/v1/serializers.py index 09db58ca87..ad09c693c1 100644 --- a/lms/djangoapps/course_home_api/outline/v1/serializers.py +++ b/lms/djangoapps/course_home_api/outline/v1/serializers.py @@ -126,3 +126,4 @@ class OutlineTabSerializer(DatesBannerSerializerMixin, VerifiedModeSerializerMix offer = serializers.DictField() resume_course = ResumeCourseSerializer() welcome_message_html = serializers.CharField() + user_has_passing_grade = serializers.BooleanField() diff --git a/lms/djangoapps/course_home_api/outline/v1/tests/test_views.py b/lms/djangoapps/course_home_api/outline/v1/tests/test_views.py index 773956b9f2..ec164d28b0 100644 --- a/lms/djangoapps/course_home_api/outline/v1/tests/test_views.py +++ b/lms/djangoapps/course_home_api/outline/v1/tests/test_views.py @@ -4,6 +4,7 @@ Tests for Outline Tab API in the Course Home API import itertools from datetime import datetime, timezone +from lms.djangoapps.grades.course_grade_factory import CourseGradeFactory from unittest.mock import Mock, patch import ddt @@ -387,3 +388,12 @@ class OutlineTabTestViews(BaseCourseHomeTests): response = self.client.get(self.url) blocks = response.data['course_blocks']['blocks'] assert seq_block_id not in blocks + + def test_user_has_passing_grade(self): + CourseEnrollment.enroll(self.user, self.course.id) + self.course._grading_policy['GRADE_CUTOFFS']['Pass'] = 0 + self.update_course(self.course, self.user.id) + CourseGradeFactory().update(self.user, self.course) + response = self.client.get(self.url) + assert response.status_code == 200 + assert response.data['user_has_passing_grade'] is True diff --git a/lms/djangoapps/course_home_api/outline/v1/views.py b/lms/djangoapps/course_home_api/outline/v1/views.py index fcae5dc135..5fee0b21e0 100644 --- a/lms/djangoapps/course_home_api/outline/v1/views.py +++ b/lms/djangoapps/course_home_api/outline/v1/views.py @@ -2,6 +2,7 @@ Outline Tab Views """ from datetime import datetime, timezone +from lms.djangoapps.grades.course_grade_factory import CourseGradeFactory from completion.exceptions import UnavailableCompletionData from completion.utilities import get_key_to_last_completed_block @@ -146,6 +147,7 @@ class OutlineTabView(RetrieveAPIView): has_visited_course: (bool) Whether the user has ever visited the course url: (str) The display name of the course block to resume welcome_message_html: (str) Raw HTML for the course updates banner + user_has_passing_grade: (bool) Whether the user currently is passing the course **Returns** @@ -313,6 +315,12 @@ class OutlineTabView(RetrieveAPIView): ) ] if 'children' in chapter_data else [] + user_has_passing_grade = False + if not request.user.is_anonymous: + user_grade = CourseGradeFactory().read(request.user, course) + if user_grade: + user_has_passing_grade = user_grade.passed + data = { 'access_expiration': access_expiration, 'cert_data': cert_data, @@ -325,6 +333,7 @@ class OutlineTabView(RetrieveAPIView): 'has_ended': course.has_ended(), 'offer': offer_data, 'resume_course': resume_course, + 'user_has_passing_grade': user_has_passing_grade, 'welcome_message_html': welcome_message_html, } context = self.get_serializer_context()