コード例 #1
0
def convert_answers_to_data(answer_store, questionnaire_json, routing_path):
    """
    Convert answers into the data format below
    "data": {
          "001": "01-01-2016",
          "002": "30-03-2016"
        }
    :param answer_store: questionnaire answers
    :param questionnaire_json: The survey json
    :param routing_path: the path followed in the questionnaire
    :return: data in a formatted form
    """
    data = OrderedDict()
    for location in routing_path:
        answers_in_block = answer_store.filter(location=location)
        block_json = SchemaHelper.get_block(questionnaire_json, location.block_id)
        answer_schema_list = SchemaHelper.get_answers_by_id_for_block(block_json)

        for answer in answers_in_block:
            answer_schema = answer_schema_list[answer['answer_id']]
            value = answer['value']

            if answer_schema is not None and value is not None:
                if answer_schema['type'] != 'Checkbox' or any('q_code' not in option for option in answer_schema['options']):
                    data[answer_schema['q_code']] = _get_answer_data(data, answer_schema['q_code'], value)
                else:
                    data.update(_get_checkbox_answer_data(answer_schema, value))
    return data
コード例 #2
0
    def test_get_form_deserialises_month_year_dates(self):
        survey = load_schema_file("test_dates.json")

        block_json = SchemaHelper.get_block(survey, "date-block")
        location = SchemaHelper.get_first_location(survey)
        error_messages = SchemaHelper.get_messages(survey)

        form, _ = get_form_for_location(
            block_json, location,
            AnswerStore([{
                'answer_id': 'month-year-answer',
                'group_id': 'a23d36db-6b07-4ce0-94b2-a843369511e3',
                'group_instance': 0,
                'block_id': 'date-block',
                'value': '05/2015',
                'answer_instance': 0,
            }]), error_messages)

        self.assertTrue(hasattr(form, "month-year-answer"))

        month_year_field = getattr(form, "month-year-answer")

        self.assertEquals(month_year_field.data, {
            'month': '5',
            'year': '2015',
        })
コード例 #3
0
    def test_form_date_range_populates_data(self):
        with self.test_request_context():
            survey = load_schema_file("1_0102.json")

            block_json = SchemaHelper.get_block(survey, "reporting-period")
            error_messages = SchemaHelper.get_messages(survey)

            data = {
                'period-from-day': '01',
                'period-from-month': '3',
                'period-from-year': '2016',
                'period-to-day': '31',
                'period-to-month': '3',
                'period-to-year': '2016'
            }

            expected_form_data = {
                'csrf_token': '',
                'period-from': {
                    'day': '01',
                    'month': '3',
                    'year': '2016'
                },
                'period-to': {
                    'day': '31',
                    'month': '3',
                    'year': '2016'
                }
            }
            form = generate_form(block_json, data, error_messages)

            self.assertEqual(form.data, expected_form_data)
コード例 #4
0
    def setUp(self):
        super().setUp()

        survey = load_schema_file("census_household.json")
        self.block_json = SchemaHelper.get_block(survey,
                                                 'household-composition')
        self.error_messages = SchemaHelper.get_messages(survey)
コード例 #5
0
    def test_post_form_for_radio_other_selected(self):
        with self.test_request_context():
            survey = load_schema_file("test_radio.json")

            block_json = SchemaHelper.get_block(survey, 'radio-mandatory')
            location = Location('radio', 0, 'radio-mandatory')
            error_messages = SchemaHelper.get_messages(survey)

            answer_store = AnswerStore([{
                'answer_id': 'radio-mandatory-answer',
                'block_id': 'radio-mandatory',
                'value': 'Other',
                'answer_instance': 0,
            }, {
                'answer_id': 'other-answer-mandatory',
                'block_id': 'block-1',
                'value': 'Other text field value',
                'answer_instance': 0,
            }])

            radio_answer = SchemaHelper.get_first_answer_for_block(block_json)
            text_answer = 'other-answer-mandatory'

            form, _ = post_form_for_location(
                block_json, location, answer_store,
                MultiDict({
                    '{answer_id}'.format(answer_id=radio_answer['id']):
                    'Other',
                    '{answer_id}'.format(answer_id=text_answer):
                    'Other text field value',
                }), error_messages)

            other_text_field = getattr(form, 'other-answer-mandatory')
            self.assertEqual(other_text_field.data, 'Other text field value')
