Exemplo n.º 1
0
 def setUp(self):
     self.item = ExportItem(
         path=[PathNode(name='data'),
               PathNode(name='question1')],
         label='Question One',
         last_occurrences={self.app_id: 3},
     )
Exemplo n.º 2
0
 def test_inferred_schema_merge(self):
     schema = CaseExportDataSchema(
         domain='my-domain',
         group_schemas=[
             ExportGroupSchema(
                 path=MAIN_TABLE,
                 items=[ExportItem(path=[PathNode(name='case_property')])],
             )
         ])
     inferred_schema = CaseExportDataSchema(
         domain='my-domain',
         group_schemas=[
             ExportGroupSchema(
                 path=MAIN_TABLE,
                 items=[
                     ExportItem(
                         path=[PathNode(name='case_property')],
                         inferred=True,
                     )
                 ],
                 inferred=True,
             )
         ])
     merged = ExportDataSchema._merge_schemas(schema, inferred_schema)
     self.assertEqual(len(merged.group_schemas), 1)
     self.assertTrue(merged.group_schemas[0].inferred)
     group_schema = merged.group_schemas[0]
     self.assertEqual(len(group_schema.items), 1)
     self.assertTrue(group_schema.items[0].inferred)
    def test_multiple_choice_merge(self):
        """Tests merging of a form that changes the options to a multiple choice question"""
        merged = self._get_merged_schema('multiple_choice_form', 'multiple_choice_form_version2')

        self.assertEqual(len(merged.group_schemas), 1)

        group_schema = merged.group_schemas[0]
        self.assertEqual(len(group_schema.items), 2)

        v2items = filter(lambda item: item.last_occurrences[self.app_id] == 2, group_schema.items)
        self.assertEqual(len(v2items), 2)

        multichoice = filter(
            lambda item: item.path == [PathNode(name='form'), PathNode(name='question2')],
            group_schema.items
        )[0]
        self.assertEqual(len(multichoice.options), 3)
        self.assertEqual(
            len(filter(lambda o: o.last_occurrences[self.app_id] == 2, multichoice.options)),
            2,
        )

        self.assertEqual(
            len(filter(lambda o: o.last_occurrences[self.app_id] == 1, multichoice.options)),
            1,
        )
Exemplo n.º 4
0
    def test_partial_match_ordering(self):
        schema = self._create_schema([
            ExportItem(path=[PathNode(name='two')]),
            ExportItem(path=[PathNode(name='one')]),
            ExportItem(path=[PathNode(name='three')]),
        ])

        ordered_schema = self._create_schema([
            ExportItem(path=[PathNode(name='one')]),
            ExportItem(path=[PathNode(name='four')]),
            ExportItem(path=[PathNode(name='five')]),
            ExportItem(path=[PathNode(name='six')]),
        ])

        schema = CaseExportDataSchema._reorder_schema_from_schema(
            schema,
            ordered_schema,
        )
        self._assert_item_order(
            schema,
            [],
            [
                ExportItem(path=[PathNode(name='one')]),
                ExportItem(path=[PathNode(name='two')]),
                ExportItem(path=[PathNode(name='three')]),
            ],
        )
Exemplo n.º 5
0
 def test_allow_non_data_nodes(self):
     """
     Ensure that we allow non data nodes
     """
     self.assertEqual(_question_path_to_path_nodes("/nodata/question", []),
                      [
                          PathNode(name='form', is_repeat=False),
                          PathNode(name='question', is_repeat=False),
                      ])
