예제 #1
0
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
예제 #2
0
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
예제 #3
0
 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_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)
예제 #6
0
 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)
예제 #8
0
 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)