Commit d384c6df by Awais Jibran Committed by GitHub

Merge pull request #15588 from edx/aj/masquerade_user_change_language

Switching course view to specific student retains the profile language setting
parents 2d6b477e 125552f2
...@@ -5,6 +5,7 @@ import json ...@@ -5,6 +5,7 @@ import json
import pickle import pickle
from datetime import datetime from datetime import datetime
from django.conf import settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.test import TestCase from django.test import TestCase
from django.utils.timezone import UTC from django.utils.timezone import UTC
...@@ -17,13 +18,16 @@ from courseware.masquerade import ( ...@@ -17,13 +18,16 @@ from courseware.masquerade import (
CourseMasquerade, CourseMasquerade,
MasqueradingKeyValueStore, MasqueradingKeyValueStore,
get_masquerading_user_group, get_masquerading_user_group,
handle_ajax,
setup_masquerade
) )
from courseware.tests.factories import StaffFactory from courseware.tests.factories import StaffFactory
from courseware.tests.helpers import LoginEnrollmentTestCase, masquerade_as_group_member from courseware.tests.helpers import LoginEnrollmentTestCase, masquerade_as_group_member
from courseware.tests.test_submitting_problems import ProblemSubmissionTestMixin from courseware.tests.test_submitting_problems import ProblemSubmissionTestMixin
from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration
from openedx.core.djangoapps.user_api.preferences.api import (
get_user_preference,
set_user_preference
)
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
...@@ -311,6 +315,22 @@ class TestStaffMasqueradeAsSpecificStudent(StaffMasqueradeTestCase, ProblemSubmi ...@@ -311,6 +315,22 @@ class TestStaffMasqueradeAsSpecificStudent(StaffMasqueradeTestCase, ProblemSubmi
progress = '%s/%s' % (str(json_data['current_score']), str(json_data['total_possible'])) progress = '%s/%s' % (str(json_data['current_score']), str(json_data['total_possible']))
return progress return progress
def assertExpectedLanguageInPreference(self, user, expected_language_code):
"""
This method is a custom assertion verifies that a given user has expected
language code in the preference and in cookies.
Arguments:
user: User model instance
expected_language_code: string indicating a language code
"""
self.assertEqual(
get_user_preference(user, LANGUAGE_KEY), expected_language_code
)
self.assertEqual(
self.client.cookies[settings.LANGUAGE_COOKIE].value, expected_language_code
)
@patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False}) @patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False})
def test_masquerade_as_specific_user_on_self_paced(self): def test_masquerade_as_specific_user_on_self_paced(self):
""" """
...@@ -375,6 +395,31 @@ class TestStaffMasqueradeAsSpecificStudent(StaffMasqueradeTestCase, ProblemSubmi ...@@ -375,6 +395,31 @@ class TestStaffMasqueradeAsSpecificStudent(StaffMasqueradeTestCase, ProblemSubmi
self.login_student() self.login_student()
self.assertEqual(self.get_progress_detail(), u'2/2') self.assertEqual(self.get_progress_detail(), u'2/2')
def test_masquerading_with_language_preference(self):
"""
Tests that masquerading as a specific user for the course does not update preference language
for the staff.
Login as a staff user and set user's language preference to english and visit the courseware page.
Set masquerade to view same page as a specific student having different language preference and
revisit the courseware page.
"""
english_language_code = 'en'
set_user_preference(self.test_user, preference_key=LANGUAGE_KEY, preference_value=english_language_code)
self.login_staff()
# Reload the page and check we have expected language preference in system and in cookies.
self.get_courseware_page()
self.assertExpectedLanguageInPreference(self.test_user, english_language_code)
# Set student language preference and set masquerade to view same page the student.
set_user_preference(self.student_user, preference_key=LANGUAGE_KEY, preference_value='es-419')
self.update_masquerade(role='student', user_name=self.student_user.username)
# Reload the page and check we have expected language preference in system and in cookies.
self.get_courseware_page()
self.assertExpectedLanguageInPreference(self.test_user, english_language_code)
@patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False}) @patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False})
def test_masquerade_as_specific_student_course_info(self): def test_masquerade_as_specific_student_course_info(self):
""" """
......
...@@ -5,11 +5,11 @@ Middleware for Language Preferences ...@@ -5,11 +5,11 @@ Middleware for Language Preferences
from django.conf import settings from django.conf import settings
from django.utils.translation import LANGUAGE_SESSION_KEY from django.utils.translation import LANGUAGE_SESSION_KEY
from django.utils.translation.trans_real import parse_accept_lang_header from django.utils.translation.trans_real import parse_accept_lang_header
from lms.djangoapps.courseware.masquerade import MASQUERADE_SETTINGS_KEY
from openedx.core.djangoapps.lang_pref import COOKIE_DURATION, LANGUAGE_HEADER, LANGUAGE_KEY from openedx.core.djangoapps.lang_pref import COOKIE_DURATION, LANGUAGE_HEADER, LANGUAGE_KEY
from openedx.core.djangoapps.user_api.errors import UserAPIInternalError, UserAPIRequestError from openedx.core.djangoapps.user_api.errors import UserAPIInternalError, UserAPIRequestError
from openedx.core.djangoapps.user_api.preferences.api import ( from openedx.core.djangoapps.user_api.preferences.api import (
delete_user_preference,
get_user_preference, get_user_preference,
set_user_preference set_user_preference
) )
...@@ -51,18 +51,22 @@ class LanguagePreferenceMiddleware(object): ...@@ -51,18 +51,22 @@ class LanguagePreferenceMiddleware(object):
del request.session[LANGUAGE_SESSION_KEY] del request.session[LANGUAGE_SESSION_KEY]
def process_response(self, request, response): def process_response(self, request, response):
# If the user is logged in, check for their language preference # If the user is logged in, check for their language preference. Also check for real user
if getattr(request, 'user', None) and request.user.is_authenticated(): # if current user is a masquerading user,
user_pref = None user_pref = None
current_user = None
if hasattr(request, 'user'):
current_user = getattr(request.user, 'real_user', request.user)
if current_user and current_user.is_authenticated():
anonymous_cookie_lang = getattr(request, '_anonymous_user_cookie_lang', None) anonymous_cookie_lang = getattr(request, '_anonymous_user_cookie_lang', None)
if anonymous_cookie_lang: if anonymous_cookie_lang:
user_pref = anonymous_cookie_lang user_pref = anonymous_cookie_lang
set_user_preference(request.user, LANGUAGE_KEY, anonymous_cookie_lang) set_user_preference(current_user, LANGUAGE_KEY, anonymous_cookie_lang)
else: else:
# Get the user's language preference # Get the user's language preference
try: try:
user_pref = get_user_preference(request.user, LANGUAGE_KEY) user_pref = get_user_preference(current_user, LANGUAGE_KEY)
except (UserAPIRequestError, UserAPIInternalError): except (UserAPIRequestError, UserAPIInternalError):
# If we can't find the user preferences, then don't modify the cookie # If we can't find the user preferences, then don't modify the cookie
pass pass
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment