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
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')
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')
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
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')