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',
         })
Exemple #2
0
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 {}
Exemple #3
0
    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
Exemple #4
0
 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
Exemple #5
0
    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."
                )
Exemple #6
0
    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'})
Exemple #10
0
 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',
     })
Exemple #11
0
 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',
     })
Exemple #12
0
    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
Exemple #13
0
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
Exemple #15
0
 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)
Exemple #17
0
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
Exemple #18
0
 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',
     })
Exemple #19
0
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
Exemple #20
0
    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)
Exemple #21
0
    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
        )
Exemple #22
0
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
Exemple #23
0
 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'})
Exemple #24
0
 def test_unicode_question(self):
     value = get_form_question_values({'form': {'foo': {'b\u0105r': 'baz'}}})
     self.assertEqual(value, {'/data/foo/b\u0105r': 'baz'})
Exemple #25
0
 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'})
Exemple #26
0
    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]}
        )