def fix_user_props_copy(app, module, form, form_ix, preloads, dry): updated = False xform = XForm(form.source) refs = {xform.resolve_path(ref): prop for ref, prop in preloads.items()} for node in xform.model_node.findall("{f}setvalue"): if (node.attrib.get('ref') in refs and node.attrib.get('event') == "xforms-ready"): ref = node.attrib.get('ref') value = (node.attrib.get('value') or "").replace(" ", "") prop = refs[ref] userprop = "#user/" + prop if value == get_bad_usercase_path(module, form, prop): logger.info("%s setvalue %s -> %s", form_ix, userprop, ref) node.attrib["value"] = USERPROP_PREFIX + prop updated = True elif value != USERPROP_PREFIX + prop: logger.warn("%s %s has unexpected value: %r (not %s)", form_ix, ref, value, userprop) if updated: if dry: logger.info( "updated setvalues in XML:\n%s", "\n".join(line for line in ET.tostring(xform.xml).split("\n") if "setvalue" in line)) else: save_xform(app, form, ET.tostring(xform.xml)) return updated
def fix_user_props_copy(app, module, form, form_ix, preloads, dry): updated = False xform = XForm(form.source) refs = {xform.resolve_path(ref): prop for ref, prop in six.iteritems(preloads)} for node in xform.model_node.findall("{f}setvalue"): if (node.attrib.get('ref') in refs and node.attrib.get('event') == "xforms-ready"): ref = node.attrib.get('ref') value = (node.attrib.get('value') or "").replace(" ", "") prop = refs[ref] userprop = "#user/" + prop if value == get_bad_usercase_path(module, form, prop): logger.info("%s setvalue %s -> %s", form_ix, userprop, ref) node.attrib["value"] = USERPROP_PREFIX + prop updated = True elif value != USERPROP_PREFIX + prop: logger.warn("%s %s has unexpected value: %r (not %s)", form_ix, ref, value, userprop) if updated: if dry: logger.info("updated setvalues in XML:\n%s", "\n".join(line for line in ET.tostring(xform.xml).split("\n") if "setvalue" in line)) else: save_xform(app, form, ET.tostring(xform.xml)) return updated
def fix_user_props_caseref(app, module, form, form_ix, dry): updated = False xform = XForm(form.source) refs = { xform.resolve_path(ref): vals for ref, vals in form.case_references.load.items() if any( v.startswith("#user/") for v in vals) } ref_warnings = [] for node in xform.model_node.findall("{f}setvalue"): if (node.attrib.get('ref') in refs and node.attrib.get('event') == "xforms-ready"): ref = node.attrib.get('ref') ref_values = refs[ref] if len(ref_values) != 1: ref_warnings.append((ref, " ".join(ref_values))) continue value = (node.attrib.get('value') or "").replace(" ", "") userprop = ref_values[0] assert userprop.startswith("#user/"), (ref, userprop) prop = userprop[len("#user/"):] if value == get_bad_usercase_path(module, form, prop): logger.info("%s setvalue %s -> %s", form_ix, userprop, ref) node.attrib["value"] = USERPROP_PREFIX + prop updated = True elif value != (USERPROP_PREFIX + prop).replace(" ", ""): ref_warnings.append((ref, "%r (%s)" % (value, userprop))) if updated: if dry: logger.info( "updated setvalues in XML:\n%s", "\n".join(line for line in ET.tostring( xform.xml, encoding='utf-8').split("\n") if "setvalue" in line)) else: save_xform(app, form, ET.tostring(xform.xml, encoding='utf-8')) if ref_warnings: for ref, ref_values in ref_warnings: logger.warning("%s %s has unexpected #user refs: %s", form_ix, ref, ref_values) return updated
def fix_user_props_caseref(app, module, form, form_ix, dry): updated = False xform = XForm(form.source) refs = {xform.resolve_path(ref): vals for ref, vals in six.iteritems(form.case_references.load) if any(v.startswith("#user/") for v in vals)} ref_warnings = [] for node in xform.model_node.findall("{f}setvalue"): if (node.attrib.get('ref') in refs and node.attrib.get('event') == "xforms-ready"): ref = node.attrib.get('ref') ref_values = refs[ref] if len(ref_values) != 1: ref_warnings.append((ref, " ".join(ref_values))) continue value = (node.attrib.get('value') or "").replace(" ", "") userprop = ref_values[0] assert userprop.startswith("#user/"), (ref, userprop) prop = userprop[len("#user/"):] if value == get_bad_usercase_path(module, form, prop): logger.info("%s setvalue %s -> %s", form_ix, userprop, ref) node.attrib["value"] = USERPROP_PREFIX + prop updated = True elif value != (USERPROP_PREFIX + prop).replace(" ", ""): ref_warnings.append((ref, "%r (%s)" % (value, userprop))) if updated: if dry: logger.info("updated setvalues in XML:\n%s", "\n".join(line for line in ET.tostring(xform.xml).split("\n") if "setvalue" in line)) else: save_xform(app, form, ET.tostring(xform.xml)) if ref_warnings: for ref, ref_values in ref_warnings: logger.warning("%s %s has unexpected #user refs: %s", form_ix, ref, ref_values) return updated
class CaseBlockIndexRelationshipTest(SimpleTestCase, TestXmlMixin): file_path = 'data', 'extension_case' def setUp(self): self.is_usercase_in_use_patch = patch('corehq.apps.app_manager.models.is_usercase_in_use') self.is_usercase_in_use_mock = self.is_usercase_in_use_patch.start() self.is_usercase_in_use_mock.return_value = True self.app = Application.new_app('domain', 'New App') self.module = self.app.add_module(AdvancedModule.new_module('Fish Module', None)) self.module.case_type = 'fish' self.form = self.module.new_form('New Form', None) self.case_index = CaseIndex( reference_id='host', relationship='extension', ) self.subcase = AdvancedOpenCaseAction( case_type='freshwater', case_name='Wanda', open_condition=FormActionCondition(type='always'), case_properties={'name': '/data/question1'}, case_indices=[self.case_index], ) self.form.actions.open_cases.append(self.subcase) self.xform = XForm(self.get_xml('original')) path = 'subcase_0/' self.subcase_block = CaseBlock(self.xform, path) def add_subcase_block(self): parent_node = self.xform.data_node action = next(self.form.actions.get_open_actions()) case_id = session_var(action.case_session_var) subcase_node = _make_elem('{x}subcase_0') parent_node.append(subcase_node) subcase_node.insert(0, self.subcase_block.elem) self.subcase_block.add_create_block( relevance=self.xform.action_relevance(action.open_condition), case_name=self.subcase.case_name, case_type=self.subcase.case_type, delay_case_id=bool(self.subcase.repeat_context), autoset_owner_id=autoset_owner_id_for_advanced_action(action), has_case_sharing=self.form.get_app().case_sharing, case_id=case_id ) self.subcase_block.add_update_block(self.subcase.case_properties) def test_xform_case_block_index_supports_relationship(self): """ CaseBlock index should allow the relationship to be set """ self.add_subcase_block() self.subcase_block.add_index_ref( 'host', self.form.get_case_type(), self.xform.resolve_path("case/@case_id"), self.subcase.case_indices[0].relationship, ) self.assertXmlEqual(self.get_xml('open_subcase'), str(self.xform)) def test_xform_case_block_index_default_relationship(self): """ CaseBlock index relationship should default to "child" """ child = CaseIndex( reference_id='host', relationship='child', ) self.subcase.case_indices = [child] self.add_subcase_block() self.subcase_block.add_index_ref( 'host', self.form.get_case_type(), self.xform.resolve_path("case/@case_id"), ) self.assertXmlEqual(self.get_xml('open_subcase_child'), str(self.xform)) def test_xform_case_block_index_valid_relationship(self): """ CaseBlock index relationship should only allow valid values """ with self.assertRaisesRegexp(CaseError, 'Valid values for an index relationship are "child" and "extension"'): self.subcase_block.add_index_ref( 'host', self.form.get_case_type(), self.xform.resolve_path("case/@case_id"), 'cousin', )
class CaseBlockIndexRelationshipTest(SimpleTestCase, TestXmlMixin): file_path = 'data', 'extension_case' def setUp(self): self.is_usercase_in_use_patch = patch('corehq.apps.app_manager.models.is_usercase_in_use') self.is_usercase_in_use_mock = self.is_usercase_in_use_patch.start() self.is_usercase_in_use_mock.return_value = True self.app = Application.new_app('domain', 'New App') self.module = self.app.add_module(AdvancedModule.new_module('Fish Module', None)) self.module.case_type = 'fish' self.form = self.module.new_form('New Form', None) self.case_index = CaseIndex( reference_id='host', relationship='extension', ) self.subcase = AdvancedOpenCaseAction( case_type='freshwater', case_name='Wanda', open_condition=FormActionCondition(type='always'), case_properties={'name': '/data/question1'}, case_indices=[self.case_index], ) self.form.actions.open_cases.append(self.subcase) self.xform = XForm(self.get_xml('original')) path = 'subcase_0/' self.subcase_block = CaseBlock(self.xform, path) def add_subcase_block(self): parent_node = self.xform.data_node action = next(self.form.actions.get_open_actions()) case_id = session_var(action.case_session_var) subcase_node = _make_elem('{x}subcase_0') parent_node.append(subcase_node) subcase_node.insert(0, self.subcase_block.elem) self.subcase_block.add_create_block( relevance=self.xform.action_relevance(action.open_condition), case_name=self.subcase.case_name, case_type=self.subcase.case_type, delay_case_id=bool(self.subcase.repeat_context), autoset_owner_id=autoset_owner_id_for_advanced_action(action), has_case_sharing=self.form.get_app().case_sharing, case_id=case_id ) self.subcase_block.add_update_block(self.subcase.case_properties) def test_xform_case_block_index_supports_relationship(self): """ CaseBlock index should allow the relationship to be set """ self.add_subcase_block() self.subcase_block.add_index_ref( 'host', self.form.get_case_type(), self.xform.resolve_path("case/@case_id"), self.subcase.case_indices[0].relationship, ) self.assertXmlEqual(self.get_xml('open_subcase'), str(self.xform)) def test_xform_case_block_index_default_relationship(self): """ CaseBlock index relationship should default to "child" """ child = CaseIndex( reference_id='host', relationship='child', ) self.subcase.case_indices = [child] self.add_subcase_block() self.subcase_block.add_index_ref( 'host', self.form.get_case_type(), self.xform.resolve_path("case/@case_id"), ) self.assertXmlEqual(self.get_xml('open_subcase_child'), str(self.xform)) def test_xform_case_block_index_valid_relationship(self): """ CaseBlock index relationship should only allow valid values """ with self.assertRaisesRegexp(CaseError, 'Valid values for an index relationship are "child" and "extension"'): self.subcase_block.add_index_ref( 'host', self.form.get_case_type(), self.xform.resolve_path("case/@case_id"), 'cousin', )