コード例 #6
0
    def test_generate_relationship_form_errors_are_correctly_mapped(self):
        with self.test_request_context():
            survey = load_schema_file("test_relationship_household.json")
            block_json = SchemaHelper.get_block(survey, 'relationships')
            error_messages = SchemaHelper.get_messages(survey)

            answer = SchemaHelper.get_first_answer_for_block(block_json)

            generated_form = generate_relationship_form(
                block_json, 3, None, error_messages=error_messages)

            form = generate_relationship_form(
                block_json,
                3, {
                    'csrf_token': generated_form.csrf_token.current_token,
                    '{answer_id}-0'.format(answer_id=answer['id']): '1',
                    '{answer_id}-1'.format(answer_id=answer['id']): '3',
                },
                error_messages=error_messages)

            form.validate()
            mapped_errors = form.map_errors()

            message = "Not a valid choice"

            self.assertTrue(
                self._error_exists(answer['id'], message, mapped_errors))
コード例 #7
0
    def test_generate_relationship_form_creates_form_from_data(self):
        with self.test_request_context():
            survey = load_schema_file("test_relationship_household.json")
            block_json = SchemaHelper.get_block(survey, 'relationships')
            error_messages = SchemaHelper.get_messages(survey)

            answer = SchemaHelper.get_first_answer_for_block(block_json)

            form = generate_relationship_form(
                block_json,
                3, {
                    '{answer_id}-0'.format(answer_id=answer['id']):
                    'Husband or Wife',
                    '{answer_id}-1'.format(answer_id=answer['id']):
                    'Brother or Sister',
                    '{answer_id}-2'.format(answer_id=answer['id']):
                    'Relation - other',
                },
                error_messages=error_messages)

            self.assertTrue(hasattr(form, answer['id']))

            expected_form_data = [
                'Husband or Wife', 'Brother or Sister', 'Relation - other'
            ]
            self.assertEqual(form.data[answer['id']], expected_form_data)
コード例 #8
0
    def test_post_form_for_household_composition(self):

        survey = load_schema_file("census_household.json")

        block_json = SchemaHelper.get_block(survey, 'household-composition')
        location = Location('who-lives-here', 0, 'household-composition')
        error_messages = SchemaHelper.get_messages(survey)

        form, _ = post_form_for_location(
            block_json, location, AnswerStore(), {
                'household-0-first-name': 'Joe',
                'household-0-last-name': '',
                'household-1-first-name': 'Bob',
                'household-1-last-name': 'Seymour',
            }, error_messages)

        self.assertEqual(len(form.household.entries), 2)
        self.assertEqual(form.household.entries[0].data, {
            'first-name': 'Joe',
            'middle-names': '',
            'last-name': ''
        })
        self.assertEqual(form.household.entries[1].data, {
            'first-name': 'Bob',
            'middle-names': '',
            'last-name': 'Seymour'
        })
コード例 #9
0
    def setUp(self):
        self.app = create_app()
        self.app.config['SERVER_NAME'] = "test"
        self.app_context = self.app.app_context()
        self.app_context.push()

        survey = load_schema_file("census_household.json")
        self.block_json = SchemaHelper.get_block(survey, 'household-composition')
        self.error_messages = SchemaHelper.get_messages(survey)
コード例 #10
0
    def test_form_ids_match_block_answer_ids(self):
        survey = load_schema_file("1_0102.json")

        block_json = SchemaHelper.get_block(survey, "reporting-period")
        error_messages = SchemaHelper.get_messages(survey)

        form = generate_form(block_json, {}, error_messages)

        for answer in SchemaHelper.get_answers_for_block(block_json):
            self.assertTrue(hasattr(form, answer['id']))
