def grade_passback(grade, user, quiz): ''' Return grade / outcome data back to the LMS via LTI Outcome Service protocol To get grade passback url, either provide: request (used to get LTI params) or user/quiz combo (used to retrieve LTI params stored in db) ''' lti_parameters = LtiParameters.objects.get(user=user, quiz=quiz) # send the outcome data outcome = OutcomeRequest( { # required for outcome reporting 'lis_outcome_service_url':lti_parameters.lis_outcome_service_url, 'lis_result_sourcedid':lti_parameters.lis_result_sourcedid, 'consumer_key': lti_parameters.oauth_consumer_key, 'consumer_secret': settings.LTI_OAUTH_CREDENTIALS[lti_parameters.oauth_consumer_key], 'message_identifier': 'myMessage' } ) outcome_response = outcome.post_replace_result(grade) # error logging print 'GRADE PASSBACK TRIGGERED: user={}, quiz={}, grade={}'.format(user.pk, quiz.pk, grade) print outcome_response # TODO error detection on bad passback return outcome_response
def grade_passback(grade, user, quiz): ''' Return grade / outcome data back to the LMS via LTI Outcome Service protocol To get grade passback url, either provide: request (used to get LTI params) or user/quiz combo (used to retrieve LTI params stored in db) ''' lti_parameters = LtiParameters.objects.get(user=user, quiz=quiz) # send the outcome data outcome = OutcomeRequest({ # required for outcome reporting 'lis_outcome_service_url': lti_parameters.lis_outcome_service_url, 'lis_result_sourcedid': lti_parameters.lis_result_sourcedid, 'consumer_key': lti_parameters.oauth_consumer_key, 'consumer_secret': settings.LTI_OAUTH_CREDENTIALS[lti_parameters.oauth_consumer_key], 'message_identifier': 'myMessage' }) outcome_response = outcome.post_replace_result(grade) # error logging print 'GRADE PASSBACK TRIGGERED: user={}, quiz={}, grade={}'.format( user.pk, quiz.pk, grade) print outcome_response # TODO error detection on bad passback return outcome_response
def test_parse_delete_result_xml(self): ''' Should parse deleteRequest XML. ''' request = OutcomeRequest() request.process_xml(DELETE_RESULT_XML) self.assertEqual(request.operation, 'deleteResult') self.assertEqual(request.lis_result_sourcedid, '261-154-728-17-784') self.assertEqual(request.message_identifier, '123456789') self.assertEqual(request.score, None)
def test_has_required_attributes(self): request = OutcomeRequest() self.assertFalse(request.has_required_attributes()) request.consumer_key = 'foo' request.consumer_secret = 'bar' self.assertFalse(request.has_required_attributes()) request.lis_outcome_service_url = 'http://example.edu/' request.lis_result_sourcedid = 1 request.operation = 'baz' self.assertTrue(request.has_required_attributes())
def test_post_outcome_request(self): request = OutcomeRequest() self.assertRaises(InvalidLTIConfigError, request.post_outcome_request) request.consumer_key = 'consumer' request.consumer_secret = 'secret' request.lis_outcome_service_url = 'http://example.edu/' request.lis_result_sourcedid = 'foo' request.operation = REPLACE_REQUEST with HTTMock(response_content): resp = request.post_outcome_request(nonce='my_nonce', timestamp='1234567890') self.assertIsInstance(resp, OutcomeResponse) request = resp.post_response.request self.assertTrue('authorization' in request.headers) auth_header = unquote(request.headers['authorization']) correct = ('OAuth ' 'oauth_nonce="my_nonce", oauth_timestamp="1234567890", ' 'oauth_version="1.0", oauth_signature_method="HMAC-SHA1", ' 'oauth_consumer_key="consumer", ' 'oauth_body_hash="glWvnsZZ8lMif1ATz8Tx64CTTaY=", ' 'oauth_signature="XR6A1CmUauXZdJZXa1pJpTQi6OQ="') self.assertEqual(auth_header, correct)
def test_post_outcome_request(self): request = OutcomeRequest() self.assertRaises(InvalidLTIConfigError, request.post_outcome_request) request.consumer_key = 'consumer' request.consumer_secret = 'secret' request.lis_outcome_service_url = 'http://example.edu/' request.lis_result_sourcedid = 'foo' request.operation = REPLACE_REQUEST with HTTMock(response_content): resp = request.post_outcome_request( nonce='my_nonce', timestamp='1234567890' ) self.assertIsInstance(resp, OutcomeResponse) request = resp.post_response.request self.assertTrue('authorization' in request.headers) auth_header = unquote(request.headers['authorization']) correct = ('OAuth ' 'oauth_nonce="my_nonce", oauth_timestamp="1234567890", ' 'oauth_version="1.0", oauth_signature_method="HMAC-SHA1", ' 'oauth_consumer_key="consumer", ' 'oauth_signature="rbvjzAHwXPs/e41Runtu6w9Gv+w="') self.assertEqual(auth_header, correct)