diff --git a/common/lib/capa/capa/capa_problem.py b/common/lib/capa/capa/capa_problem.py
index e833545192..f3f0187f1f 100644
--- a/common/lib/capa/capa/capa_problem.py
+++ b/common/lib/capa/capa/capa_problem.py
@@ -147,7 +147,7 @@ class LoncapaProblem(object):
used to give complex problems (eg programming questions) multiple points.
'''
maxscore = 0
- for responder in self.responders.values():
+ for response, responder in self.responders.iteritems():
if hasattr(responder,'get_max_score'):
try:
maxscore += responder.get_max_score()
@@ -155,11 +155,7 @@ class LoncapaProblem(object):
log.debug('responder %s failed to properly return from get_max_score()' % responder) # FIXME
raise
else:
- try:
- maxscore += len(responder.get_answers())
- except:
- log.debug('responder %s failed to properly return get_answers()' % responder) # FIXME
- raise
+ maxscore += len(self.responder_answers[response])
return maxscore
def get_score(self):
@@ -211,8 +207,8 @@ class LoncapaProblem(object):
(see capa_module)
"""
answer_map = dict()
- for responder in self.responders.values():
- results = responder.get_answers()
+ for response in self.responders.keys():
+ results = self.responder_answers[response]
answer_map.update(results) # dict of (id,correct_answer)
# include solutions from ... stanzas
@@ -228,8 +224,9 @@ class LoncapaProblem(object):
the dicts returned by grade_answers and get_question_answers. (Though
get_question_answers may only return a subset of these."""
answer_ids = []
- for responder in self.responders.values():
- answer_ids.append(responder.get_answers().keys())
+ for response in self.responders.keys():
+ results = self.responder_answers[response]
+ answer_ids.append(results.keys())
return answer_ids
def get_html(self):
@@ -382,6 +379,8 @@ class LoncapaProblem(object):
In-place transformation
Also create capa Response instances for each responsetype and save as self.responders
+
+ Obtain all responder answers and save as self.responder_answers dict (key = response)
'''
response_id = 1
self.responders = {}
@@ -402,6 +401,15 @@ class LoncapaProblem(object):
responder = response_tag_dict[response.tag](response, inputfields, self.context, self.system) # instantiate capa Response
self.responders[response] = responder # save in list in self
+ # 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] = responder.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