Exemplo n.º 6
0
    def setUpClass(cls):
        cls.current_app = Application.wrap(cls.get_json('basic_application'))

        cls.first_build = Application.wrap(cls.get_json('basic_application'))
        cls.first_build._id = '123'
        cls.first_build.copy_of = cls.current_app.get_id
        cls.first_build.version = 3

        cls.advanced_app = Application.new_app('domain',
                                               "Untitled Application")
        module = cls.advanced_app.add_module(
            AdvancedModule.new_module('Untitled Module', None))
        form = module.new_form("Untitled Form",
                               cls.get_xml('repeat_group_form'))
        form.xmlns = 'repeat-xmlns'
        form.actions.open_cases = [
            AdvancedOpenCaseAction(
                case_type="advanced",
                case_tag="open_case_0",
                name_path="/data/question3/question4",
                repeat_context="/data/question3",
            )
        ]

        cls.apps = [
            cls.current_app,
            cls.first_build,
            cls.advanced_app,
        ]
        with drop_connected_signals(app_post_save):
            for app in cls.apps:
                app.save()

        cls.inferred_schema = InferredSchema(
            domain=cls.domain,
            case_type=cls.case_type,
            group_schemas=[
                InferredExportGroupSchema(
                    path=MAIN_TABLE,
                    items=[
                        ExportItem(path=[
                            PathNode(name='data'),
                            PathNode(name='case_property')
                        ],
                                   label='Inferred 1',
                                   inferred=True),
                        ExportItem(path=[
                            PathNode(name='data'),
                            PathNode(name='case_property_2')
                        ],
                                   label='Inferred 1',
                                   inferred=True),
                    ],
                    inferred=True),
            ])
        cls.inferred_schema.save()
    def test_xform_parsing_with_repeat_group(self):
        form_xml = self.get_xml('repeat_group_form')

        schema = FormExportDataSchema._generate_schema_from_xform(
            XForm(form_xml),
            [],
            ['en'],
            self.app_id,
            1
        )

        self.assertEqual(len(schema.group_schemas), 2)

        group_schema = schema.group_schemas[0]
        self.assertEqual(len(group_schema.items), 2)
        self.assertEqual(group_schema.path, MAIN_TABLE)

        form_items = filter(lambda item: item.tag is None, group_schema.items)
        self.assertEqual(form_items[0].path, [PathNode(name='form'), PathNode(name='question1')])
        self.assertEqual(form_items[1].path, [PathNode(name='form'), PathNode(name='zendquestion')])

        group_schema = schema.group_schemas[1]
        self.assertEqual(len(group_schema.items), 1)
        self.assertEqual(
            group_schema.path,
            [PathNode(name='form'), PathNode(name='question3', is_repeat=True)]
        )
        self.assertEqual(
            group_schema.items[0].path,
            [PathNode(name='form'), PathNode(name='question3', is_repeat=True), PathNode(name='question4')]
        )
Exemplo n.º 8
0
    def test_labels_in_xform(self):
        form_xml = self.get_xml('form_with_labels')

        schema = FormExportDataSchema._generate_schema_from_xform(
            XForm(form_xml), ['en'], self.app_id, 1)

        self.assertEqual(len(schema.group_schemas), 1)

        group_schema = schema.group_schemas[0]

        self.assertEqual(len(group_schema.items), 1)
        self.assertEqual(group_schema.items[0].path,
                         [PathNode(name='form'),
                          PathNode(name='label')])
        self.assertIsInstance(group_schema.items[0], LabelItem)
    def test_xform_parsing_with_stock_questions(self):
        form_xml = self.get_xml('stock_form')
        schema = FormExportDataSchema._generate_schema_from_xform(
            XForm(form_xml),
            [],
            ['en'],
            self.app_id,
            1
        )
        self.assertEqual(len(schema.group_schemas), 1)
        group_schema = schema.group_schemas[0]

        self.assertEqual(len(group_schema.items), 6)
        self.assertTrue(all(map(lambda item: item.doc_type == 'StockItem', group_schema.items)))
        for parent_attr in ['@type', '@entity-id', '@date', '@section-id']:
            self.assertTrue(any(map(
                lambda item: item.path == [
                    PathNode(name='form'),
                    PathNode(name='balance:balance_one'),
                    PathNode(name=parent_attr),
                ],
                group_schema.items,
            )))

        for entry_attr in ['@id', '@quantity']:
            self.assertTrue(any(map(
                lambda item: item.path == [
                    PathNode(name='form'),
                    PathNode(name='balance:balance_one'),
                    PathNode(name='entry'),
                    PathNode(name=entry_attr),
                ],
                group_schema.items,
            )))
Exemplo n.º 10
0
def _convert_index_to_path_nodes(index):
    from corehq.apps.export.models.new import MAIN_TABLE
    from corehq.apps.export.models.new import PathNode
    if index == '#':
        return MAIN_TABLE
    elif _is_repeat(index):
        split_index = index.split('.')[1:]  # Remove first "#"
        path = []

        for part in split_index:
            # If the part is "#" we know the previous piece in the path is a repeat group
            if part == '#':
                path[-1].is_repeat = True
            else:
                path.append(PathNode(name=part, is_repeat=False))
        return path
    else:
        return [PathNode(name=n) for n in index.split('.')]
Exemplo n.º 11
0
    def test_basic_xform_parsing(self):
        form_xml = self.get_xml('basic_form')

        schema = FormExportDataSchema._generate_schema_from_xform(
            XForm(form_xml), ['en'], self.app_id, 1)

        self.assertEqual(len(schema.group_schemas), 1)

        group_schema = schema.group_schemas[0]

        self.assertEqual(len(group_schema.items), 2)

        form_items = [item for item in group_schema.items if item.tag is None]
        self.assertEqual(form_items[0].path,
                         [PathNode(name='form'),
                          PathNode(name='question1')])
        self.assertEqual(form_items[1].path,
                         [PathNode(name='form'),
                          PathNode(name='question2')])
