diff --git a/common/lib/xmodule/xmodule/combined_open_ended_module.py b/common/lib/xmodule/xmodule/combined_open_ended_module.py index a88acc6ffd..67c7d15910 100644 --- a/common/lib/xmodule/xmodule/combined_open_ended_module.py +++ b/common/lib/xmodule/xmodule/combined_open_ended_module.py @@ -21,6 +21,7 @@ from .xml_module import XmlDescriptor from xmodule.modulestore import Location import self_assessment_module import open_ended_module +from combined_open_ended_rubric import CombinedOpenEndedRubric from mitxmako.shortcuts import render_to_string @@ -140,6 +141,12 @@ class CombinedOpenEndedModule(XModule): # completion (doesn't matter if you self-assessed correct/incorrect). self._max_score = int(self.metadata.get('max_score', MAX_SCORE)) + rubric_renderer = CombinedOpenEndedRubric(True) + success, rubric_feedback = rubric_renderer.render_rubric(True, definition['rubric']) + if not success: + error_message="Could not parse rubric : {0}".format(definition['rubric']) + log.exception(error_message) + raise Exception(error_message) #Static data is passed to the child modules to render self.static_data = { 'max_score': self._max_score, diff --git a/common/lib/xmodule/xmodule/combined_open_ended_rubric.py b/common/lib/xmodule/xmodule/combined_open_ended_rubric.py index 4861a15dbc..2146942296 100644 --- a/common/lib/xmodule/xmodule/combined_open_ended_rubric.py +++ b/common/lib/xmodule/xmodule/combined_open_ended_rubric.py @@ -20,16 +20,26 @@ class CombinedOpenEndedRubric: html: the html that corresponds to the xml given ''' def render_rubric(self, rubric_xml): + success = False try: + rubric_xml = rubric_xml.encode('ascii', 'ignore') rubric_categories = self.extract_categories(rubric_xml) html = render_to_string('open_ended_rubric.html', {'categories' : rubric_categories, 'has_score': self.has_score, 'view_only': self.view_only}) + success = True except: log.exception("Could not parse the rubric.") - html = etree.tostring(rubric_xml, pretty_print=True) - return html + try: + html = etree.tostring(rubric_xml, pretty_print=True) + except: + log.exception("Rubric XML is a string, not an XML object : {0}".format(rubric_xml)) + if isinstance(rubric_xml, basestring): + html = rubric_xml + else: + html = "Invalid rubric. Please contact course staff." + return success, html def extract_categories(self, element): ''' diff --git a/common/lib/xmodule/xmodule/open_ended_module.py b/common/lib/xmodule/xmodule/open_ended_module.py index 4033d140dd..824eac3639 100644 --- a/common/lib/xmodule/xmodule/open_ended_module.py +++ b/common/lib/xmodule/xmodule/open_ended_module.py @@ -383,7 +383,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild): feedback = self._convert_longform_feedback_to_html(response_items) if response_items['rubric_scores_complete']==True: rubric_renderer = CombinedOpenEndedRubric(True) - rubric_feedback = rubric_renderer.render_rubric(response_items['rubric_xml']) + success, rubric_feedback = rubric_renderer.render_rubric(response_items['rubric_xml']) if not response_items['success']: return system.render_template("open_ended_error.html", diff --git a/common/lib/xmodule/xmodule/self_assessment_module.py b/common/lib/xmodule/xmodule/self_assessment_module.py index 4a7e86e134..de842091c9 100644 --- a/common/lib/xmodule/xmodule/self_assessment_module.py +++ b/common/lib/xmodule/xmodule/self_assessment_module.py @@ -124,7 +124,7 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild): rubric_renderer = CombinedOpenEndedRubric(True) - rubric_html = rubric_renderer.render_rubric(self.rubric) + success, rubric_html = rubric_renderer.render_rubric(self.rubric) # we'll render it context = {'rubric': rubric_html, diff --git a/lms/djangoapps/open_ended_grading/staff_grading_service.py b/lms/djangoapps/open_ended_grading/staff_grading_service.py index c684fa1d95..9f7daeb786 100644 --- a/lms/djangoapps/open_ended_grading/staff_grading_service.py +++ b/lms/djangoapps/open_ended_grading/staff_grading_service.py @@ -264,7 +264,12 @@ def _get_next(course_id, grader_id, location): response_json = json.loads(response) rubric = response_json['rubric'] rubric_renderer = CombinedOpenEndedRubric(False) - rubric_html = rubric_renderer.render_rubric(rubric) + success, rubric_html = rubric_renderer.render_rubric(rubric) + if not success: + error_message = "Could not render rubric: {0}".format(rubric) + log.exception(error_message) + return json.dumps({'success': False, + 'error': error_message}) response_json['rubric'] = rubric_html return json.dumps(response_json) except GradingServiceError: