diff --git a/lti_consumer/lti.py b/lti_consumer/lti.py index d0871bab6dda62af37e4159118044c395398339e..43e6bcd665045d4636720aa3c6de481eda3b1670 100644 --- a/lti_consumer/lti.py +++ b/lti_consumer/lti.py @@ -152,7 +152,14 @@ class LtiConsumer(object): real_user_object = self.xblock.runtime.get_real_user(self.xblock.runtime.anonymous_student_id) self.xblock.user_email = getattr(real_user_object, "email", "") self.xblock.user_username = getattr(real_user_object, "username", "") - self.xblock.user_language = getattr(getattr(real_user_object, "profile", ""), "language", "") + user_profile = getattr(real_user_object, "profile", None) + if user_profile is not None: + language_proficiencies = user_profile.language_proficiencies.all() + if len(language_proficiencies) == 1: + # We only want to send the user's language preference if the user has + # a single preferred language - having multiple language proficiencies + # isn't an API violation, but can't be set up via the UI. + self.xblock.user_language = language_proficiencies[0].code if self.xblock.ask_to_send_username and self.xblock.user_username: lti_parameters["lis_person_sourcedid"] = self.xblock.user_username diff --git a/lti_consumer/tests/unit/test_lti.py b/lti_consumer/tests/unit/test_lti.py index a7bdb7fa1cdbf187a1aa09ce2d2a8d9a6dd1aa40..ee631ddc4ea4b6eb8748ebeb197a25e55296a189 100644 --- a/lti_consumer/tests/unit/test_lti.py +++ b/lti_consumer/tests/unit/test_lti.py @@ -185,7 +185,7 @@ class TestLtiConsumer(TestLtiConsumerXBlock): self.lti_consumer.xblock.runtime.get_real_user.return_value = Mock( email='edx@example.com', username='edx', - profile=Mock(language='en') + profile=Mock(language_proficiencies=Mock(all=Mock(return_value=[Mock(code='en')]))) ) self.assertEqual(self.lti_consumer.get_signed_lti_parameters(), expected_lti_parameters) @@ -197,6 +197,20 @@ class TestLtiConsumer(TestLtiConsumerXBlock): del expected_lti_parameters['launch_presentation_locale'] self.assertEqual(self.lti_consumer.get_signed_lti_parameters(), expected_lti_parameters) + # Test that we don't send a language when no preferred language exists + self.lti_consumer.xblock.runtime.get_real_user.return_value = Mock( + spec=['profile'], + profile=Mock(language_proficiencies=Mock(all=Mock(return_value=[]))) + ) + self.assertEqual(self.lti_consumer.get_signed_lti_parameters(), expected_lti_parameters) + + # Test that we don't send a language when multiple preferred languages exist + self.lti_consumer.xblock.runtime.get_real_user.return_value = Mock( + spec=['profile'], + profile=Mock(language_proficiencies=Mock(all=Mock(return_value=[Mock(code='es'), Mock(code='en')]))) + ) + self.assertEqual(self.lti_consumer.get_signed_lti_parameters(), expected_lti_parameters) + def test_get_result(self): """ Test `get_result` returns valid json response diff --git a/setup.py b/setup.py index a9602acedc335f51a25c4e7378e86dcca184ff35..9eae70105b3f6ecb8db203d5a6f57d8a87c9f070 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ def package_data(pkg, roots): setup( name='lti_consumer-xblock', - version='1.0.7', + version='1.0.8', description='This XBlock implements the consumer side of the LTI specification.', packages=[ 'lti_consumer',