Ejemplo n.º 1
0
 def _get_cases(self, episode_or_person):
     if episode_or_person.type == CASE_TYPE_PERSON:
         person_case = episode_or_person
         episode_case = get_open_episode_case_from_person(person_case.domain, person_case.case_id)
         occurrence_case = get_occurrence_case_from_episode(episode_case.domain, episode_case.case_id)
     elif episode_or_person.type == CASE_TYPE_EPISODE:
         episode_case = episode_or_person
         occurrence_case = get_occurrence_case_from_episode(episode_case.domain, episode_case.case_id)
         person_case = get_person_case_from_occurrence(episode_case.domain, occurrence_case.case_id)
     else:
         raise ENikshayCaseNotFound("wrong case passed to repeater")
     return person_case, occurrence_case, episode_case
Ejemplo n.º 2
0
 def get_payload(self, repeat_record, episode_case):
     occurence_case = get_occurrence_case_from_episode(
         episode_case.domain, episode_case.case_id)
     person_case = get_person_case_from_occurrence(episode_case.domain,
                                                   occurence_case)
     return json.dumps(
         PatientPayload.create(person_case, episode_case).to_json())
Ejemplo n.º 3
0
    def get_payload(self, repeat_record, episode_case):
        """
        https://docs.google.com/document/d/1yUWf3ynHRODyVVmMrhv5fDhaK_ufZSY7y0h9ke5rBxU/edit#heading=h.a9uhx3ql595c
        """
        person_case = get_person_case_from_episode(episode_case.domain, episode_case.get_id)
        episode_case_properties = episode_case.dynamic_case_properties()
        person_case_properties = person_case.dynamic_case_properties()
        occurence_case = None
        use_2b_app_structure = self.use_2b_app_structure(person_case)
        if use_2b_app_structure:
            occurence_case = get_occurrence_case_from_episode(episode_case.domain, episode_case.get_id)
        properties_dict = self._base_properties(repeat_record)
        properties_dict.update({
            "dotcenter": "NA",
            "Local_ID": person_case.get_id,
        })

        try:
            properties_dict.update(_get_person_case_properties(
                episode_case, person_case, person_case_properties))
        except NikshayLocationNotFound as e:
            _save_error_message(person_case.domain, person_case.case_id, e)
        properties_dict.update(_get_episode_case_properties(
            episode_case_properties, occurence_case, person_case, use_2b_app_structure))
        return json.dumps(properties_dict)
Ejemplo n.º 4
0
    def _occurrence_case(self):
        try:
            return get_occurrence_case_from_episode(self.domain,
                                                    self._episode_case)

        except ENikshayCaseNotFound as e:
            raise NinetyNineDotsException(e)
Ejemplo n.º 5
0
 def get_payload(self, repeat_record, payload_doc):
     occurence_case = get_occurrence_case_from_episode(payload_doc.domain, payload_doc.case_id)
     person_case = get_person_case_from_occurrence(payload_doc.domain, occurence_case)
     person_case_properties = person_case.dynamic_case_properties()
     data = PatientPayload(
         beneficiary_id=person_case.case_id,
         phone_numbers=_get_phone_numbers(person_case_properties),
         merm_id=person_case_properties.get('merm_id', None),
     )
     return json.dumps(data.to_json())
Ejemplo n.º 6
0
 def get_payload(self, repeat_record, payload_doc):
     occurence_case = get_occurrence_case_from_episode(
         payload_doc.domain, payload_doc.case_id)
     person_case = get_person_case_from_occurrence(payload_doc.domain,
                                                   occurence_case)
     person_case_properties = person_case.dynamic_case_properties()
     data = PatientPayload(
         beneficiary_id=person_case.case_id,
         phone_numbers=_get_phone_numbers(person_case_properties),
         merm_id=person_case_properties.get('merm_id', None),
     )
     return json.dumps(data.to_json())
Ejemplo n.º 7
0
 def get_payload(self, repeat_record, episode_case):
     domain = episode_case.domain
     person_case = get_person_case_from_occurrence(
         domain,
         get_occurrence_case_from_episode(domain,
                                          episode_case.case_id).case_id)
     episode_case_properties = episode_case.dynamic_case_properties()
     payload = {
         'beneficiary_id': person_case.case_id,
         'end_date': episode_case_properties.get(TREATMENT_OUTCOME_DATE),
         'treatment_outcome':
         episode_case_properties.get(TREATMENT_OUTCOME),
     }
     return json.dumps(payload)
Ejemplo n.º 8
0
 def get_payload(self, repeat_record, adherence_case):
     domain = adherence_case.domain
     person_case = get_person_case_from_occurrence(
         domain, get_occurrence_case_from_episode(
             domain, get_episode_case_from_adherence(domain, adherence_case.case_id).case_id
         ).case_id
     )
     adherence_case_properties = adherence_case.dynamic_case_properties()
     date = parse_date(adherence_case.dynamic_case_properties().get('adherence_date'))
     payload = {
         'beneficiary_id': person_case.case_id,
         'adherence_date': date.isoformat(),
         'adherence_source': adherence_case_properties.get('adherence_source'),
         'adherence_value': adherence_case_properties.get('adherence_value'),
     }
     return json.dumps(payload)
