From 314c5728255ddb437eb29a477ab99a157e400ac2 Mon Sep 17 00:00:00 2001 From: ichuang Date: Tue, 10 Jul 2012 22:30:32 -0400 Subject: [PATCH] fix capa_problem to call each responder's get_answers() just once --- common/lib/capa/capa/capa_problem.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) 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