diff --git a/common/lib/capa/capa/capa_problem.py b/common/lib/capa/capa/capa_problem.py
index 555b3ee6c7..bdb66229af 100644
--- a/common/lib/capa/capa/capa_problem.py
+++ b/common/lib/capa/capa/capa_problem.py
@@ -187,7 +187,7 @@ class LoncapaProblem(object):
# construct script processor context (eg for customresponse problems)
if minimal_init:
- self.context = {'script_code': ""}
+ self.context = {}
else:
self.context = self._extract_context(self.tree)
@@ -195,24 +195,24 @@ class LoncapaProblem(object):
# transformations. This also creates the dict (self.responders) of Response
# instances for each question in the problem. The dict has keys = xml subtree of
# Response, values = Response instance
- self.problem_data = self._preprocess_problem(self.tree)
-
- if not self.student_answers: # True when student_answers is an empty dict
- self.set_initial_display()
-
- # dictionary of InputType objects associated with this problem
- # input_id string -> InputType object
- self.inputs = {}
-
- # Run response late_transforms last (see MultipleChoiceResponse)
- # Sort the responses to be in *_1 *_2 ... order.
- responses = self.responders.values()
- responses = sorted(responses, key=lambda resp: int(resp.id[resp.id.rindex('_') + 1:]))
- for response in responses:
- if hasattr(response, 'late_transforms'):
- response.late_transforms(self)
+ self.problem_data = self._preprocess_problem(self.tree, minimal_init)
if not minimal_init:
+ if not self.student_answers: # True when student_answers is an empty dict
+ self.set_initial_display()
+
+ # dictionary of InputType objects associated with this problem
+ # input_id string -> InputType object
+ self.inputs = {}
+
+ # Run response late_transforms last (see MultipleChoiceResponse)
+ # Sort the responses to be in *_1 *_2 ... order.
+ responses = self.responders.values()
+ responses = sorted(responses, key=lambda resp: int(resp.id[resp.id.rindex('_') + 1:]))
+ for response in responses:
+ if hasattr(response, 'late_transforms'):
+ response.late_transforms(self)
+
self.extracted_tree = self._extract_html(self.tree)
def make_xml_compatible(self, tree):
@@ -869,7 +869,7 @@ class LoncapaProblem(object):
return tree
- def _preprocess_problem(self, tree): # private
+ def _preprocess_problem(self, tree, minimal_init): # private
"""
Assign IDs to all the responses
Assign sub-IDs to all entries (textline, schematic, etc.)
@@ -907,28 +907,31 @@ class LoncapaProblem(object):
# instantiate capa Response
responsetype_cls = responsetypes.registry.get_class_for_tag(response.tag)
- responder = responsetype_cls(response, inputfields, self.context, self.capa_system, self.capa_module)
+ responder = responsetype_cls(
+ response, inputfields, self.context, self.capa_system, self.capa_module, minimal_init
+ )
# save in list in self
self.responders[response] = responder
- # get responder answers (do this only once, since there may be a performance cost,
- # eg with externalresponse)
- self.responder_answers = {}
- for response in self.responders.keys():
- try:
- self.responder_answers[response] = self.responders[response].get_answers()
- except:
- log.debug('responder %s failed to properly return get_answers()',
- self.responders[response]) # FIXME
- raise
+ if not minimal_init:
+ # get responder answers (do this only once, since there may be a performance cost,
+ # eg with externalresponse)
+ self.responder_answers = {}
+ for response in self.responders.keys():
+ try:
+ self.responder_answers[response] = self.responders[response].get_answers()
+ except:
+ log.debug('responder %s failed to properly return get_answers()',
+ self.responders[response]) # FIXME
+ raise
- # ... may not be associated with any specific response; give
- # IDs for those separately
- # TODO: We should make the namespaces consistent and unique (e.g. %s_problem_%i).
- solution_id = 1
- for solution in tree.findall('.//solution'):
- solution.attrib['id'] = "%s_solution_%i" % (self.problem_id, solution_id)
- solution_id += 1
+ # ... may not be associated with any specific response; give
+ # IDs for those separately
+ # TODO: We should make the namespaces consistent and unique (e.g. %s_problem_%i).
+ solution_id = 1
+ for solution in tree.findall('.//solution'):
+ solution.attrib['id'] = "%s_solution_%i" % (self.problem_id, solution_id)
+ solution_id += 1
return problem_data
diff --git a/common/lib/capa/capa/responsetypes.py b/common/lib/capa/capa/responsetypes.py
index 2720f0e28a..6d064845a5 100644
--- a/common/lib/capa/capa/responsetypes.py
+++ b/common/lib/capa/capa/responsetypes.py
@@ -154,7 +154,7 @@ class LoncapaResponse(object):
# By default, we set this to False, allowing subclasses to override as appropriate.
multi_device_support = False
- def __init__(self, xml, inputfields, context, system, capa_module):
+ def __init__(self, xml, inputfields, context, system, capa_module, minimal_init):
"""
Init is passed the following arguments:
@@ -213,28 +213,29 @@ class LoncapaResponse(object):
maxpoints = inputfield.get('points', '1')
self.maxpoints.update({inputfield.get('id'): int(maxpoints)})
- # dict for default answer map (provided in input elements)
- self.default_answer_map = {}
- for entry in self.inputfields:
- answer = entry.get('correct_answer')
- if answer:
- self.default_answer_map[entry.get(
- 'id')] = contextualize_text(answer, self.context)
+ if not minimal_init:
+ # dict for default answer map (provided in input elements)
+ self.default_answer_map = {}
+ for entry in self.inputfields:
+ answer = entry.get('correct_answer')
+ if answer:
+ self.default_answer_map[entry.get(
+ 'id')] = contextualize_text(answer, self.context)
- # Does this problem have partial credit?
- # If so, what kind? Get it as a list of strings.
- partial_credit = xml.xpath('.')[0].get('partial_credit', default=False)
+ # Does this problem have partial credit?
+ # If so, what kind? Get it as a list of strings.
+ partial_credit = xml.xpath('.')[0].get('partial_credit', default=False)
- if str(partial_credit).lower().strip() == 'false':
- self.has_partial_credit = False
- self.credit_type = []
- else:
- self.has_partial_credit = True
- self.credit_type = partial_credit.split(',')
- self.credit_type = [word.strip().lower() for word in self.credit_type]
+ if str(partial_credit).lower().strip() == 'false':
+ self.has_partial_credit = False
+ self.credit_type = []
+ else:
+ self.has_partial_credit = True
+ self.credit_type = partial_credit.split(',')
+ self.credit_type = [word.strip().lower() for word in self.credit_type]
- if hasattr(self, 'setup_response'):
- self.setup_response()
+ if hasattr(self, 'setup_response'):
+ self.setup_response()
def get_max_score(self):
"""