From 1a02cfec8350dd8bc98beeef70aaa632ea9b2021 Mon Sep 17 00:00:00 2001
From: kimth
Date: Sat, 15 Sep 2012 23:25:26 -0400
Subject: [PATCH] Reset CapaProblem when state HTML is corrupt
---
common/lib/xmodule/xmodule/capa_module.py | 36 ++++++++++++++++++-----
1 file changed, 29 insertions(+), 7 deletions(-)
diff --git a/common/lib/xmodule/xmodule/capa_module.py b/common/lib/xmodule/xmodule/capa_module.py
index 8bf1a56404..a344d2981d 100644
--- a/common/lib/xmodule/xmodule/capa_module.py
+++ b/common/lib/xmodule/xmodule/capa_module.py
@@ -131,17 +131,17 @@ class CapaModule(XModule):
self.weight = None
if self.rerandomize == 'never':
- seed = 1
+ self.seed = 1
elif self.rerandomize == "per_student" and hasattr(self.system, 'id'):
- seed = system.id
+ self.seed = system.id
else:
- seed = None
+ self.seed = None
try:
# TODO (vshnayder): move as much as possible of this work and error
# checking to descriptor load time
self.lcp = LoncapaProblem(self.definition['data'], self.location.html_id(),
- instance_state, seed=seed, system=self.system)
+ instance_state, seed=self.seed, system=self.system)
except Exception as err:
msg = 'cannot create LoncapaProblem {loc}: {err}'.format(
loc=self.location.url(), err=err)
@@ -160,7 +160,7 @@ class CapaModule(XModule):
(self.location.url(), msg))
self.lcp = LoncapaProblem(
problem_text, self.location.html_id(),
- instance_state, seed=seed, system=self.system)
+ instance_state, seed=self.seed, system=self.system)
else:
# add extra info and raise
raise Exception(msg), None, sys.exc_info()[2]
@@ -220,9 +220,10 @@ class CapaModule(XModule):
try:
html = self.lcp.get_html()
except Exception, err:
+ log.exception(err)
+
# TODO (vshnayder): another switch on DEBUG.
if self.system.DEBUG:
- log.exception(err)
msg = (
'[courseware.capa.capa_module] '
'Failed to generate HTML for problem %s' %
@@ -231,7 +232,28 @@ class CapaModule(XModule):
msg += '%s
' % traceback.format_exc().replace('<', '<')
html = msg
else:
- raise
+ # We're in non-debug mode, and possibly even in production. We want
+ # to avoid bricking of problem as much as possible
+
+ # Presumably, student submission has corrupted LoncapaProblem HTML.
+ # So, let's try generate a fresh LoncapaProblem
+ self.lcp = LoncapaProblem(self.definition['data'], self.location.html_id(),
+ state=None, # Tabula rasa
+ seed=self.seed, system=self.system)
+
+ # Prepend a scary warning to the student
+ warning = ''
+ warning += '
Problem state was corruped by invalid input. '
+ warning += 'Problem reset to initial state! '
+ warning += 'If problem persists, please contact the course staff.
'
+ warning += '
'
+
+ html = warning
+ try:
+ html += self.lcp.get_html()
+ except Exception, err: # Couldn't do it. Give up
+ log.exception(err)
+ raise
content = {'name': self.display_name,
'html': html,