Example #1
0
    def get_payload(self, repeat_record, person_case):
        """
        https://docs.google.com/document/d/1yUWf3ynHRODyVVmMrhv5fDhaK_ufZSY7y0h9ke5rBxU/edit#heading=h.hxfnqahoeag
        """
        episode_case = get_open_episode_case_from_person(
            person_case.domain, person_case.get_id)
        episode_case_properties = episode_case.dynamic_case_properties()
        person_case_properties = person_case.dynamic_case_properties()
        base_properties = self._base_properties(repeat_record)
        base_properties.update({
            "PatientID":
            episode_case_properties.get('nikshay_id'),
            "HIVStatus":
            hiv_status.get(person_case_properties.get('hiv_status')),
            "HIVTestDate":
            _format_date_or_null_date(person_case_properties, 'hiv_test_date'),
            "CPTDeliverDate":
            _format_date_or_null_date(person_case_properties, 'cpt_1_date'),
            "ARTCentreDate":
            _format_date_or_null_date(person_case_properties,
                                      'art_initiation_date'),
            "InitiatedOnART":
            art_initiated.get(
                person_case_properties.get('art_initiated', 'no'),
                art_initiated['no']),
            "InitiatedDate":
            _format_date_or_null_date(person_case_properties,
                                      'art_initiation_date'),
        })

        return json.dumps(base_properties)
Example #2
0
    def _load_episode_ids_from_person(self, file_path):
        """
        1. Load enikshay ids from file
        2. Find corresponding uuid for person cases (This can be more than one match since enikshay id
           can belong to more than one person due to some bug)
        3. Find corresponding open episode ids for each person. If not log in for manual check later.
        """
        print("Loading person enikshay ids from file")
        with open(file_path, 'rU') as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                self.person_enikshay_ids.append(row['enikshay_id'])
            print("Loaded {number} eniksay ids from file".format(
                number=len(self.person_enikshay_ids)))

        print("Searching for person uuids corresponding to each enikshay id")
        for person_enikshay_id in self.person_enikshay_ids:
            self.person_ids += self._search_person_using_enikshay_id(
                person_enikshay_id)
        print("Loaded {number} person ids".format(
            number=len(self.person_enikshay_ids)))

        for person_id in self.person_ids:
            try:
                episode_case = get_open_episode_case_from_person(
                    DOMAIN, person_id)
                self.episode_ids.append(episode_case.get_id)
            except ENikshayCaseNotFound:
                print(("Could not find episode for person with enikshay ID:",
                       person_id))
Example #3
0
class NinetyNineDotsUpdatePatientRepeater(Base99DOTSRepeater):
    """Update patient records a patient in 99DOTS
    Case Type: Person, Episode
    Trigger: When any pertinent property changes
    Side Effects:
        Error: dots_99_error = 'error message'
    Endpoint: https://www.99dots.org/Dimagi99DOTSAPI/updatePatient

    """

    friendly_name = _("99DOTS Patient Update (person & episode case type)")

    payload_generator_classes = (UpdatePatientPayloadGenerator,)

    @classmethod
    def get_custom_url(cls, domain):
        from custom.enikshay.integrations.ninetyninedots.views import UpdatePatientRepeaterView
        return reverse(UpdatePatientRepeaterView.urlname, args=[domain])

    def allowed_to_forward(self, case):
        if not self._allowed_case_type(case) and self._allowed_user(case):
            return False
        try:
            if case.type == CASE_TYPE_PERSON:
                person_case = case
                episode_case = get_open_episode_case_from_person(person_case.domain, person_case.case_id)
                registered_episode = episode_registered_with_99dots(episode_case)
            elif case.type == CASE_TYPE_EPISODE:
                episode_case = case
                registered_episode = (episode_registered_with_99dots(episode_case)
                                      and not case_properties_changed(episode_case, 'dots_99_registered'))
