make LMS forum subsystem more robust in case of orphaned discussion modules. Given our draft/non-draft duality, we don't currently have a means to always do proper housekeeping at this point in time. However, we have to stop the LMS Forums from blowing up when encoutering one of these.

This commit is contained in:
Chris Dodge
2013-02-06 13:29:48 -05:00
parent b68aff72f2
commit 6ed2737c36

View File

@@ -11,6 +11,8 @@ from django.http import HttpResponse
from django.utils import simplejson
from django_comment_client.models import Role
from django_comment_client.permissions import check_permissions_by_view
from xmodule.modulestore.exceptions import NoPathToItem
from mitxmako import middleware
import pystache_custom as pystache
@@ -158,6 +160,14 @@ def initialize_discussion_info(course):
log.warning("Required key '%s' not in discussion %s, leaving out of category map" % (key, module.location))
skip_module = True
# cdodge: pre-compute the path_to_location. Note this can throw an exception for any
# dangling discussion modules
try:
_DISCUSSIONINFO[course.id]['path_to_location'] = path_to_location(modulestore(), course.id, module.location)
except NoPathToItem:
log.warning("Could not compute path_to_location for {0}. Perhaps this is an orphaned discussion module?!? Skipping...".format(module.location))
skip_module = True
if skip_module:
continue
@@ -360,7 +370,13 @@ def get_courseware_context(content, course):
if id in id_map:
location = id_map[id]["location"].url()
title = id_map[id]["title"]
(course_id, chapter, section, position) = path_to_location(modulestore(), course.id, location)
# cdodge: did we pre-compute, if so, then let's use that rather than recomputing
if 'path_to_location' in _DISCUSSIONINFO[course.id]:
(course_id, chapter, section, position) = _DISCUSSIONINFO[course.id]['path_to_location']
else:
(course_id, chapter, section, position) = path_to_location(modulestore(), course.id, location)
url = reverse('courseware_position', kwargs={"course_id":course_id,
"chapter":chapter,
"section":section,