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)
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))
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'))
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()
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": ""})
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
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))
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')), })
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, ])
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
def test_get_episode(self): self.assertEqual(get_open_episode_case_from_person(self.domain, 'person').case_id, 'episode')
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)
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 test_get_episode(self): self.assertEqual( get_open_episode_case_from_person(self.domain, 'person').case_id, 'episode')
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)