Example #4
0
 def _get_open_episode_case_json(person_id, context):
     domain = context.root_doc['domain']
     try:
         episode = get_open_episode_case_from_person(domain, person_id)
     except ENikshayCaseNotFound:
         return None
     if episode:
         return episode.to_json()
Example #5
0
 def test_update_default_confidence_level(self):
     self.create_case_structure()
     confidence_level = "new_confidence_level"
     update_default_confidence_level(self.domain, self.person_id,
                                     confidence_level)
     episode = get_open_episode_case_from_person(self.domain,
                                                 self.person_id)
     self.assertEqual(
         episode.dynamic_case_properties().get(
             'default_adherence_confidence'), confidence_level)
    def handle_success(self, response, person_case, repeat_record):
        try:
            episode_case = get_open_episode_case_from_person(
                person_case.domain, person_case.case_id)
        except ENikshayCaseNotFound as e:
            self.handle_exception(e, repeat_record)

        if response.status_code == 200:
            update_case(episode_case.domain, episode_case.case_id,
                        {"dots_99_error": ""})
Example #7
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)
     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, episode_case
Example #8
0
def update_episode_adherence_properties(domain, person_id):
    try:
        episode_case = get_open_episode_case_from_person(domain, person_id)
    except ENikshayCaseNotFound as e:
        raise AdherenceException(e.message)
    try:
        updater = EpisodeUpdater(domain)
        updater.update_single_case(episode_case)
    except Exception as e:
        raise AdherenceException(
            "Error calculating updates for episode case_id({}): {}".format(
                episode_case.case_id, e))
Example #9
0
 def __call__(self, item, context=None):
     person_id = self._person_id_expression(item, context)
     domain = context.root_doc['domain']
     if not person_id:
         return None
     try:
         episode = get_open_episode_case_from_person(domain, person_id)
     except ENikshayCaseNotFound:
         return None
     if episode:
         return episode.to_json()
     return None
    def handle_failure(self, response, person_case, repeat_record):
        try:
            episode_case = get_open_episode_case_from_person(
                person_case.domain, person_case.case_id)
        except ENikshayCaseNotFound as e:
            self.handle_exception(e, repeat_record)

        if 400 <= response.status_code <= 500:
            update_case(
                episode_case.domain, episode_case.case_id, {
                    "dots_99_error":
                    "{}: {}".format(response.status_code,
                                    response.json().get('error')),
                })