Ejemplo n.º 9
0
    def suspect_case(self):
        try:
            occurrence = get_occurrence_case_from_episode(self.domain, self.episode.case_id)
        except ENikshayCaseNotFound:
            return False

        cases = CaseAccessors(self.domain).get_reverse_indexed_cases([occurrence.case_id])
        suspect_cases = [case for case in cases if
                         case.type == 'episode'
                         and case.get_case_property('episode_type') == 'presumptive_tb']

        if len(suspect_cases) == 1:
            return suspect_cases[0]
        else:
            # if there is more than one suspect case, also return None, since
            # that is an indeterminate case
            return None
    def get_relevant_test_case(domain, episode_case, error_logger):
        try:
            occurrence_case = get_occurrence_case_from_episode(domain, episode_case.case_id)
        except ENikshayCaseNotFound:
            error_logger.writerow([episode_case.case_id])
            return None

        indexed_cases = CaseAccessors(domain).get_reverse_indexed_cases([occurrence_case.case_id])
        test_cases = [
            case for case in indexed_cases
            if case.type == 'test'
            and case.get_case_property('rft_general') == 'diagnosis_dstb'
            and case.get_case_property('result') == 'tb_detected'
        ]
        if test_cases:
            return sorted(test_cases, key=lambda c: c.get_case_property('date_reported'))[-1]
        else:
            return None
Ejemplo n.º 11
0
    def get_payload(self, repeat_record, episode_case):
        domain = episode_case.domain
        person_case = get_person_case_from_occurrence(
            domain, get_occurrence_case_from_episode(
                domain, episode_case.case_id
            ).case_id
        )

        if episode_case.closed:
            reason = episode_case.get_case_property('close_reason')
        elif episode_case.get_case_property('dots_99_enabled') == 'false':
            reason = 'source_changed'
        else:
            reason = 'unknown'

        payload = {
            'beneficiary_id': person_case.case_id,
            'reason': reason,
        }
        return json.dumps(payload)
    def get_relevant_test_case(domain, episode_case,
                               test_confirming_diagnosis):
        try:
            occurrence_case = get_occurrence_case_from_episode(
                domain, episode_case.case_id)
        except ENikshayCaseNotFound:
            return None

        indexed_cases = CaseAccessors(domain).get_reverse_indexed_cases(
            [occurrence_case.case_id])
        test_cases = [
            case for case in indexed_cases if case.type == 'test' and (
                case.get_case_property('rft_general') == 'diagnosis_dstb'
                or case.get_case_property('rft_general') == 'diagnosis_drtb')
            and case.get_case_property('result') == 'tb_detected' and case.
            get_case_property('test_type_value') == test_confirming_diagnosis
        ]

        if test_cases:
            return sorted(
                test_cases,
                key=lambda c: c.get_case_property('date_reported'))[-1]
        else:
            return None
Ejemplo n.º 13
0
 def get_occurrence(self, episode):
     if 'occurrence' not in self.context:
         self.context['occurrence'] = get_occurrence_case_from_episode(DOMAIN, episode.case_id)
     return self.context['occurrence']
Ejemplo n.º 14
0
        else:
            return get_relevant_episode_case_by_dates(open_active_episode_cases, log_progress=self.log_progress)

    def reconcile_cases(self, open_occurrence_cases, person_case_id):
        """
        Find the occurrence with most relevant reconciled(if needed) episode case
        """
        open_occurrence_case_ids = [case.case_id for case in open_occurrence_cases]
        # get reconciled(if needed) episode cases for all open occurrences
        all_open_active_episode_cases_for_person = []
        for open_occurrence_case_id in open_occurrence_case_ids:
            all_open_active_episode_cases_for_person += self.get_open_active_reconciled_episode_cases_for_occurrence(
                open_occurrence_case_id)
        if all_open_active_episode_cases_for_person:
            relevant_episode_case = self.get_relevant_episode_case(all_open_active_episode_cases_for_person)
            retain_case = get_occurrence_case_from_episode(DOMAIN, relevant_episode_case)
            self.close_cases(open_occurrence_cases, retain_case, person_case_id, "occurrence")
        else:
            # Log the case where no open and active episode case was found for reconciliation
            # This should imply a person with multiple open occurrence cases but none of them with
            # an open and active episode case to consider
            self.writerow({
                "case_type": "occurrence",
                "associated_case_id": person_case_id,
                "notes": "Found no active open episodes cases to reconcile occurrences for this person"
            })

    def close_cases(self, all_cases, retain_case, associated_case_id, reconciling_case_type):
        # remove duplicates in case ids to remove so that we don't retain and close
        # the same case by mistake
        all_case_ids = set([case.case_id for case in all_cases])
Ejemplo n.º 15
0
 def test_get_occurrence_case_from_episode(self):
     self.assertEqual(
         get_occurrence_case_from_episode(self.domain, self.episode_id).case_id,
         self.occurrence_id
     )
