From 5cfec9732b6e53b8eeadd82d14b688d1b53392a2 Mon Sep 17 00:00:00 2001 From: Simon Chen Date: Wed, 16 Feb 2022 11:02:15 -0500 Subject: [PATCH] fix: Provide a new data property on CoursewareMeta for proctoring exam access (#29929) Co-authored-by: Simon Chen --- .../djangoapps/courseware_api/serializers.py | 1 + .../courseware_api/tests/test_views.py | 20 +++++++++++++++++++ .../core/djangoapps/courseware_api/views.py | 6 ++++++ 3 files changed, 27 insertions(+) diff --git a/openedx/core/djangoapps/courseware_api/serializers.py b/openedx/core/djangoapps/courseware_api/serializers.py index 71cc692bc5..b1e1c24ee3 100644 --- a/openedx/core/djangoapps/courseware_api/serializers.py +++ b/openedx/core/djangoapps/courseware_api/serializers.py @@ -107,6 +107,7 @@ class CourseInfoSerializer(serializers.Serializer): # pylint: disable=abstract- show_calculator = serializers.BooleanField() original_user_is_staff = serializers.BooleanField() can_view_legacy_courseware = serializers.BooleanField() + can_access_proctored_exams = serializers.BooleanField() is_staff = serializers.BooleanField() course_access = serializers.DictField() notes = serializers.DictField() diff --git a/openedx/core/djangoapps/courseware_api/tests/test_views.py b/openedx/core/djangoapps/courseware_api/tests/test_views.py index 1cd484b31e..211f9d4827 100644 --- a/openedx/core/djangoapps/courseware_api/tests/test_views.py +++ b/openedx/core/djangoapps/courseware_api/tests/test_views.py @@ -416,6 +416,26 @@ class CourseApiTestViews(BaseCoursewareTests, MasqueradeMixin): assert 'user_needs_integrity_signature' in courseware_data assert courseware_data['user_needs_integrity_signature'] == needs_signature + @ddt.data( + ('audit', False), + ('honor', False), + ('verified', True), + ('masters', True), + ('professional', True), + ('no-id-professional', True), + ('executive-education', True), + ('credit', True), + ) + @ddt.unpack + @mock.patch.dict('django.conf.settings.FEATURES', {'DISABLE_HONOR_CERTIFICATES': True}) + def test_can_access_proctored_exams(self, mode, result): + CourseEnrollment.enroll(self.user, self.course.id, mode) + response = self.client.get(self.url) + assert response.status_code == 200 + courseware_data = response.json() + assert 'can_access_proctored_exams' in courseware_data + assert courseware_data['can_access_proctored_exams'] == result + @ddt.ddt class SequenceApiTestViews(MasqueradeMixin, BaseCoursewareTests): diff --git a/openedx/core/djangoapps/courseware_api/views.py b/openedx/core/djangoapps/courseware_api/views.py index 30850a2eba..277c7ccc06 100644 --- a/openedx/core/djangoapps/courseware_api/views.py +++ b/openedx/core/djangoapps/courseware_api/views.py @@ -389,6 +389,12 @@ class CoursewareMeta: user_timezone_locale = user_timezone_locale_prefs(self.request) return user_timezone_locale['user_timezone'] + @property + def can_access_proctored_exams(self): + enrollment_mode = self.enrollment['mode'] + enrollment_active = self.enrollment['is_active'] + return enrollment_active and CourseMode.is_eligible_for_certificate(enrollment_mode) + class CoursewareInformation(RetrieveAPIView): """