Example #11
0
    def get_payload(self, repeat_record, person_case):
        """
        https://docs.google.com/document/d/1yUWf3ynHRODyVVmMrhv5fDhaK_ufZSY7y0h9ke5rBxU/edit#heading=h.hxfnqahoeag
        """
        episode_case = get_open_episode_case_from_person(
            person_case.domain, person_case.get_id)
        episode_case_properties = episode_case.dynamic_case_properties()
        person_case_properties = person_case.dynamic_case_properties()
        properties_dict = {
            "PatientID":
            episode_case_properties.get('nikshay_id'),
            "HIVStatus":
            hiv_status.get(person_case_properties.get('hiv_status')),
            "HIVTestDate":
            datetime.datetime.strptime(
                person_case_properties.get('hiv_test_date', NIKSHAY_NULL_DATE),
                '%Y-%m-%d').strftime('%d/%m/%Y'),
            "CPTDeliverDate":
            datetime.datetime.strptime(
                person_case_properties.get('cpt_initiation_date',
                                           NIKSHAY_NULL_DATE),
                '%Y-%m-%d').strftime('%d/%m/%Y'),
            "ARTCentreDate":
            datetime.datetime.strptime(
                person_case_properties.get('art_initiation_date',
                                           NIKSHAY_NULL_DATE),
                '%Y-%m-%d').strftime('%d/%m/%Y'),
            "InitiatedOnART":
            art_initiated.get(person_case_properties.get(
                'art_initiated', 'no')),
            "InitiatedDate":
            datetime.datetime.strptime(
                person_case_properties.get('art_initiation_date',
                                           NIKSHAY_NULL_DATE),
                '%Y-%m-%d').strftime('%d/%m/%Y'),
            "Source":
            ENIKSHAY_ID,
            "regby":
            repeat_record.repeater.username,
            "password":
            repeat_record.repeater.password,
            "IP_FROM":
            "127.0.0.1",
        }

        return json.dumps(properties_dict)
    def handle(self, domain, **options):
        repeater_id = 'b4e19fd859f852871703e8e32a1764a9'  # 99dots update
        repeater_type = 'NinetyNineDotsUpdatePatientRepeater'  # 99dots update

        cs = (
            CaseSearchES().domain(domain)
            .regexp_case_property_query('secondary_phone', '[0-9]+')
            .case_type('person')
            .case_property_query('enrolled_in_private', 'true')
        )
        person_case_ids = cs.values_list('_id', flat=True)

        enabled_ids = set()
        for person_id in person_case_ids:
            try:
                episode_case = get_open_episode_case_from_person('enikshay', person_id)
                if episode_case.get_case_property('dots_99_enabled') == 'true':
                    enabled_ids.add(person_id)
            except ENikshayCaseNotFound:
                pass

        with open('99dots_phone.csv', 'w') as f:
            writer = csv.writer(f)
            writer.writerow([
                'payload_id', 'state', 'payload', 'attempt message'
            ])
            for payload_id in enabled_ids:
                repeat_record = RepeatRecord(
                    repeater_id=repeater_id,
                    repeater_type=repeater_type,
                    domain=domain,
                    next_check=datetime.utcnow(),
                    payload_id=payload_id
                )

                if options['commit']:
                    repeat_record.fire()

                writer.writerow([
                    repeat_record.payload_id,
                    repeat_record.state,
                    repeat_record.get_payload(),
                    repeat_record.attempts[-1].message,
                ])
Example #13
0
    def allowed_to_forward(self, person_case):
        # episode.nikshay_registered is true and nikshay_id present and
        # person.hiv_status changed OR
        # CPTDeliverDate changes OR
        # InitiatedDate/Art Initiated date changes
        allowed_case_types_and_users = self._allowed_case_type(
            person_case) and self._allowed_user(person_case)
        if allowed_case_types_and_users:
            try:
                episode_case = get_open_episode_case_from_person(
                    person_case.domain, person_case.get_id)
            except ENikshayCaseNotFound:
                return False
            episode_case_properties = episode_case.dynamic_case_properties()

            return (episode_case_properties.get('nikshay_id')
                    and (related_dates_changed(person_case)
                         or person_hiv_status_changed(person_case))
                    and is_valid_person_submission(person_case))
        else:
            return False
Example #14
0
 def test_get_episode(self):
     self.assertEqual(get_open_episode_case_from_person(self.domain, 'person').case_id, 'episode')
Example #15
0
 def _episode_case(self):
     try:
         return get_open_episode_case_from_person(self.domain,
                                                  self._person_case.case_id)
     except ENikshayCaseNotFound as e:
         raise AdherenceException(e.message)
Example #16
0
 def test_update_default_confidence_level(self):
     self.create_case_structure()
     confidence_level = "new_confidence_level"
     update_default_confidence_level(self.domain, self.person_id, confidence_level)
     episode = get_open_episode_case_from_person(self.domain, self.person_id)
     self.assertEqual(episode.dynamic_case_properties().get('default_adherence_confidence'), confidence_level)
Example #17
0
 def test_get_episode(self):
     self.assertEqual(
         get_open_episode_case_from_person(self.domain, 'person').case_id,
         'episode')
Example #18
0
 def _episode_case(self):
     try:
         return get_open_episode_case_from_person(self.domain, self._person_case.case_id)
     except ENikshayCaseNotFound as e:
         raise AdherenceException(e.message)