def allowed_to_forward(self, payload): """ Forward the payload if ... * it did not come from OpenMRS, and * CaseRepeater says it's OK for the case types and users of any of the payload's cases, and * this repeater forwards to the right OpenMRS server for any of the payload's cases. :param payload: An XFormInstance (not a case) """ if payload.xmlns == XMLNS_OPENMRS: # payload came from OpenMRS. Don't send it back. return False case_blocks = extract_case_blocks(payload) case_ids = [case_block['@case_id'] for case_block in case_blocks] cases = CaseAccessors(payload.domain).get_cases(case_ids, ordered=True) if not any(CaseRepeater.allowed_to_forward(self, case) for case in cases): # If none of the case updates in the payload are allowed to # be forwarded, drop it. return False repeaters = [repeater for case in cases for repeater in get_case_location_ancestor_repeaters(case)] if repeaters and self not in repeaters: # This repeater points to the wrong OpenMRS server for this # payload. Let the right repeater handle it. return False return True
def test_get_case_location_ancestor_repeaters_multi(self): """ get_case_location_ancestor_repeaters should return the repeater at the closest ancestor location """ form, (gardens_case, ) = _create_case( domain=self.domain, case_id=uuid.uuid4().hex, owner_id=self.locations['Gardens'].location_id) cape_town_repeater = OpenmrsRepeater.wrap({ 'doc_type': 'OpenmrsRepeater', 'domain': self.domain, 'location_id': self.locations['Cape Town'].location_id, }) cape_town_repeater.save() western_cape_repeater = OpenmrsRepeater.wrap({ 'doc_type': 'OpenmrsRepeater', 'domain': self.domain, 'location_id': self.locations['Western Cape'].location_id, }) western_cape_repeater.save() repeaters = get_case_location_ancestor_repeaters(gardens_case) self.assertEqual(repeaters, [cape_town_repeater])
def test_get_case_location_ancestor_repeaters_none(self): """ get_case_location_ancestor_repeaters should not return repeaters if there are none at ancestor locations """ gardens = self.locations['Gardens'] form, (case, ) = _create_case(domain=self.domain, case_id=uuid.uuid4().hex, owner_id=gardens.location_id) repeaters = get_case_location_ancestor_repeaters(case) self.assertEqual(repeaters, [])
def test_get_case_location_ancestor_repeaters_same(self): """ get_case_location_ancestor_repeaters should return the repeater at the same location as the case """ gardens = self.locations['Gardens'] form, (case, ) = _create_case(domain=self.domain, case_id=uuid.uuid4().hex, owner_id=gardens.location_id) gardens_repeater = OpenmrsRepeater.wrap({ 'doc_type': 'OpenmrsRepeater', 'domain': self.domain, 'location_id': gardens.location_id, }) gardens_repeater.save() repeaters = get_case_location_ancestor_repeaters(case) self.assertEqual(repeaters, [gardens_repeater])
def test_get_case_location_ancestor_repeaters_multi(self): """ get_case_location_ancestor_repeaters should return the repeater at the closest ancestor location """ form, (gardens_case, ) = _create_case( domain=self.domain, case_id=uuid.uuid4().hex, owner_id=self.locations['Gardens'].location_id ) cape_town_repeater = OpenmrsRepeater.wrap({ 'doc_type': 'OpenmrsRepeater', 'domain': self.domain, 'location_id': self.locations['Cape Town'].location_id, }) cape_town_repeater.save() western_cape_repeater = OpenmrsRepeater.wrap({ 'doc_type': 'OpenmrsRepeater', 'domain': self.domain, 'location_id': self.locations['Western Cape'].location_id, }) western_cape_repeater.save() repeaters = get_case_location_ancestor_repeaters(gardens_case) self.assertEqual(repeaters, [cape_town_repeater])