From 64df5cc00e0aab9586757e4fa23f35c73d359173 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Mon, 14 Jan 2013 11:33:59 -0500 Subject: [PATCH] Make errors during course loading not break the site, but just hide that course instead --- common/lib/xmodule/xmodule/modulestore/xml.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/common/lib/xmodule/xmodule/modulestore/xml.py b/common/lib/xmodule/xmodule/modulestore/xml.py index b7f0c726e4..3e4cd4e899 100644 --- a/common/lib/xmodule/xmodule/modulestore/xml.py +++ b/common/lib/xmodule/xmodule/modulestore/xml.py @@ -13,6 +13,7 @@ from importlib import import_module from lxml import etree from path import path +from xmodule.error_module import ErrorDescriptor from xmodule.errortracker import make_error_tracker, exc_info_to_str from xmodule.course_module import CourseDescriptor from xmodule.mako_module import MakoDescriptorSystem @@ -167,8 +168,6 @@ class ImportSystem(XMLParsingSystem, MakoDescriptorSystem): # Didn't load properly. Fall back on loading as an error # descriptor. This should never error due to formatting. - # Put import here to avoid circular import errors - from xmodule.error_module import ErrorDescriptor msg = "Error loading from xml. " + str(err)[:200] log.warning(msg) @@ -311,7 +310,7 @@ class XMLModuleStore(ModuleStoreBase): log.exception(msg) errorlog.tracker(msg) - if course_descriptor is not None: + if course_descriptor is not None and not isinstance(course_descriptor, ErrorDescriptor): self.courses[course_dir] = course_descriptor self._location_errors[course_descriptor.location] = errorlog self.parent_trackers[course_descriptor.id].make_known(course_descriptor.location) @@ -423,6 +422,10 @@ class XMLModuleStore(ModuleStoreBase): course_descriptor = system.process_xml(etree.tostring(course_data, encoding='unicode')) + # If we fail to load the course, then skip the rest of the loading steps + if isinstance(course_descriptor, ErrorDescriptor): + return course_descriptor + # NOTE: The descriptors end up loading somewhat bottom up, which # breaks metadata inheritance via get_children(). Instead # (actually, in addition to, for now), we do a final inheritance pass