コード例 #11
0
    def test_option_has_other(self):
        with self.test_request_context():
            survey = load_schema_file("test_checkbox.json")
            block_json = SchemaHelper.get_block(survey, "mandatory-checkbox")
            error_messages = SchemaHelper.get_messages(survey)

            form = generate_form(block_json, {}, error_messages)

            self.assertFalse(
                form.option_has_other("mandatory-checkbox-answer", 1))
            self.assertTrue(
                form.option_has_other("mandatory-checkbox-answer", 6))
コード例 #12
0
    def test_generate_relationship_form_creates_empty_form(self):
        survey = load_schema_file("test_relationship_household.json")
        block_json = SchemaHelper.get_block(survey, 'relationships')
        error_messages = SchemaHelper.get_messages(survey)

        answer = SchemaHelper.get_first_answer_for_block(block_json)

        form = generate_relationship_form(block_json,
                                          3, {},
                                          error_messages=error_messages)

        self.assertTrue(hasattr(form, answer['id']))
        self.assertEqual(len(form.data[answer['id']]), 3)
コード例 #13
0
    def test_generate_month_year_date_form_creates_empty_form(self):
        survey = load_schema_file("test_dates.json")
        block_json = SchemaHelper.get_block(survey, 'date-block')
        error_messages = SchemaHelper.get_messages(survey)

        answers = SchemaHelper.get_answers_by_id_for_block(block_json)

        form = get_month_year_form(answers['month-year-answer'],
                                   error_messages=error_messages)

        self.assertFalse(hasattr(form, 'day'))
        self.assertTrue(hasattr(form, 'month'))
        self.assertTrue(hasattr(form, 'year'))
コード例 #14
0
    def test_get_other_answer_invalid(self):
        with self.test_request_context():
            survey = load_schema_file("test_checkbox.json")
            block_json = SchemaHelper.get_block(survey, "mandatory-checkbox")
            error_messages = SchemaHelper.get_messages(survey)

            form = generate_form(block_json,
                                 {"other-answer-mandatory": "Some data"},
                                 error_messages)

            field = form.get_other_answer("mandatory-checkbox-answer", 4)

            self.assertEqual(None, field)
コード例 #15
0
    def test_answer_with_child_inherits_mandatory_from_parent(self):
        with self.test_request_context():
            survey = load_schema_file("test_radio.json")

            block_json = SchemaHelper.get_block(survey, "radio-mandatory")
            error_messages = SchemaHelper.get_messages(survey)

            form = generate_form(block_json,
                                 {'radio-mandatory-answer': 'Other'},
                                 error_messages)

            child_field = getattr(form, 'other-answer-mandatory')

            self.assertIsInstance(child_field.validators[0], ResponseRequired)
コード例 #16
0
    def test_get_parent_options_for_block(self):
        survey = load_schema_file("test_checkbox.json")
        block_json = SchemaHelper.get_block(survey, 'mandatory-checkbox')

        parent_options = SchemaHelper.get_parent_options_for_block(block_json)

        expected = {
            'mandatory-checkbox-answer': {
                'index': 6,
                'child_answer_id': 'other-answer-mandatory'
            }
        }

        self.assertEqual(parent_options, expected)
コード例 #17
0
    def test_answer_with_child_inherits_mandatory_from_parent(self):
        survey = load_schema_file("test_radio.json")

        block_json = SchemaHelper.get_block(survey, "block-1")
        error_messages = SchemaHelper.get_messages(survey)

        form = generate_form(block_json,
                             {'ca3ce3a3-ae44-4e30-8f85-5b6a7a2fb23c': 'Other'},
                             error_messages)

        child_field = getattr(form, 'other-answer-mandatory')

        self.assertIsInstance(child_field.validators[0],
                              validators.InputRequired)
