From 714af1daa39c3a2fd78699b38e53a39a2c14e038 Mon Sep 17 00:00:00 2001 From: Hamish Moffatt Date: Wed, 18 Aug 2021 14:43:22 +1000 Subject: [PATCH 1/2] Add support for Canvas ltiLaunchUrl in outcome request --- src/lti/outcome_request.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lti/outcome_request.py b/src/lti/outcome_request.py index 124d755..7b29d3a 100644 --- a/src/lti/outcome_request.py +++ b/src/lti/outcome_request.py @@ -75,6 +75,7 @@ def post_replace_result(self, score, result_data=None): 'text' : str text 'url' : str url + 'ltiLaunchUrl' : str url ''' self.operation = REPLACE_REQUEST self.score = score @@ -84,9 +85,9 @@ def post_replace_result(self, score, result_data=None): error_msg = ('Dictionary result_data can only have one entry. ' '{0} entries were found.'.format(len(result_data))) raise InvalidLTIConfigError(error_msg) - elif 'text' not in result_data and 'url' not in result_data: + elif 'text' not in result_data and 'url' not in result_data and 'ltiLaunchUrl' not in result_data: error_msg = ('Dictionary result_data can only have the key ' - '"text" or the key "url".') + '"text" or the key "url" or the key "ltiLaunchUrl".') raise InvalidLTIConfigError(error_msg) else: return self.post_outcome_request() @@ -230,5 +231,8 @@ def generate_request_xml(self): elif 'url' in self.result_data: resultDataURL = etree.SubElement(resultData, 'url') resultDataURL.text = self.result_data['url'] + elif 'ltiLaunchUrl' in self.result_data: + resultDataLaunchURL = etree.SubElement(resultData, 'ltiLaunchUrl') + resultDataLaunchURL.text = self.result_data['ltiLaunchUrl'] return etree.tostring(root, xml_declaration=True, encoding='utf-8') From 83da2abf105fd795d40949b0a35513e9ec3f8f8c Mon Sep 17 00:00:00 2001 From: Hamish Moffatt Date: Thu, 7 Dec 2023 10:47:23 +1100 Subject: [PATCH 2/2] parse OutcomeRequest result data --- src/lti/outcome_request.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lti/outcome_request.py b/src/lti/outcome_request.py index 7b29d3a..f168745 100644 --- a/src/lti/outcome_request.py +++ b/src/lti/outcome_request.py @@ -165,6 +165,14 @@ def process_xml(self, xml): sourcedGUID.sourcedId self.score = str(result.resultRecord.result. resultScore.textString) + + if len(resultData := result.find('resultRecord/result/resultData', root.nsmap)): + if r := resultData.find('text', root.nsmap): + self.result_data = {'text': result} + elif r := resultData.find('url', root.nsmap): + self.result_data = {'url': result} + elif r := resultData.find('ltiLaunchUrl', root.nsmap): + self.result_data = {'ltiLaunchUrl': r} except: pass