diff --git a/questionnaire/dependency_checker.py b/questionnaire/dependency_checker.py index fd70971..331bdb4 100644 --- a/questionnaire/dependency_checker.py +++ b/questionnaire/dependency_checker.py @@ -2,6 +2,19 @@ from questionnaire.models import Question, Answer import logging +def explode_answer_into_list(answers): + answer_list = [] + + for answer in answers: + if type(answer) == type(list()): + for list_answer in answer: + answer_list.append(list_answer) + else: + answer_list.append(answer) + + return answer_list + + def check_actual_answers_against_expression(check_answer, actual_answer, check_question): # Numeric Value Expressions if check_answer[0:1] in "<>": @@ -122,7 +135,6 @@ def dep_check(expr, runinfo, answerdict): # Convert freeform question type answers from a list of lists to just a single list. # FIXME: Figure out why the hell freeform questions store their values as lists within lists. - if type(actual_answer) == type(list()): - actual_answer = actual_answer[0] + answer_list = explode_answer_into_list(actual_answer) - return check_actual_answers_against_expression(check_answer, actual_answer, check_question) + return check_actual_answers_against_expression(check_answer, answer_list, check_question) diff --git a/questionnaire/tests.py b/questionnaire/tests.py index 460038e..43c1814 100644 --- a/questionnaire/tests.py +++ b/questionnaire/tests.py @@ -1,10 +1,20 @@ from django.test import TestCase -from dependency_checker import check_actual_answers_against_expression +from dependency_checker import check_actual_answers_against_expression, explode_answer_into_list from .models import Question class QuestionSetTests(TestCase): + def test_exploding_answer_into_list(self): + answer = ['1A'] + self.assertEqual(['1A'], explode_answer_into_list(answer)) + + answer = ['1A', ['foobar']] + self.assertEqual(['1A', 'foobar'], explode_answer_into_list(answer)) + + answer = ['1A', ['foobar', 'barfoo']] + self.assertEqual(['1A', 'foobar', 'barfoo'], explode_answer_into_list(answer)) + def test_dependencies_for_multiple_choice_question(self): check_question = Question() self.assertTrue(check_actual_answers_against_expression('3B', ['3B', '3E'], check_question))