コード例 #18
0
    def test_get_form_for_household_relationship(self):
        with self.test_request_context():
            survey = load_schema_file("census_household.json")

            block_json = SchemaHelper.get_block(survey,
                                                'household-relationships')
            location = Location('who-lives-here-relationship', 0,
                                'household-relationships')
            error_messages = SchemaHelper.get_messages(survey)

            answer_store = AnswerStore([{
                'group_id': 'who-lives-here-relationship',
                'group_instance': 0,
                'answer_id': 'first-name',
                'block_id': 'household-composition',
                'value': 'Joe',
                'answer_instance': 0,
            }, {
                'group_id': 'who-lives-here-relationship',
                'group_instance': 0,
                'answer_id': 'last-name',
                'block_id': 'household-composition',
                'value': 'Bloggs',
                'answer_instance': 0,
            }, {
                'group_id': 'who-lives-here-relationship',
                'group_instance': 1,
                'answer_id': 'first-name',
                'block_id': 'household-composition',
                'value': 'Jane',
                'answer_instance': 1,
            }, {
                'group_id': 'who-lives-here-relationship',
                'group_instance': 1,
                'answer_id': 'last-name',
                'block_id': 'household-composition',
                'value': 'Bloggs',
                'answer_instance': 1,
            }])
            form, _ = get_form_for_location(block_json, location, answer_store,
                                            error_messages)

            answer = SchemaHelper.get_first_answer_for_block(block_json)

            self.assertTrue(hasattr(form, answer['id']))

            field_list = getattr(form, answer['id'])

            # With two people, we need to define 1 relationship
            self.assertEqual(len(field_list.entries), 1)
コード例 #19
0
    def test_post_form_for_household_relationship(self):
        with self.test_request_context():
            survey = load_schema_file("census_household.json")

            block_json = SchemaHelper.get_block(survey,
                                                'household-relationships')
            location = Location('who-lives-here-relationship', 0,
                                'household-relationships')
            error_messages = SchemaHelper.get_messages(survey)

            answer_store = AnswerStore([{
                'answer_id': 'first-name',
                'block_id': 'household-composition',
                'value': 'Joe',
                'answer_instance': 0,
            }, {
                'answer_id': 'last-name',
                'block_id': 'household-composition',
                'value': 'Bloggs',
                'answer_instance': 0,
            }, {
                'answer_id': 'first-name',
                'block_id': 'household-composition',
                'value': 'Jane',
                'answer_instance': 1,
            }, {
                'answer_id': 'last-name',
                'block_id': 'household-composition',
                'value': 'Bloggs',
                'answer_instance': 1,
            }])

            answer = SchemaHelper.get_first_answer_for_block(block_json)

            form, _ = post_form_for_location(
                block_json, location, answer_store,
                MultiDict(
                    {'{answer_id}-0'.format(answer_id=answer['id']): '3'}),
                error_messages)

            self.assertTrue(hasattr(form, answer['id']))

            field_list = getattr(form, answer['id'])

            # With two people, we need to define 1 relationship
            self.assertEqual(len(field_list.entries), 1)

            # Check the data matches what was passed from request
            self.assertEqual(field_list.entries[0].data, "3")
コード例 #20
0
    def test_answer_errors_are_mapped(self):
        survey = load_schema_file("1_0112.json")

        block_json = SchemaHelper.get_block(survey, "total-retail-turnover")
        error_messages = SchemaHelper.get_messages(survey)

        form = generate_form(block_json,
                             {'total-retail-turnover-answer': "-1"},
                             error_messages)

        form.validate()
        answer_errors = form.answer_errors('total-retail-turnover-answer')
        self.assertIn(
            "The value cannot be negative. Please correct your answer.",
            answer_errors)
コード例 #21
0
    def test_form_errors_are_correctly_mapped(self):
        survey = load_schema_file("1_0112.json")

        block_json = SchemaHelper.get_block(survey, "total-retail-turnover")
        error_messages = SchemaHelper.get_messages(survey)

        form = generate_form(block_json, {}, error_messages)

        form.validate()
        mapped_errors = form.map_errors()

        message = "Please provide a value, even if your value is 0."

        self.assertTrue(
            self._error_exists('total-retail-turnover-answer', message,
                               mapped_errors))