Exemplo n.º 12
0
    def test_xform_parsing_with_multiple_choice(self):
        form_xml = self.get_xml('multiple_choice_form')
        schema = FormExportDataSchema._generate_schema_from_xform(
            XForm(form_xml), [], ['en'], self.app_id, 1)

        self.assertEqual(len(schema.group_schemas), 1)
        group_schema = schema.group_schemas[0]

        self.assertEqual(len(group_schema.items), 2)
        form_items = filter(lambda item: item.tag is None, group_schema.items)
        self.assertEqual(form_items[0].path,
                         [PathNode(name='form'),
                          PathNode(name='question1')])

        self.assertEqual(form_items[1].path,
                         [PathNode(name='form'),
                          PathNode(name='question2')])
        self.assertEqual(form_items[1].options[0].value, 'choice1')
        self.assertEqual(form_items[1].options[1].value, 'choice2')
    def test_case_type_metadata_parsing(self):

        case_property_mapping = {
            'candy': ['my_case_property', 'my_second_case_property']
        }
        schema = CaseExportDataSchema._generate_schema_from_case_property_mapping(
            case_property_mapping,
            [],
            self.app_id,
            1,
        )
        self.assertEqual(len(schema.group_schemas), 1)
        group_schema = schema.group_schemas[0]

        my_case_property_item = group_schema.items[0]
        my_second_case_property_item = group_schema.items[1]
        self.assertEqual(my_case_property_item.path, [PathNode(name='my_case_property')])
        self.assertEqual(my_case_property_item.last_occurrences[self.app_id], 1)
        self.assertEqual(my_second_case_property_item.path, [PathNode(name='my_second_case_property')])
        self.assertEqual(my_second_case_property_item.last_occurrences[self.app_id], 1)
Exemplo n.º 14
0
    def setUpClass(cls):
        cls.current_app = Application.wrap(cls.get_json('basic_application'))

        cls.first_build = Application.wrap(cls.get_json('basic_application'))
        cls.first_build._id = '123'
        cls.first_build.copy_of = cls.current_app.get_id
        cls.first_build.version = 3

        cls.apps = [
            cls.current_app,
            cls.first_build,
        ]
        with drop_connected_signals(app_post_save):
            for app in cls.apps:
                app.save()

        cls.inferred_schema = InferredSchema(
            domain=cls.domain,
            case_type=cls.case_type,
            group_schemas=[
                InferredExportGroupSchema(
                    path=MAIN_TABLE,
                    items=[
                        ExportItem(path=[
                            PathNode(name='data'),
                            PathNode(name='case_property')
                        ],
                                   label='Inferred 1',
                                   inferred=True),
                        ExportItem(path=[
                            PathNode(name='data'),
                            PathNode(name='case_property_2')
                        ],
                                   label='Inferred 1',
                                   inferred=True),
                    ],
                    inferred=True),
            ])
        cls.inferred_schema.save()
Exemplo n.º 15
0
    def test_multiple_choice_merge(self):
        """Tests merging of a form that changes the options to a multiple choice question"""
        merged = self._get_merged_schema('multiple_choice_form',
                                         'multiple_choice_form_version2')

        self.assertEqual(len(merged.group_schemas), 1)

        group_schema = merged.group_schemas[0]
        self.assertEqual(len(group_schema.items), 2)

        v2items = [
            item for item in group_schema.items
            if item.last_occurrences[self.app_id] == 2
        ]
        self.assertEqual(len(v2items), 2)

        multichoice = [
            item for item in group_schema.items if item.path ==
            [PathNode(name='form'),
             PathNode(name='question2')]
        ][0]
        self.assertEqual(len(multichoice.options), 3)
        self.assertEqual(
            len([
                o for o in multichoice.options
                if o.last_occurrences[self.app_id] == 2
            ]),
            2,
        )

        self.assertEqual(
            len([
                o for o in multichoice.options
                if o.last_occurrences[self.app_id] == 1
            ]),
            1,
        )
Exemplo n.º 16
0
def _convert_stock_column(new_table, old_column):
    from .models import PathNode
    # Handle stock export column separately because it's a messy edge since
    # it doesn't have a unique index (_id).

    index, new_column = new_table.get_column(
        [PathNode(name='stock')],
        'ExportItem',
        None,
    )
    if new_column:
        new_column.selected = True
        new_column.label = old_column.display
    else:
        raise SkipConversion('StockExportColumn not found in new export')
Exemplo n.º 17
0
 def setUp(self):
     self.inferred_schema = CaseInferredSchema(
         domain=self.domain,
         case_type=self.case_type,
         group_schemas=[
             InferredExportGroupSchema(
                 path=MAIN_TABLE,
                 items=[
                     ExportItem(path=[
                         PathNode(name='data'),
                         PathNode(name='case_property')
                     ],
                                label='Inferred 1',
                                inferred=True),
                     ExportItem(path=[
                         PathNode(name='data'),
                         PathNode(name='case_property_2')
                     ],
                                label='Inferred 1',
                                inferred=True),
                 ],
                 inferred=True),
         ])
     self.inferred_schema.save()
