def test_metadata(self): value = get_form_question_values({ 'form': { '@xmlns': 'http://openrosa.org/formdesigner/04279622', 'foo': { 'bar': 'baz' }, 'meta': { 'timeStart': '2018-11-06T18:00:00.000000Z', 'timeEnd': '2018-11-06T18:15:00.000000Z', 'spam': 'ham', }, }, 'received_on': '2018-11-06T18:30:00.000000Z', }) self.assertDictEqual( value, { '/data/foo/bar': 'baz', '/metadata/xmlns': 'http://openrosa.org/formdesigner/04279622', '/metadata/timeStart': '2018-11-06T18:00:00.000000Z', '/metadata/timeEnd': '2018-11-06T18:15:00.000000Z', '/metadata/spam': 'ham', '/metadata/received_on': '2018-11-06T18:30:00.000000Z', })
def get_event(domain, config, form_json=None, info=None): if info is None: info = CaseTriggerInfo( domain=domain, case_id=None, form_question_values=get_form_question_values(form_json), ) event = {} event_property_functions = [ _get_program, _get_program_stage, _get_org_unit, _get_event_date, _get_event_status, _get_completed_date, _get_datavalues, _get_coordinate, ] for func in event_property_functions: event.update(func(config, info)) if event['eventDate'] or event['dataValues']: # eventDate is a required field, but we return the event if it # has no date if it does have values, so that it will fail # validation and the administrator will be notified that the # value source for eventDate is broken. return event else: # The event has no date and no values. That is not an event. return {}
def send_request(self, repeat_record, payload): # Notify admins if API version is not supported self.get_api_version() value_source_configs = [] for case_config in self.dhis2_entity_config.case_configs: value_source_configs.append(case_config.org_unit_id) value_source_configs.append(case_config.tei_id) for value_source_config in case_config.attributes.values(): value_source_configs.append(value_source_config) case_trigger_infos = get_relevant_case_updates_from_form_json( self.domain, payload, case_types=self.white_listed_case_types, extra_fields=[ c['case_property'] for c in value_source_configs if 'case_property' in c ], form_question_values=get_form_question_values(payload), ) requests = self.connection_settings.get_requests( repeat_record.payload_id) try: return send_dhis2_entities(requests, self, case_trigger_infos) except Exception: exc_type, exc_value, exc_traceback = sys.exc_info() tb_lines = traceback.format_exception(exc_type, exc_value, exc_traceback) requests.notify_error( f"Error sending Entities to {self}: {exc_value!r}", details="".join(tb_lines)) raise
def send_request(self, repeat_record, payload): value_source_configs: Iterable[JsonDict] = chain( self.openmrs_config.case_config.patient_identifiers.values(), self.openmrs_config.case_config.person_properties.values(), self.openmrs_config.case_config.person_preferred_name.values(), self.openmrs_config.case_config.person_preferred_address.values(), self.openmrs_config.case_config.person_attributes.values(), ) case_trigger_infos = get_relevant_case_updates_from_form_json( self.domain, payload, case_types=self.white_listed_case_types, extra_fields=[ conf["case_property"] for conf in value_source_configs if "case_property" in conf ], form_question_values=get_form_question_values(payload), ) requests = self.get_requests(payload_id=repeat_record.payload_id) try: response = send_openmrs_data( requests, self.domain, payload, self.openmrs_config, case_trigger_infos, ) except Exception as err: requests.notify_exception(str(err)) return OpenmrsResponse(400, 'Bad Request', pformat_json(str(err))) return response
def get_infos_resource_types( self, form_json: dict, fhir_version: str, ) -> Tuple[List[CaseTriggerInfo], Dict[str, FHIRResourceType]]: form_question_values = get_form_question_values(form_json) case_blocks = extract_case_blocks(form_json) cases_by_id = _get_cases_by_id(self.domain, case_blocks) resource_types_by_case_type = _get_resource_types_by_case_type( self.domain, fhir_version, cases_by_id.values(), ) case_trigger_info_list = [] for case_block in case_blocks: try: case = cases_by_id[case_block['@case_id']] except KeyError: form_id = form_json[TAG_FORM][TAG_META]['instanceID'] raise CaseNotFound( f"Form {form_id!r} touches case {case_block['@case_id']!r} " "but that case is not found." )
def test_form_processing_with_owner(self): info = CaseTriggerInfo( domain=DOMAIN, case_id=None, owner_id='test_location', form_question_values=get_form_question_values(self.form), ) event = get_event(DOMAIN, self.repeater.dhis2_config.form_configs[0], form_json=self.form, info=info) self.assertDictEqual( { 'dataValues': [{ 'dataElement': 'dhis2_element_id', 'value': 'test event' }], 'status': 'COMPLETED', 'completedDate': '2017-05-25', 'program': 'test program', 'eventDate': '2017-05-26', 'orgUnit': 'dhis2_location_id', 'coordinate': { 'latitude': -33.6543, 'longitude': 19.1234 } }, event)
def test_utf8_answer(self): value = get_form_question_values( {'form': { 'foo': { 'bar': b'b\xc4\x85z' } }}) self.assertEqual(value, {'/data/foo/bar': b'b\xc4\x85z'})
def test_unicode_question(self): value = get_form_question_values( {'form': { 'foo': { 'b\u0105r': 'baz' } }}) self.assertEqual(value, {'/data/foo/b\u0105r': 'baz'})
def test_utf8_question(self): with warnings.catch_warnings(): warnings.simplefilter("ignore", UnicodeWarning) value = get_form_question_values( {'form': { 'foo': { b'b\xc4\x85r': 'baz' } }}) self.assertEqual(value, {'/data/foo/b\u0105r': 'baz'})
def test_received_on(self): value = get_form_question_values({ 'form': { 'foo': {'bar': 'baz'}, }, 'received_on': '2018-11-06T18:30:00.000000Z', }) self.assertDictEqual(value, { '/data/foo/bar': 'baz', '/metadata/received_on': '2018-11-06T18:30:00.000000Z', })
def test_received_on(self): value = get_form_question_values({ 'form': { 'foo': {'bar': 'baz'}, }, 'received_on': '2018-11-06T18:30:00.000000Z', }) self.assertDictEqual(value, { '/data/foo/bar': 'baz', '/metadata/received_on': '2018-11-06T18:30:00.000000Z', })
def get_payload_info( cls, payload_generator: BasePayloadGenerator, ) -> Tuple[dict, CaseTriggerInfo]: payload = payload_generator.get_payload(None, cls.form) if isinstance(payload, str): payload = json.loads(payload) [info] = get_relevant_case_updates_from_form_json( cls.domain, payload, case_types=None, extra_fields=list(cls.case_update.keys()), form_question_values=get_form_question_values(payload), ) return payload, info
def _to_dhis_format(config, payload): info = CaseTriggerInfo(None, None, None, None, None, form_question_values=get_form_question_values(payload)) dhis_format = {} to_dhis_format_functions = [ _get_program, _get_org_unit, _get_event_date, _get_event_status, _get_datavalues, ] for func in to_dhis_format_functions: dhis_format.update(func(config, info, payload)) return dhis_format
def get_payload_info( self, payload_generator: BasePayloadGenerator, ) -> Tuple[dict, CaseTriggerInfo]: payload = payload_generator.get_payload(None, self.form) if isinstance(payload, str): payload = json.loads(payload) [info] = get_relevant_case_updates_from_form_json( self.domain, payload, case_types=None, extra_fields=['year', 'breakfast', 'decimal'], form_question_values=get_form_question_values(payload), ) return payload, info
def test_metadata(self): value = get_form_question_values({ 'form': { 'foo': {'bar': 'baz'}, 'meta': { 'timeStart': '2018-11-06T18:00:00.000000Z', 'timeEnd': '2018-11-06T18:15:00.000000Z', 'spam': 'ham', }, }, 'received_on': '2018-11-06T18:30:00.000000Z', }) self.assertDictEqual(value, { '/data/foo/bar': 'baz', '/metadata/timeStart': '2018-11-06T18:00:00.000000Z', '/metadata/timeEnd': '2018-11-06T18:15:00.000000Z', '/metadata/received_on': '2018-11-06T18:30:00.000000Z', })
def send_request(self, repeat_record, payload): case_trigger_infos = get_relevant_case_updates_from_form_json( self.domain, payload, case_types=self.white_listed_case_types, extra_fields=[ identifier.case_property for identifier in self.openmrs_config.case_config.patient_identifiers.values() ]) form_question_values = get_form_question_values(payload) return send_openmrs_data( Requests(self.domain, self.url, self.username, self.plaintext_password, verify=self.verify), self.domain, payload, self.openmrs_config, case_trigger_infos, form_question_values)
def get_event(domain, config, form_json): info = CaseTriggerInfo( domain=domain, case_id=None, form_question_values=get_form_question_values(form_json), ) event = {} event_property_functions = [ _get_program, _get_org_unit, _get_event_date, _get_event_status, _get_completed_date, _get_datavalues, ] for func in event_property_functions: event.update(func(config, info)) return event
def test_metadata(self): value = get_form_question_values({ 'form': { 'foo': {'bar': 'baz'}, 'meta': { 'timeStart': '2018-11-06T18:00:00.000000Z', 'timeEnd': '2018-11-06T18:15:00.000000Z', 'spam': 'ham', }, }, 'received_on': '2018-11-06T18:30:00.000000Z', }) self.assertDictEqual(value, { '/data/foo/bar': 'baz', '/metadata/timeStart': '2018-11-06T18:00:00.000000Z', '/metadata/timeEnd': '2018-11-06T18:15:00.000000Z', '/metadata/received_on': '2018-11-06T18:30:00.000000Z', })
def get_event(config, payload): info = CaseTriggerInfo( None, None, None, None, None, form_question_values=get_form_question_values(payload)) event = {} event_property_functions = [ _get_program, _get_org_unit, _get_event_date, _get_event_status, _get_datavalues, ] for func in event_property_functions: event.update(func(config, info, payload)) return event
def send_request(self, repeat_record, payload): value_sources = chain( self.openmrs_config.case_config.patient_identifiers.values(), self.openmrs_config.case_config.person_properties.values(), self.openmrs_config.case_config.person_preferred_name.values(), self.openmrs_config.case_config.person_preferred_address.values(), self.openmrs_config.case_config.person_attributes.values(), ) case_trigger_infos = get_relevant_case_updates_from_form_json( self.domain, payload, case_types=self.white_listed_case_types, extra_fields=[ vs.case_property for vs in value_sources if hasattr(vs, 'case_property') ]) form_question_values = get_form_question_values(payload) return send_openmrs_data(self.requests, self.domain, payload, self.openmrs_config, case_trigger_infos, form_question_values)
def send_request(self, repeat_record, payload): value_sources = chain( six.itervalues(self.openmrs_config.case_config.patient_identifiers), six.itervalues(self.openmrs_config.case_config.person_properties), six.itervalues(self.openmrs_config.case_config.person_preferred_name), six.itervalues(self.openmrs_config.case_config.person_preferred_address), six.itervalues(self.openmrs_config.case_config.person_attributes), ) case_trigger_infos = get_relevant_case_updates_from_form_json( self.domain, payload, case_types=self.white_listed_case_types, extra_fields=[vs.case_property for vs in value_sources if hasattr(vs, 'case_property')] ) form_question_values = get_form_question_values(payload) return send_openmrs_data( self.requests, self.domain, payload, self.openmrs_config, case_trigger_infos, form_question_values )
def _to_dhis_format(config, payload): info = CaseTriggerInfo( None, None, None, None, None, form_question_values=get_form_question_values(payload)) dhis_format = {} to_dhis_format_functions = [ _get_program, _get_org_unit, _get_event_date, _get_event_status, _get_datavalues, ] for func in to_dhis_format_functions: dhis_format.update(func(config, info, payload)) return dhis_format
def test_utf8_answer(self): value = get_form_question_values({'form': {'foo': {'bar': b'b\xc4\x85z'}}}) self.assertEqual(value, {'/data/foo/bar': b'b\xc4\x85z'})
def test_unicode_question(self): value = get_form_question_values({'form': {'foo': {'b\u0105r': 'baz'}}}) self.assertEqual(value, {'/data/foo/b\u0105r': 'baz'})
def test_utf8_question(self): with warnings.catch_warnings(): warnings.simplefilter("ignore", UnicodeWarning) value = get_form_question_values({'form': {'foo': {b'b\xc4\x85r': 'baz'}}}) self.assertEqual(value, {'/data/foo/b\u0105r': 'baz'})
def test_get_programs_by_id(self): program_id = 'test program' form = { "domain": DOMAIN, "form": { "@xmlns": "test_xmlns", "event_date": "2017-05-25T21:06:27.012000", "completed_date": "2017-05-25T21:06:27.012000", "event_location": "-33.6543213 19.12344312 abcdefg", "name": "test event", "meta": { "location": 'test location', "timeEnd": "2017-05-25T21:06:27.012000", "timeStart": "2017-05-25T21:06:17.739000", "userID": self.user.user_id, "username": self.user.username } }, "received_on": "2017-05-26T09:17:23.692083Z", } config = { 'form_configs': json.dumps([{ 'xmlns': 'test_xmlns', 'program_id': program_id, 'event_status': 'COMPLETED', 'event_location': { 'form_question': '/data/event_location' }, 'completed_date': { 'doc_type': 'FormQuestion', 'form_question': '/data/completed_date', 'external_data_type': DHIS2_DATA_TYPE_DATE }, 'org_unit_id': { 'doc_type': 'FormUserAncestorLocationField', 'form_user_ancestor_location_field': LOCATION_DHIS_ID }, 'datavalue_maps': [ { 'data_element_id': 'dhis2_element_id', 'value': { 'doc_type': 'FormQuestion', 'form_question': '/data/name' } } ] }]) } config_form = Dhis2ConfigForm(data=config) self.assertTrue(config_form.is_valid()) data = config_form.cleaned_data repeater = Dhis2Repeater(domain=DOMAIN) conn = ConnectionSettings(domain=DOMAIN, url="http://dummy.com") conn.save() repeater.dhis2_config.form_configs = [Dhis2FormConfig.wrap(fc) for fc in data['form_configs']] repeater.connection_settings_id = conn.id repeater.save() info = CaseTriggerInfo( domain=DOMAIN, case_id=None, owner_id='test_location', form_question_values=get_form_question_values(form), ) programs = get_programs_by_id(info, repeater.dhis2_config) self.assertDictEqual( programs[program_id]['geometry'], {'type': 'Point', 'coordinates': [-33.6543, 19.1234]} )