コード例 #22
0
    def test_form_subfield_errors_are_correctly_mapped(self):
        survey = load_schema_file("1_0102.json")

        block_json = SchemaHelper.get_block(survey, "reporting-period")
        error_messages = SchemaHelper.get_messages(survey)

        form = generate_form(block_json, {}, error_messages)

        message = "Please provide an answer to continue."

        form.validate()
        mapped_errors = form.map_errors()

        self.assertTrue(self._error_exists('period-to', message,
                                           mapped_errors))
        self.assertTrue(
            self._error_exists('period-from', message, mapped_errors))
コード例 #23
0
    def test_get_form_for_household_composition(self):

        survey = load_schema_file("census_household.json")

        block_json = SchemaHelper.get_block(survey, 'household-composition')
        location = Location('who-lives-here', 0, 'household-composition')
        error_messages = SchemaHelper.get_messages(survey)

        form, _ = get_form_for_location(block_json, location, AnswerStore(),
                                        error_messages)

        self.assertTrue(hasattr(form, "household"))
        self.assertEquals(len(form.household.entries), 1)

        first_field_entry = form.household[0]

        self.assertTrue(hasattr(first_field_entry, "first-name"))
        self.assertTrue(hasattr(first_field_entry, "middle-names"))
        self.assertTrue(hasattr(first_field_entry, "last-name"))
コード例 #24
0
    def test_get_form_deserialises_dates(self):
        with self.test_request_context():
            survey = load_schema_file("1_0102.json")

            block_json = SchemaHelper.get_block(survey, "reporting-period")
            location = Location('rsi', 0, 'reporting-period')
            error_messages = SchemaHelper.get_messages(survey)

            form, _ = get_form_for_location(
                block_json, location,
                AnswerStore([{
                    'answer_id': 'period-from',
                    'group_id': 'rsi',
                    'group_instance': 0,
                    'block_id': 'reporting-period',
                    'value': '01/05/2015',
                    'answer_instance': 0,
                }, {
                    'answer_id': 'period-to',
                    'group_id': 'rsi',
                    'group_instance': 0,
                    'block_id': 'reporting-period',
                    'value': '01/09/2017',
                    'answer_instance': 0,
                }]), error_messages)

            self.assertTrue(hasattr(form, "period-to"))
            self.assertTrue(hasattr(form, "period-from"))

            period_to_field = getattr(form, "period-to")
            period_from_field = getattr(form, "period-from")

            self.assertEqual(period_from_field.data, {
                'day': '01',
                'month': '5',
                'year': '2015',
            })
            self.assertEqual(period_to_field.data, {
                'day': '01',
                'month': '9',
                'year': '2017',
            })
コード例 #25
0
    def test_get_form_for_block_location(self):

        survey = load_schema_file("1_0102.json")

        block_json = SchemaHelper.get_block(survey, "reporting-period")
        location = SchemaHelper.get_first_location(survey)
        error_messages = SchemaHelper.get_messages(survey)

        form, _ = get_form_for_location(block_json, location, AnswerStore(),
                                        error_messages)

        self.assertTrue(hasattr(form, "period-to"))
        self.assertTrue(hasattr(form, "period-from"))

        period_from_field = getattr(form, "period-from")
        period_to_field = getattr(form, "period-to")

        self.assertIsInstance(period_from_field.day.validators[0],
                              DateRequired)
        self.assertIsInstance(period_to_field.day.validators[0], DateRequired)
コード例 #26
0
    def test_answer_with_child_errors_are_correctly_mapped(self):
        survey = load_schema_file("test_radio.json")

        block_json = SchemaHelper.get_block(survey, "block-1")
        error_messages = SchemaHelper.get_messages(survey)

        form = generate_form(block_json,
                             {'ca3ce3a3-ae44-4e30-8f85-5b6a7a2fb23c': 'Other'},
                             error_messages)

        form.validate()
        mapped_errors = form.map_errors()

        message = "This field is mandatory."

        self.assertTrue(
            self._error_exists("ca3ce3a3-ae44-4e30-8f85-5b6a7a2fb23c", message,
                               mapped_errors))
        self.assertFalse(
            self._error_exists("other-answer-mandatory", message,
                               mapped_errors))
