|
1 | 1 | from django.conf import settings
|
| 2 | + |
| 3 | +from lti_provider.models import LTICourseContext |
2 | 4 | from pylti.common import (
|
3 | 5 | LTIException, LTINotInSessionException, LTI_SESSION_KEY,
|
4 | 6 | verify_request_common, LTIRoleException, LTI_ROLES, LTI_PROPERTY_LIST)
|
5 |
| - |
6 |
| -from lti_provider.models import LTICourseContext |
| 7 | +from xml.etree import ElementTree as etree |
7 | 8 |
|
8 | 9 |
|
9 | 10 | LTI_PROPERTY_LIST_EX = [
|
@@ -208,3 +209,52 @@ def user_roles(self, request): # pylint: disable=no-self-use
|
208 | 209 |
|
209 | 210 | def sis_course_id(self, request):
|
210 | 211 | return request.session.get('lis_course_offering_sourcedid', None)
|
| 212 | + |
| 213 | + def generate_request_xml(self, message_identifier_id, operation, |
| 214 | + lis_result_sourcedid, score, launch_url): |
| 215 | + # pylint: disable=too-many-locals |
| 216 | + """ |
| 217 | + Generates LTI 1.1 XML for posting result to LTI consumer. |
| 218 | +
|
| 219 | + :param message_identifier_id: |
| 220 | + :param operation: |
| 221 | + :param lis_result_sourcedid: |
| 222 | + :param score: |
| 223 | + :return: XML string |
| 224 | + """ |
| 225 | + root = etree.Element(u'imsx_POXEnvelopeRequest', |
| 226 | + xmlns=u'http://www.imsglobal.org/services/' |
| 227 | + u'ltiv1p1/xsd/imsoms_v1p0') |
| 228 | + |
| 229 | + header = etree.SubElement(root, 'imsx_POXHeader') |
| 230 | + header_info = etree.SubElement(header, 'imsx_POXRequestHeaderInfo') |
| 231 | + version = etree.SubElement(header_info, 'imsx_version') |
| 232 | + version.text = 'V1.0' |
| 233 | + message_identifier = etree.SubElement(header_info, |
| 234 | + 'imsx_messageIdentifier') |
| 235 | + message_identifier.text = message_identifier_id |
| 236 | + body = etree.SubElement(root, 'imsx_POXBody') |
| 237 | + xml_request = etree.SubElement( |
| 238 | + body, '%s%s' % (operation, 'Request')) |
| 239 | + record = etree.SubElement(xml_request, 'resultRecord') |
| 240 | + |
| 241 | + guid = etree.SubElement(record, 'sourcedGUID') |
| 242 | + |
| 243 | + sourcedid = etree.SubElement(guid, 'sourcedId') |
| 244 | + sourcedid.text = lis_result_sourcedid |
| 245 | + if score is not None: |
| 246 | + result = etree.SubElement(record, 'result') |
| 247 | + result_score = etree.SubElement(result, 'resultScore') |
| 248 | + language = etree.SubElement(result_score, 'language') |
| 249 | + language.text = 'en' |
| 250 | + text_string = etree.SubElement(result_score, 'textString') |
| 251 | + text_string.text = score.__str__() |
| 252 | + if launch_url: |
| 253 | + result_data = etree.SubElement(result, 'resultData') |
| 254 | + lti_launch_url = etree.SubElement( |
| 255 | + result_data, 'ltiLaunchUrl') |
| 256 | + lti_launch_url.text = launch_url |
| 257 | + ret = "<?xml version='1.0' encoding='utf-8'?>\n{}".format( |
| 258 | + etree.tostring(root, encoding='utf-8').decode('utf-8')) |
| 259 | + |
| 260 | + return ret |
0 commit comments