diff --git a/openassessment/xblock/openassessmentblock.py b/openassessment/xblock/openassessmentblock.py index 14af9aedc2..f561488c3f 100644 --- a/openassessment/xblock/openassessmentblock.py +++ b/openassessment/xblock/openassessmentblock.py @@ -919,8 +919,8 @@ def parse_xml(cls, node, runtime, keys): Inherited by XBlock core. """ - config = parse_from_xml(node) block = runtime.construct_xblock_from_class(cls, keys) + config = parse_from_xml(node, block) xblock_validator = validator(block, block._, strict_post_release=False) xblock_validator( diff --git a/openassessment/xblock/utils/xml.py b/openassessment/xblock/utils/xml.py index b0d6575658..67bd3e4994 100644 --- a/openassessment/xblock/utils/xml.py +++ b/openassessment/xblock/utils/xml.py @@ -276,7 +276,7 @@ def _parse_prompts_xml(root): raise UpdateFromXmlError('Every "prompt" element must contain a "description" element.') prompts_list.append(prompt_dict) - else: + elif root.find('rubric'): # For backwards compatibility. Initially a single prompt element was added in # the rubric element. rubric_el = root.find('rubric') @@ -290,6 +290,12 @@ def _parse_prompts_xml(root): 'description': prompt_description, } ) + else: + prompts_list.append( + { + 'description': '', + } + ) return prompts_list @@ -859,7 +865,7 @@ def serialize_assessments_to_xml_str(oa_block): return etree.tostring(assessments_root, pretty_print=True, encoding='unicode') -def parse_from_xml(root): +def parse_from_xml(root, block=None): """ Update the OpenAssessment XBlock's content from an XML definition. @@ -942,15 +948,23 @@ def parse_from_xml(root): # Retrieve the title title_el = root.find('title') - if title_el is None: + title = block and block.title + if title_el is None and not title: raise UpdateFromXmlError('Every assessment must contain a "title" element.') - title = _safe_get_text(title_el) + if title_el: + title = _safe_get_text(title_el) # Retrieve the rubric rubric_el = root.find('rubric') - if rubric_el is None: + rubric = block and { + 'criteria': block.rubric_criteria, + 'feedbackprompt': block.rubric_feedback_prompt, + 'feedback_default_text': block.rubric_feedback_default_text, + } + if rubric_el is None and rubric is None: raise UpdateFromXmlError('Every assessment must contain a "rubric" element.') - rubric = parse_rubric_xml(rubric_el) + if rubric_el: + rubric = parse_rubric_xml(rubric_el) # Retrieve the prompts prompts = _parse_prompts_xml(root) @@ -977,9 +991,11 @@ def parse_from_xml(root): # Retrieve the assessments assessments_el = root.find('assessments') - if assessments_el is None: + assessments = block and block.valid_assessments + if assessments_el is None and block is None: raise UpdateFromXmlError('Every assessment must contain an "assessments" element.') - assessments = parse_assessments_xml(assessments_el) + if assessments_el: + assessments = parse_assessments_xml(assessments_el) return { 'title': title,