Exemplo n.º 18
0
    def test_basic_ordering(self):
        schema = self._create_schema([
            ScalarItem(path=[PathNode(name='three')]),
            ScalarItem(path=[PathNode(name='one')]),
            ScalarItem(path=[PathNode(name='two')]),
            ScalarItem(path=[PathNode(name='four')]),
        ])

        ordered_schema = self._create_schema([
            ScalarItem(path=[PathNode(name='one')]),
            ScalarItem(path=[PathNode(name='two')]),
            ScalarItem(path=[PathNode(name='three')]),
            ScalarItem(path=[PathNode(name='four')]),
        ])

        schema = CaseExportDataSchema._reorder_schema_from_schema(
            schema,
            ordered_schema,
        )
        self._assert_item_order(
            schema,
            [],
            [
                ScalarItem(path=[PathNode(name='one')]),
                ScalarItem(path=[PathNode(name='two')]),
                ScalarItem(path=[PathNode(name='three')]),
                ScalarItem(path=[PathNode(name='four')]),
            ],
        )
Exemplo n.º 19
0
    def test_different_doc_types_ordering(self):
        schema = self._create_schema([
            GeopointItem(path=[PathNode(name='one')]),
            ScalarItem(path=[PathNode(name='two')]),
            ScalarItem(path=[PathNode(name='three')]),
            ScalarItem(path=[PathNode(name='one')]),
        ])

        ordered_schema = self._create_schema([
            ScalarItem(path=[PathNode(name='two')]),
            ScalarItem(path=[PathNode(name='one')]),
            ScalarItem(path=[PathNode(name='three')]),
            GeopointItem(path=[PathNode(name='one')]),
        ])

        schema = CaseExportDataSchema._reorder_schema_from_schema(
            schema,
            ordered_schema,
        )
        self._assert_item_order(
            schema,
            [],
            [
                ScalarItem(path=[PathNode(name='two')]),
                ScalarItem(path=[PathNode(name='one')]),
                ScalarItem(path=[PathNode(name='three')]),
                GeopointItem(path=[PathNode(name='one')]),
            ],
        )
Exemplo n.º 20
0
 def test_wrap_export_item(self, _):
     path = [PathNode(name="foo"), PathNode(name="bar")]
     item = ExportItem(path=path)
     wrapped = ExportItem.wrap(item.to_json())
     self.assertEqual(type(wrapped), type(item))
     self.assertEqual(wrapped.to_json(), item.to_json())
 def test_question_path_to_path_nodes(self):
     """
     Confirm that _question_path_to_path_nodes() works as expected
     """
     repeat_groups = [
         "/data/repeat1",
         "/data/group1/repeat2",
         "/data/group1/repeat2/repeat3",
     ]
     self.assertEqual(
         _question_path_to_path_nodes("/data/repeat1", repeat_groups),
         [PathNode(name='form', is_repeat=False), PathNode(name='repeat1', is_repeat=True)]
     )
     self.assertEqual(
         _question_path_to_path_nodes("/data/group1", repeat_groups),
         [PathNode(name='form', is_repeat=False), PathNode(name='group1', is_repeat=False)]
     )
     self.assertEqual(
         _question_path_to_path_nodes("/data/group1/repeat2", repeat_groups),
         [
             PathNode(name='form', is_repeat=False),
             PathNode(name='group1', is_repeat=False),
             PathNode(name='repeat2', is_repeat=True),
         ]
     )
     self.assertEqual(
         _question_path_to_path_nodes("/data/group1/repeat2/repeat3", repeat_groups),
         [
             PathNode(name='form', is_repeat=False),
             PathNode(name='group1', is_repeat=False),
             PathNode(name='repeat2', is_repeat=True),
             PathNode(name='repeat3', is_repeat=True),
         ]
     )
     self.assertEqual(
         _question_path_to_path_nodes("/data/group1/repeat2/repeat3/group2", repeat_groups),
         [
             PathNode(name='form', is_repeat=False),
             PathNode(name='group1', is_repeat=False),
             PathNode(name='repeat2', is_repeat=True),
             PathNode(name='repeat3', is_repeat=True),
             PathNode(name='group2', is_repeat=False),
         ]
     )
Exemplo n.º 22
0
 def test_wrap_export_item_child(self, _):
     path = [PathNode(name="foo"), PathNode(name="bar")]
     item = MultipleChoiceItem(path=path, options=[Option(value="foo")])
     wrapped = ExportItem.wrap(item.to_json())
     self.assertEqual(type(wrapped), type(item))
     self.assertEqual(wrapped.to_json(), item.to_json())