Ejemplo n.º 1
0
def _ucla_form_modifier(form, question_ids):

    message = ""

    xform = form.wrapped_xform()

    # Get the questions specified in question_ids
    question_dict = {
        q["value"].split("/")[-1]: FormQuestion.wrap(q)
        for q in form.get_questions(["en"])
    }
    question_ids = {q
                    for q in question_ids
                    }.intersection(list(question_dict.keys()))
    questions = [question_dict[k] for k in question_ids]

    # Get the existing subcases
    existing_subcases = {c.case_name: c for c in form.actions.subcases}

    message += "Found %s questions.\n" % len(questions)

    for question in questions:
        for option in question.options:

            hidden_value_tag = question.value.split(
                "/")[-1] + "-" + option.value
            hidden_value_path = "/data/" + hidden_value_tag
            hidden_value_text = option.label

            # Create new hidden values for each question option if they don't already exist:

            if hidden_value_tag not in question_dict:

                # Add data element
                tag = "{x}%s" % hidden_value_tag
                element = etree.Element(tag.format(**namespaces))
                xform.data_node.append(element)

                # Add bind
                xform.itext_node.addprevious(
                    _make_elem(
                        "bind", {
                            "nodeset": xform.resolve_path(hidden_value_path),
                            "calculate": '"' + hidden_value_text + '"'
                        }))

                message += "Node " + hidden_value_path + " created!\n"
            else:
                message += "Node " + hidden_value_path + " already exists, skipping.\n"

            # Create FormActions for opening subcases

            if hidden_value_path not in existing_subcases:
                action = OpenSubCaseAction(
                    condition=FormActionCondition(
                        type='if',
                        question=question.value,
                        operator='selected',
                        answer=option.value,
                    ),
                    case_name=hidden_value_path,
                    case_type='task',
                    # Note, the case properties will not necessarily be created in the order given.
                    case_properties={
                        'task_responsible': '/data/task_responsible',
                        'task_due': '/data/task_due',
                        'owner_id': '/data/owner_id',
                        'task_risk_factor': '/data/task_risk_factor',
                        'study_id': '/data/study_id',
                        'patient_name': '/data/patient_name'
                    },
                    close_condition=FormActionCondition(answer=None,
                                                        operator=None,
                                                        question=None,
                                                        type='never'))
                form.actions.subcases.append(action)
                message += "OpenSubCaseAction " + hidden_value_path + " created!\n"
            else:
                message += "OpenSubCaseAction " + hidden_value_path + " already exists, skipping.\n"

    app = form.get_app()
    # Save the xform modifications
    save_xform(app, form, etree.tostring(xform.xml, encoding="unicode"))
    # save the action modifications
    app.save()
    message += "Form saved.\n"
    return message
Ejemplo n.º 2
0
    def test_repeat_subcases_schema_generation(self):
        form_xml = self.get_xml('nested_repeat_form')
        repeats_with_subcases = [
            OpenSubCaseAction(
                repeat_context='/data/repeat',
                case_properties={
                    'weight': '/data/repeat/group/weight',
                },
                subcase_index=0,
                nest=False,
            ).with_id(0, None),
            OpenSubCaseAction(
                repeat_context='/data/repeat/nested_repeat',
                case_properties={
                    'age': '/data/repeat/nested_repeat/age',
                },
                subcase_index=1,
                nest=False,  # would normally get added by caller
            ).with_id(1, None),
        ]

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

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

        group_schema = schema.group_schemas[0]
        attribute_items = [
            item for item in group_schema.items
            if item.path[-1].name in CASE_ATTRIBUTES
        ]

        self.assertEqual(len(attribute_items), len(CASE_ATTRIBUTES))
        self.assertTrue(
            all(
                map(
                    lambda item: item.readable_path.startswith(
                        'form.repeat.case'),
                    attribute_items,
                )))

        create_items = [
            item for item in group_schema.items
            if item.path[-1].name in CASE_CREATE_ELEMENTS
        ]
        self.assertEqual(len(create_items), len(CASE_CREATE_ELEMENTS))
        self.assertTrue(
            all(
                map(
                    lambda item: item.readable_path.startswith(
                        'form.repeat.case.create'),
                    create_items,
                )))

        index_items = [
            item for item in group_schema.items
            if 'case.index.parent' in item.readable_path
        ]
        self.assertEqual(len(index_items), 2)

        update_items = list(
            set(group_schema.items) - set(create_items) -
            set(attribute_items) - set(index_items))
        self.assertEqual(len(update_items), 1)
        self.assertEqual(update_items[0].readable_path,
                         'form.repeat.case.update.group.weight')
