From 8cee215c01961f376e013cf0c338f8233d2b1d40 Mon Sep 17 00:00:00 2001 From: Bianca Severino Date: Fri, 2 Apr 2021 14:55:39 -0400 Subject: [PATCH] feat: pass username into CourseHomeMetadataView Passes the request username into the course home metadata view so that masquerade functionality can be used with the proctoring info panel. --- .../course_metadata/v1/serializers.py | 1 + .../course_metadata/v1/tests/test_views.py | 27 ++++++++++++++----- .../course_metadata/v1/views.py | 4 +++ .../course-home-fragment.html | 3 ++- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/lms/djangoapps/course_home_api/course_metadata/v1/serializers.py b/lms/djangoapps/course_home_api/course_metadata/v1/serializers.py index 75f37e8469..bd72cf10c7 100644 --- a/lms/djangoapps/course_home_api/course_metadata/v1/serializers.py +++ b/lms/djangoapps/course_home_api/course_metadata/v1/serializers.py @@ -32,6 +32,7 @@ class CourseHomeMetadataSerializer(serializers.Serializer): Serializer for the Course Home Course Metadata """ course_id = serializers.CharField() + username = serializers.CharField() is_enrolled = serializers.BooleanField() is_self_paced = serializers.BooleanField() is_staff = serializers.BooleanField() diff --git a/lms/djangoapps/course_home_api/course_metadata/v1/tests/test_views.py b/lms/djangoapps/course_home_api/course_metadata/v1/tests/test_views.py index 31699bb24c..36b4f7548b 100644 --- a/lms/djangoapps/course_home_api/course_metadata/v1/tests/test_views.py +++ b/lms/djangoapps/course_home_api/course_metadata/v1/tests/test_views.py @@ -28,6 +28,12 @@ class CourseHomeMetadataTests(BaseCourseHomeTests): def setUp(self): super().setUp() self.url = reverse('course-home-course-metadata', args=[self.course.id]) + self.staff_user = UserFactory( + username='staff', + email='staff@example.com', + password='bar', + is_staff=True + ) def test_get_authenticated_user(self): CourseEnrollment.enroll(self.user, self.course.id, CourseMode.VERIFIED) @@ -39,13 +45,7 @@ class CourseHomeMetadataTests(BaseCourseHomeTests): def test_get_authenticated_staff_user(self): self.client.logout() - staff_user = UserFactory( - username='staff', - email='staff@example.com', - password='bar', - is_staff=True - ) - self.client.login(username=staff_user.username, password='bar') + self.client.login(username=self.staff_user.username, password='bar') response = self.client.get(self.url) assert response.status_code == 200 assert response.data['is_staff'] @@ -53,6 +53,19 @@ class CourseHomeMetadataTests(BaseCourseHomeTests): # 'Course', 'Wiki', 'Progress', and 'Instructor' tabs assert len(response.data.get('tabs', [])) == 4 + def test_get_masqueraded_user(self): + CourseEnrollment.enroll(self.user, self.course.id, CourseMode.VERIFIED) + + self.client.logout() + self.client.login(username=self.staff_user.username, password='bar') + + # Sanity check on our normal staff user + assert self.client.get(self.url).data['username'] == self.staff_user.username + + # Now switch users and confirm we get a different result + self.update_masquerade(username=self.user.username) + assert self.client.get(self.url).data['username'] == self.user.username + def test_get_unknown_course(self): url = reverse('course-home-course-metadata', args=['course-v1:unknown+course+2T2020']) response = self.client.get(url) diff --git a/lms/djangoapps/course_home_api/course_metadata/v1/views.py b/lms/djangoapps/course_home_api/course_metadata/v1/views.py index 525c0910c8..69a255e198 100644 --- a/lms/djangoapps/course_home_api/course_metadata/v1/views.py +++ b/lms/djangoapps/course_home_api/course_metadata/v1/views.py @@ -36,6 +36,8 @@ class CourseHomeMetadataView(RetrieveAPIView): Body consists of the following fields: course_id: (str) The Course's id (Course Run key) + username: (str) The requesting (or masqueraded) user. Returns None for an + unauthenticated user. is_enrolled: (bool) Indicates if the user is enrolled in the course is_self_paced: (bool) Indicates if the course is self paced is_staff: (bool) Indicates if the user is staff @@ -77,6 +79,7 @@ class CourseHomeMetadataView(RetrieveAPIView): reset_masquerade_data=True, ) + username = request.user.username if request.user.username else None course = course_detail(request, request.user.username, course_key) user_is_enrolled = CourseEnrollment.is_enrolled(request.user, course_key_string) browser_timezone = request.query_params.get('browser_timezone', None) @@ -91,6 +94,7 @@ class CourseHomeMetadataView(RetrieveAPIView): data = { 'course_id': course.id, + 'username': username, 'is_staff': has_access(request.user, 'staff', course_key).has_access, 'original_user_is_staff': original_user_is_staff, 'number': course.display_number_with_default, diff --git a/openedx/features/course_experience/templates/course_experience/course-home-fragment.html b/openedx/features/course_experience/templates/course_experience/course-home-fragment.html index 9e42725034..164f4770f5 100644 --- a/openedx/features/course_experience/templates/course_experience/course-home-fragment.html +++ b/openedx/features/course_experience/templates/course_experience/course-home-fragment.html @@ -85,7 +85,8 @@ from openedx.features.course_experience.course_tools import HttpMethod