コード例 #27
0
    def test_answer_with_child_errors_are_correctly_mapped(self):
        with self.test_request_context():
            survey = load_schema_file("test_radio.json")

            block_json = SchemaHelper.get_block(survey, 'radio-mandatory')
            error_messages = SchemaHelper.get_messages(survey)

            form = generate_form(block_json,
                                 {'radio-mandatory-answer': 'Other'},
                                 error_messages)

            form.validate()
            mapped_errors = form.map_errors()

            message = "This field is mandatory."

            self.assertTrue(
                self._error_exists("radio-mandatory-answer", message,
                                   mapped_errors))
            self.assertFalse(
                self._error_exists("other-answer-mandatory", message,
                                   mapped_errors))
コード例 #28
0
    def test_post_form_for_block_location(self):
        with self.test_request_context():
            survey = load_schema_file("1_0102.json")

            block_json = SchemaHelper.get_block(survey, "reporting-period")
            location = SchemaHelper.get_first_location(survey)
            error_messages = SchemaHelper.get_messages(survey)

            form, _ = post_form_for_location(
                block_json, location, AnswerStore(), {
                    'period-from-day': '1',
                    'period-from-month': '05',
                    'period-from-year': '2015',
                    'period-to-day': '1',
                    'period-to-month': '09',
                    'period-to-year': '2017',
                }, error_messages)

            self.assertTrue(hasattr(form, "period-to"))
            self.assertTrue(hasattr(form, "period-from"))

            period_to_field = getattr(form, "period-to")
            period_from_field = getattr(form, "period-from")

            self.assertIsInstance(period_from_field.month.validators[0],
                                  DateRequired)
            self.assertIsInstance(period_to_field.month.validators[0],
                                  DateRequired)

            self.assertEqual(period_from_field.data, {
                'day': '1',
                'month': '05',
                'year': '2015',
            })
            self.assertEqual(period_to_field.data, {
                'day': '1',
                'month': '09',
                'year': '2017',
            })
コード例 #29
0
    def test_get_form_deserialises_lists(self):
        survey = load_schema_file("test_checkbox.json")

        block_json = SchemaHelper.get_block(survey, "block-1")
        location = SchemaHelper.get_first_location(survey)
        error_messages = SchemaHelper.get_messages(survey)

        form, _ = get_form_for_location(
            block_json, location,
            AnswerStore([{
                'answer_id': 'ca3ce3a3-ae44-4e30-8f85-5b6a7a2fb23c',
                'group_id': '14ba4707-321d-441d-8d21-b8367366e761',
                'group_instance': 0,
                'block_id': 'block-1',
                'value': ['Cheese', 'Ham'],
                'answer_instance': 0,
            }]), error_messages)

        self.assertTrue(hasattr(form, "ca3ce3a3-ae44-4e30-8f85-5b6a7a2fb23c"))

        checkbox_field = getattr(form, "ca3ce3a3-ae44-4e30-8f85-5b6a7a2fb23c")

        self.assertEquals(checkbox_field.data, ['Cheese', 'Ham'])
コード例 #30
0
    def test_date_range_to_precedes_from_raises_question_error(self):
        with self.test_request_context():
            survey = load_schema_file("1_0102.json")

            block_json = SchemaHelper.get_block(survey, "reporting-period")
            error_messages = SchemaHelper.get_messages(survey)

            data = {
                'period-from-day': '25',
                'period-from-month': '12',
                'period-from-year': '2016',
                'period-to-day': '24',
                'period-to-month': '12',
                'period-to-year': '2016'
            }

            expected_form_data = {
                'csrf_token': '',
                'period-from': {
                    'day': '25',
                    'month': '12',
                    'year': '2016'
                },
                'period-to': {
                    'day': '24',
                    'month': '12',
                    'year': '2016'
                }
            }
            form = generate_form(block_json, data, error_messages)

            expected_message = "The 'period to' date cannot be before the 'period from' date."

            form.validate()
            self.assertEqual(form.data, expected_form_data)
            self.assertEqual(form.question_errors['reporting-period-question'],
                             expected_message)