Ejemplo n.º 3
0
 def test_open_subcase_action_default_relationship(self):
     """
     OpenSubCaseAction relationship should default to "child"
     """
     action = OpenSubCaseAction(case_type='mother', case_name='Eva')
     self.assertEqual(action.relationship, 'child')
Ejemplo n.º 4
0
    def get_test_app(self):
        app = Application.new_app('domain', 'New App')
        app._id = uuid.uuid4().hex
        app.version = 1
        m0 = self._make_module(app, 0, 'parent')
        m0.get_form(0).actions.subcases.extend([
            OpenSubCaseAction(case_type='child', reference_id='parent'),
            OpenSubCaseAction(case_type='other_child', reference_id='parent')
        ])
        m1 = self._make_module(app, 1, 'child')
        m1.get_form(0).actions.subcases.append(
            OpenSubCaseAction(case_type='grand child', reference_id='parent'))
        m2 = self._make_module(app, 2, 'grand child')

        m3 = app.add_module(AdvancedModule.new_module('Module3', lang='en'))
        m3.case_type = 'other grand child'
        m3f0 = m3.new_form('other form', 'en')
        m3f0.actions.load_update_cases.append(
            LoadUpdateAction(case_type='child', case_tag='child'))
        m3f0.actions.open_cases.append(
            AdvancedOpenCaseAction(
                name_path='/data/question1',
                case_type='other grand child',
                case_indices=[CaseIndex(tag='child', reference_id='father')]))
        m3f0.actions.open_cases[0].open_condition.type = 'always'

        m4 = app.add_module(AdvancedModule.new_module('Module4', lang='en'))
        m4.case_type = 'extension'
        self._make_module(app, 5, 'other_child')

        m4f0 = m4.new_form('other form', 'en')
        m4f0.actions.load_update_cases.extend([
            LoadUpdateAction(case_type='child', case_tag='child'),
            LoadUpdateAction(case_type='other_child', case_tag='other_child'),
        ])
        m4f0.actions.open_cases.extend([
            AdvancedOpenCaseAction(name_path='/data/question1',
                                   case_type='extension',
                                   case_indices=[
                                       CaseIndex(tag='child',
                                                 relationship='extension',
                                                 reference_id='host')
                                   ]),
            AdvancedOpenCaseAction(  # 'extension' case has 2 parents
                name_path='/data/question1',
                case_type='extension',
                case_indices=[
                    CaseIndex(tag='other_child',
                              relationship='extension',
                              reference_id='host')
                ])
        ])
        m4f0.actions.open_cases[0].open_condition.type = 'always'
        m4f0.actions.open_cases[1].open_condition.type = 'always'

        m2.parent_select = ParentSelect(active=True, module_id=m1.unique_id)
        m1.parent_select = ParentSelect(active=True, module_id=m0.unique_id)

        expected_hierarchy = {
            'parent': {
                'child': {
                    'grand child': {},
                    'other grand child': {},
                    'extension': {},
                },
                'other_child': {
                    'extension': {},
                },
            },
        }
        return app, expected_hierarchy
Ejemplo n.º 5
0
 def test_open_subcase_action_supports_relationship(self):
     """
     OpenSubCaseAction should allow relationship to be set
     """
     action = OpenSubCaseAction(case_type='mother', case_name='Eva', relationship='extension')
     self.assertEqual(action.relationship, 'extension')