Ejemplo n.º 16
0
 def test_get_occurrence_case_from_episode(self):
     self.assertEqual(
         get_occurrence_case_from_episode(self.domain,
                                          self.episode_id).case_id,
         self.occurrence_id)
    def handle(self, commit, domain, log_path, **options):
        commit = commit
        factory = CaseFactory(domain)
        headers = [
            'case_id',
            'case_type',
            'test_date_tested',
            'test_result',
            'test_interim_outcome',
            'episode_interim_outcome',
            'episode_interim_outcome_history',
            'datamigration_interim_outcome',
        ]

        print("Starting {} migration on {} at {}".format(
            "real" if commit else "fake", domain, datetime.datetime.utcnow()))

        case_ids = [
            hit['_id'] for hit in (CaseSearchES().domain(
                domain).case_type("episode").case_property_query(
                    "episode_type", "confirmed_drtb", "must").run().hits)
        ]

        with open(log_path, "w") as log_file:
            writer = csv.writer(log_file)
            writer.writerow(headers)
            accessor = CaseAccessors(domain=domain)
            for episode in accessor.iter_cases(case_ids):
                if self.is_valid_case(domain, episode):
                    # Get all follow up tests with a result
                    occurrence = get_occurrence_case_from_episode(
                        domain, episode.case_id)
                    tests = [
                        case for case in accessor.get_reverse_indexed_cases(
                            [occurrence.get_id])
                        if case.type == CASE_TYPE_TEST and case.
                        get_case_property('rft_general') == 'follow_up_drtb'
                        and case.get_case_property('result_recorded') == 'yes'
                    ]
                    tests = sorted(
                        tests,
                        key=lambda test: test.get_case_property('date_tested'))

                    interim_outcome = ''
                    interim_outcome_history = ''
                    for i in range(1, len(tests)):
                        test_interim_outcome = None
                        test_interim_outcome_text = None
                        current_test = tests[i]
                        current_test_date = datetime.datetime.strptime(
                            current_test.get_case_property('date_tested'),
                            "%Y-%m-%d").date()
                        prev_test = tests[i - 1]
                        prev_test_date = datetime.datetime.strptime(
                            prev_test.get_case_property('date_tested'),
                            "%Y-%m-%d").date()
                        if (current_test_date - prev_test_date).days >= 30:
                            if (prev_test.get_case_property('result')
                                    == TEST_RESULT_TB_NOT_DETECTED and
                                    current_test.get_case_property('result')
                                    == TEST_RESULT_TB_NOT_DETECTED and
                                    interim_outcome != 'culture_conversion'):
                                test_interim_outcome = 'culture_conversion'
                                test_interim_outcome_text = "Culture Conversion"
                            elif (prev_test.get_case_property('result')
                                  == TEST_RESULT_TB_DETECTED
                                  and current_test.get_case_property('result')
                                  == TEST_RESULT_TB_DETECTED
                                  and interim_outcome == 'culture_conversion'):
                                test_interim_outcome = 'culture_reversion'
                                test_interim_outcome_text = "Culture Reversion"

                            if test_interim_outcome:
                                interim_outcome = test_interim_outcome
                                interim_outcome_history = prev_test_date.strftime("%d/%m/%y") + ": " + \
                                    test_interim_outcome_text + '\n' + interim_outcome_history

                                writer.writerow([
                                    current_test.case_id, "test",
                                    current_test.get_case_property(
                                        'date_tested'),
                                    current_test.get_case_property('result'),
                                    test_interim_outcome, None, None, "yes"
                                ])
                                print('Updating {}...'.format(
                                    current_test.case_id))
                                case_structure = CaseStructure(
                                    case_id=current_test.case_id,
                                    walk_related=False,
                                    attrs={
                                        "create": False,
                                        "update": {
                                            "interim_outcome":
                                            test_interim_outcome,
                                            "datamigration_interim_outcome":
                                            "yes",
                                        },
                                    },
                                )
                                if commit:
                                    factory.create_or_update_case(
                                        case_structure)
                            else:
                                writer.writerow([
                                    current_test.case_id, "test",
                                    current_test.get_case_property(
                                        'date_tested'),
                                    current_test.get_case_property('result'),
                                    None, None, None, "no"
                                ])

                    # update episode if needed
                    if interim_outcome:
                        writer.writerow([
                            episode.case_id, "episode", None, None, None,
                            interim_outcome, interim_outcome_history, "yes"
                        ])
                        print('Updating {}...'.format(episode.case_id))
                        case_structure = CaseStructure(
                            case_id=episode.case_id,
                            walk_related=False,
                            attrs={
                                "create": False,
                                "update": {
                                    "interim_outcome": interim_outcome,
                                    "interim_outcome_history":
                                    interim_outcome_history,
                                    "datamigration_interim_outcome": "yes",
                                },
                            },
                        )
                        if commit:
                            factory.create_or_update_case(case_structure)
                    else:
                        writer.writerow([
                            episode.case_id, "episode", None, None, None, None,
                            None, "no"
                        ])

        print("Migration finished at {}".format(datetime.datetime.utcnow()))