Commit 25662db9 by Bridger Maxwell

Lazily loading capa problems (for faster grading).

parent ec04b0cb
...@@ -11,13 +11,14 @@ from datetime import timedelta ...@@ -11,13 +11,14 @@ from datetime import timedelta
from lxml import etree from lxml import etree
from pkg_resources import resource_string from pkg_resources import resource_string
from xmodule.x_module import XModule
from xmodule.raw_module import RawDescriptor
from xmodule.exceptions import NotFoundError
from progress import Progress
from capa.capa_problem import LoncapaProblem from capa.capa_problem import LoncapaProblem
from capa.responsetypes import StudentInputError from capa.responsetypes import StudentInputError
from capa.util import convert_files_to_filenames from capa.util import convert_files_to_filenames
from progress import Progress
from util.decorators import lazyproperty
from xmodule.x_module import XModule
from xmodule.raw_module import RawDescriptor
from xmodule.exceptions import NotFoundError
log = logging.getLogger("mitx.courseware") log = logging.getLogger("mitx.courseware")
...@@ -118,9 +119,11 @@ class CapaModule(XModule): ...@@ -118,9 +119,11 @@ class CapaModule(XModule):
if self.show_answer == "": if self.show_answer == "":
self.show_answer = "closed" self.show_answer = "closed"
if instance_state is not None: if instance_state is not None:
instance_state = json.loads(instance_state) instance_state = json.loads(instance_state)
self._instance_state = instance_state # We will need this later to lazily load lcp
if instance_state is not None and 'attempts' in instance_state: if instance_state is not None and 'attempts' in instance_state:
self.attempts = instance_state['attempts'] self.attempts = instance_state['attempts']
...@@ -132,16 +135,20 @@ class CapaModule(XModule): ...@@ -132,16 +135,20 @@ class CapaModule(XModule):
else: else:
self.weight = None self.weight = None
@lazyproperty
def lcp(self):
if self.rerandomize == 'never': if self.rerandomize == 'never':
seed = 1 seed = 1
elif self.rerandomize == "per_student" and hasattr(system, 'id'): elif self.rerandomize == "per_student" and hasattr(system, 'id'):
seed = system.id seed = system.id
else: else:
seed = None seed = None
try: try:
self.lcp = LoncapaProblem(self.definition['data'], self.location.html_id(), return LoncapaProblem(self.definition['data'], self.location.html_id(),
instance_state, seed=seed, system=self.system) self._instance_state, seed=seed, system=self.system)
except Exception as err: except Exception as err:
msg = 'cannot create LoncapaProblem {loc}: {err}'.format( msg = 'cannot create LoncapaProblem {loc}: {err}'.format(
loc=self.location.url(), err=err) loc=self.location.url(), err=err)
...@@ -158,12 +165,13 @@ class CapaModule(XModule): ...@@ -158,12 +165,13 @@ class CapaModule(XModule):
problem_text = ('<problem><text><font color="red" size="+2">' problem_text = ('<problem><text><font color="red" size="+2">'
'Problem %s has an error:</font>%s</text></problem>' % 'Problem %s has an error:</font>%s</text></problem>' %
(self.location.url(), msg)) (self.location.url(), msg))
self.lcp = LoncapaProblem( return LoncapaProblem(
problem_text, self.location.html_id(), problem_text, self.location.html_id(),
instance_state, seed=seed, system=self.system) instance_state, seed=seed, system=self.system)
else: else:
# add extra info and raise # add extra info and raise
raise Exception(msg), None, sys.exc_info()[2] raise Exception(msg), None, sys.exc_info()[2]
@property @property
def rerandomize(self): def rerandomize(self):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment