diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 873ce7ed69..8ad10f8eca 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,6 +5,8 @@ These are notable changes in edx-platform. This is a rolling list of changes, in roughly chronological order, most recent first. Add your entries at or near the top. Include a label indicating the component affected. +Blades: Add LTI context_id parameter. BLD-584. + Blades: Update LTI resource_link_id parameter. BLD-768. Blades: Transcript translations should be displayed in their source language (BLD-935). diff --git a/common/lib/xmodule/xmodule/js/fixtures/lti.html b/common/lib/xmodule/xmodule/js/fixtures/lti.html index ac9fe31d09..8c433d047b 100644 --- a/common/lib/xmodule/xmodule/js/fixtures/lti.html +++ b/common/lib/xmodule/xmodule/js/fixtures/lti.html @@ -28,6 +28,7 @@ + diff --git a/common/lib/xmodule/xmodule/lti_module.py b/common/lib/xmodule/xmodule/lti_module.py index ddca9d0058..269e8657d6 100644 --- a/common/lib/xmodule/xmodule/lti_module.py +++ b/common/lib/xmodule/xmodule/lti_module.py @@ -338,13 +338,9 @@ class LTIModule(LTIFields, XModule): This value may change for a particular resource_link_id / user_id from one launch to the next. The TP should only retain the most recent value for this field for a particular resource_link_id / user_id. This field is generally optional, but is required for grading. - - context_id is - is an opaque identifier that uniquely identifies the context that contains - the link being launched. - lti_id should be context_id by meaning. """ - return "{id}:{resource_link}:{user_id}".format( - id=urllib.quote(self.lti_id), + return "{context}:{resource_link}:{user_id}".format( + context=urllib.quote(self.context_id), resource_link=urllib.quote(self.get_resource_link_id()), user_id=urllib.quote(self.get_user_id()) ) @@ -357,6 +353,16 @@ class LTIModule(LTIFields, XModule): course = self.descriptor.runtime.modulestore.get_item(course_location) return course + @property + def context_id(self): + """ + Return context_id. + + context_id is an opaque identifier that uniquely identifies the context (e.g., a course) + that contains the link being launched. + """ + return self.course_id + @property def role(self): """ @@ -397,6 +403,7 @@ class LTIModule(LTIFields, XModule): u'resource_link_id': self.get_resource_link_id(), u'lis_result_sourcedid': self.get_lis_result_sourcedid(), + u'context_id': self.context_id, } if self.has_score: diff --git a/common/lib/xmodule/xmodule/tests/__init__.py b/common/lib/xmodule/xmodule/tests/__init__.py index 0a68d2fcb1..70ae00abb2 100644 --- a/common/lib/xmodule/xmodule/tests/__init__.py +++ b/common/lib/xmodule/xmodule/tests/__init__.py @@ -131,7 +131,7 @@ class LogicTest(unittest.TestCase): url_name = '' category = 'test' - self.system = get_test_system() + self.system = get_test_system(course_id='test/course/id') self.descriptor = EmptyClass() self.xmodule_class = self.descriptor_class.module_class diff --git a/common/lib/xmodule/xmodule/tests/test_lti_unit.py b/common/lib/xmodule/xmodule/tests/test_lti_unit.py index e42dbd9100..86cdabb3e7 100644 --- a/common/lib/xmodule/xmodule/tests/test_lti_unit.py +++ b/common/lib/xmodule/xmodule/tests/test_lti_unit.py @@ -265,7 +265,7 @@ class LTIModuleTest(LogicTest): with patch('xmodule.lti_module.LTIModule.location', new_callable=PropertyMock) as mock_location: self.xmodule.location.html_id = lambda: 'i4x-2-3-lti-31de800015cf4afb973356dbe81496df' expected_sourcedId = u':'.join(urllib.quote(i) for i in ( - self.lti_id, + self.system.course_id, urllib.quote(self.unquoted_resource_link_id), self.user_id )) @@ -407,4 +407,8 @@ class LTIModuleTest(LogicTest): self.xmodule.graded = False self.assertEqual(self.xmodule.max_score(), 100.0) - + def test_context_id(self): + """ + Tests that LTI parameter context_id is equal to course_id. + """ + self.assertEqual(self.system.course_id, self.xmodule.context_id) diff --git a/lms/djangoapps/courseware/tests/test_lti_integration.py b/lms/djangoapps/courseware/tests/test_lti_integration.py index 66a92153ab..a74bdf3ed6 100644 --- a/lms/djangoapps/courseware/tests/test_lti_integration.py +++ b/lms/djangoapps/courseware/tests/test_lti_integration.py @@ -27,13 +27,13 @@ class TestLTI(BaseTestXmodule): mocked_signature_after_sign = u'my_signature%3D' mocked_decoded_signature = u'my_signature=' - lti_id = self.item_descriptor.lti_id + context_id = self.item_descriptor.course_id user_id = unicode(self.item_descriptor.xmodule_runtime.anonymous_student_id) hostname = self.item_descriptor.xmodule_runtime.hostname resource_link_id = unicode(urllib.quote('{}-{}'.format(hostname, self.item_descriptor.location.html_id()))) - sourcedId = "{id}:{resource_link}:{user_id}".format( - id=urllib.quote(lti_id), + sourcedId = "{context}:{resource_link}:{user_id}".format( + context=urllib.quote(context_id), resource_link=urllib.quote(resource_link_id), user_id=urllib.quote(user_id) ) @@ -49,6 +49,7 @@ class TestLTI(BaseTestXmodule): u'lti_message_type': u'basic-lti-launch-request', u'lti_version': 'LTI-1p0', u'roles': u'Student', + u'context_id': context_id, u'resource_link_id': resource_link_id, u'lis_result_sourcedid': sourcedId,