예제 #1
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)
예제 #2
0
    def create_180_treatment_payload(cls, episode_case):
        episode_case_properties = episode_case.dynamic_case_properties()
        person_case = get_person_case_from_episode(episode_case.domain,
                                                   episode_case.case_id)
        pcp_location = cls._get_location(person_case.owner_id,
                                         field_name="owner_id",
                                         related_case_type="person",
                                         related_case_id=person_case.case_id)

        treatment_outcome_date = string_to_date_or_None(
            episode_case_properties.get(TREATMENT_OUTCOME_DATE))
        if treatment_outcome_date is None:
            treatment_outcome_date = datetime.utcnow().date()

        return cls(
            EventID=TREATMENT_180_EVENT,
            EventOccurDate=treatment_outcome_date,
            BeneficiaryUUID=episode_case_properties.get(
                LAST_VOUCHER_CREATED_BY_ID),
            BeneficiaryType="mbbs",
            EpisodeID=episode_case.case_id,
            Location=person_case.owner_id,
            DTOLocation=_get_district_location_id(pcp_location),
            PersonId=person_case.get_case_property('person_id'),
            AgencyId=cls._get_agency_id(
                episode_case),  # not migrated from UATBC, so we're good
            # Incentives are not yet approved in eNikshay
            EnikshayApprover=None,
            EnikshayRole=None,
            EnikshayApprovalDate=None,
        )
예제 #3
0
 def get_payload(self, repeat_record, episode_case):
     """
     https://docs.google.com/document/d/1yUWf3ynHRODyVVmMrhv5fDhaK_ufZSY7y0h9ke5rBxU/edit#heading=h.6zwqb0ms7iz9
     """
     person_case = get_person_case_from_episode(episode_case.domain,
                                                episode_case.get_id)
     episode_case_properties = episode_case.dynamic_case_properties()
     base_properties = self._base_properties(repeat_record, person_case)
     base_properties.update({
         "PatientID":
         episode_case_properties.get("nikshay_id"),
         "OutcomeDate":
         episode_case_properties.get(TREATMENT_OUTCOME_DATE),
         "Outcome":
         treatment_outcome.get(
             episode_case_properties.get(TREATMENT_OUTCOME)),
         "MO":
         u"{} {}".format(
             episode_case_properties.get(TREATMENT_SUPPORTER_FIRST_NAME),
             episode_case_properties.get(TREATMENT_SUPPORTER_LAST_NAME),
         ),
         "MORemark":
         "None Collected in eNikshay",
     })
     return json.dumps(base_properties)
예제 #4
0
    def create_ayush_referral_payload(cls, episode_case):
        episode_case_properties = episode_case.dynamic_case_properties()
        person_case = get_person_case_from_episode(episode_case.domain,
                                                   episode_case.case_id)

        location = cls._get_location(
            episode_case_properties.get("registered_by"),
            field_name="registered_by",
            related_case_type="episode",
            related_case_id=episode_case.case_id,
        )
        if not location.user_id:
            raise NikshayLocationNotFound(
                "Location {} does not have a virtual location user".format(
                    location.location_id))

        return cls(
            EventID=AYUSH_REFERRAL_EVENT,
            EventOccurDate=string_to_date_or_None(
                episode_case.get_case_property(
                    FIRST_PRESCRIPTION_VOUCHER_REDEEMED_DATE)),
            BeneficiaryUUID=location.user_id,
            BeneficiaryType='ayush_other',
            EpisodeID=episode_case.case_id,
            Location=episode_case_properties.get("registered_by"),
            DTOLocation=_get_district_location_id(location),
            PersonId=person_case.get_case_property('person_id'),
            AgencyId=cls._get_agency_id(
                episode_case),  # not migrated from UATBC, so we're good
            # Incentives are not yet approved in eNikshay
            EnikshayApprover=None,
            EnikshayRole=None,
            EnikshayApprovalDate=None,
        )
예제 #5
0
    def create_diagnosis_and_notification_payload(cls, episode_case):
        person_case = get_person_case_from_episode(episode_case.domain,
                                                   episode_case.case_id)

        location = cls._get_location(
            person_case.owner_id,
            field_name="owner_id",
            related_case_type="person",
            related_case_id=person_case.case_id,
        )

        return cls(
            EventID=DIAGNOSIS_AND_NOTIFICATION_EVENT,
            EventOccurDate=string_to_date_or_None(
                episode_case.get_case_property(
                    FIRST_PRESCRIPTION_VOUCHER_REDEEMED_DATE)),
            BeneficiaryUUID=episode_case.dynamic_case_properties().get(
                NOTIFYING_PROVIDER_USER_ID),
            BeneficiaryType=LOCATION_TYPE_MAP[location.location_type.code],
            EpisodeID=episode_case.case_id,
            Location=person_case.owner_id,
            DTOLocation=_get_district_location_id(location),
            PersonId=person_case.get_case_property('person_id'),
            AgencyId=cls._get_agency_id(
                episode_case),  # not migrated from UATBC, so we're good
            # Incentives are not yet approved in eNikshay
            EnikshayApprover=None,
            EnikshayRole=None,
            EnikshayApprovalDate=None,
        )
예제 #6
0
파일: utils.py 프로젝트: alemat/commcare-hq
def is_valid_episode_submission(episode_case):
    try:
        person_case = get_person_case_from_episode(episode_case.domain,
                                                   episode_case)
    except ENikshayCaseNotFound:
        return False
    return not _is_submission_from_test_location(person_case)
예제 #7
0
 def __init__(self, *args, **kwargs):
     super(HistoricalAdherenceReport, self).__init__(*args, **kwargs)
     self.episode = CaseAccessors(self.domain).get_case(
         self.episode_case_id)
     self.episode_properties = self.episode.dynamic_case_properties()
     self.person = get_person_case_from_episode(self.domain,
                                                self.episode_case_id)
예제 #8
0
    def create_successful_treatment_payload(cls, episode_case):
        person_case = get_person_case_from_episode(episode_case.domain,
                                                   episode_case.case_id)

        if person_case.owner_id == ARCHIVED_CASE_OWNER_ID:
            owner_id = person_case.dynamic_case_properties().get('last_owner')
            location = cls._get_location(
                person_case.dynamic_case_properties().get('last_owner'),
                field_name="last_owner",
                related_case_type="person",
                related_case_id=person_case.case_id,
            )
        else:
            owner_id = person_case.owner_id
            location = cls._get_location(person_case.owner_id,
                                         field_name="owner_id",
                                         related_case_type="person",
                                         related_case_id=person_case.case_id)

        return cls(
            EventID=SUCCESSFUL_TREATMENT_EVENT,
            EventOccurDate=cls._get_successful_treatment_date(episode_case),
            BeneficiaryUUID=person_case.case_id,
            BeneficiaryType="patient",
            EpisodeID=episode_case.case_id,
            Location=owner_id,
            DTOLocation=_get_district_location_id(location),
            PersonId=person_case.get_case_property('person_id'),
            AgencyId=cls._get_agency_id(
                episode_case),  # we don't have this for migrated cases
            # Incentives are not yet approved in eNikshay
            EnikshayApprover=None,
            EnikshayRole=None,
            EnikshayApprovalDate=None,
        )
예제 #9
0
    def create_drug_refill_payload(cls, episode_case, n):
        episode_case_properties = episode_case.dynamic_case_properties()
        person_case = get_person_case_from_episode(episode_case.domain,
                                                   episode_case.case_id)
        event_date = string_to_date_or_None(
            episode_case_properties.get(
                PRESCRIPTION_TOTAL_DAYS_THRESHOLD.format(n)))

        pcp_location = cls._get_location(
            person_case.owner_id,
            field_name="owner_id",
            related_case_type="person",
            related_case_id=person_case.case_id,
        )

        return cls(
            EventID=DRUG_REFILL_EVENT,
            EventOccurDate=event_date,
            BeneficiaryUUID=person_case.case_id,
            BeneficiaryType="patient",
            EpisodeID=episode_case.case_id,
            Location=person_case.owner_id,
            DTOLocation=_get_district_location_id(pcp_location),
            PersonId=person_case.get_case_property('person_id'),
            AgencyId=cls._get_agency_id(
                episode_case),  # we don't have this for migrated cases
            # Incentives are not yet approved in eNikshay
            EnikshayApprover=None,
            EnikshayRole=None,
            EnikshayApprovalDate=None,
        )
예제 #10
0
 def _add_row(self,
              episode_id,
              episode_case,
              episode_case_properties,
              should_be_forwarded,
              error_message=None):
     person_case = get_person_case_from_episode(DOMAIN, episode_id)
     person_enikshay_id = person_case.dynamic_case_properties().get(
         'person_id')
     if error_message:
         # add blanks for pending columns to append correctly for repeat record attempts later
         row = [
             person_enikshay_id, episode_id, should_be_forwarded,
             error_message, '', '', '', ''
         ]
     else:
         row = [
             person_enikshay_id,
             episode_id,
             should_be_forwarded,
             episode_case_properties.get('nikshay_registered'),
             episode_case_properties.get('private_nikshay_registered'),
             episode_case_properties.get('nikshay_id'),
             episode_case.external_id,
             '->'.join(self._nikshay_id_update_history(episode_case)),
             episode_case_properties.get('nikshay_error'),
             episode_case_properties.get('private_nikshay_error'),
         ]
     self._add_report_record_attempts(row, episode_id)
     self.ws.append(row)
 def __init__(self, *args, **kwargs):
     super(HistoricalAdherenceReport, self).__init__(*args, **kwargs)
     try:
         self.episode = CaseAccessors(self.domain).get_case(self.episode_case_id)
     except CaseNotFound:
         raise BadRequestError()
     self.episode_properties = self.episode.dynamic_case_properties()
     self.person = get_person_case_from_episode(self.domain, self.episode_case_id)
예제 #12
0
def is_valid_episode_submission(episode_case):
    try:
        person_case = get_person_case_from_episode(episode_case.domain, episode_case)
    except ENikshayCaseNotFound:
        return False
    if person_case.dynamic_case_properties().get('case_version') == PERSON_CASE_2B_VERSION:
        return person_case.dynamic_case_properties().get('dataset') == REAL_DATASET_PROPERTY_VALUE
    return not _is_submission_from_test_location(person_case.case_id, person_case.owner_id)
 def is_valid_case(self, domain, episode):
     if episode.get_case_property('datamigration_interim_outcome') != 'yes':
         # Filter and skip private cases
         try:
             person = get_person_case_from_episode(domain, episode.case_id)
         except ENikshayCaseNotFound:
             return False
         return person.get_case_property(ENROLLED_IN_PRIVATE) != 'true'
     return False
예제 #14
0
def is_valid_archived_submission(episode_case):
    try:
        person_case = get_person_case_from_episode(episode_case.domain, episode_case)
    except ENikshayCaseNotFound:
        return False
    owner_id = person_case.owner_id
    if owner_id == ARCHIVED_CASE_OWNER_ID:
        owner_id = person_case.dynamic_case_properties().get('last_owner', None)

    return not _is_submission_from_test_location(person_case.case_id, owner_id)
 def should_migrate_case(case_id, case_properties, domain):
     if (case_properties.get('datamigration_diagnosis_test_information2') !=
             'yes'
             and case_properties.get('episode_type') == 'confirmed_tb'):
         # Filter and skip private cases
         try:
             person = get_person_case_from_episode(domain, case_id)
         except ENikshayCaseNotFound:
             return False
         if person.get_case_property(ENROLLED_IN_PRIVATE) != 'true':
             return True
     return False
예제 #16
0
    def get_person(self, adherence):
        assert adherence.type in [CASE_TYPE_ADHERENCE, CASE_TYPE_EPISODE], \
            "Unexpected Case type instead of %s and %s" % (CASE_TYPE_ADHERENCE, CASE_TYPE_EPISODE)

        if 'person' not in self.context:
            if adherence.type == CASE_TYPE_EPISODE:
                episode = adherence
            else:
                episode = self.get_episode(adherence)
            self.context['person'] = get_person_case_from_episode(
                DOMAIN, episode.case_id)
        return self.context['person']
예제 #17
0
def is_valid_archived_submission(episode_case):
    try:
        person_case = get_person_case_from_episode(episode_case.domain, episode_case)
    except ENikshayCaseNotFound:
        return False
    if person_case.dynamic_case_properties().get('case_version') == PERSON_CASE_2B_VERSION:
        return person_case.dynamic_case_properties().get('dataset') == REAL_DATASET_PROPERTY_VALUE

    owner_id = person_case.owner_id
    if owner_id == ARCHIVED_CASE_OWNER_ID:
        owner_id = person_case.dynamic_case_properties().get('last_owner', None)

    return not _is_submission_from_test_location(person_case.case_id, owner_id)
예제 #18
0
 def _should_be_forwarded(episode_case, episode_case_properties):
     """
     This would add False for cases that have already been forwarded but
     is a good to have for other cases that are expected to be notified
     """
     person_case = get_person_case_from_episode(DOMAIN, episode_case)
     return (not episode_case_properties.get('nikshay_registered', 'false')
             == 'true' and not episode_case_properties.get(
                 'nikshay_registered', 'false') == 'true'
             and not episode_case_properties.get('nikshay_id', False)
             and episode_case_properties.get('episode_type')
             == DSTB_EPISODE_TYPE
             and is_valid_person_submission(person_case))
예제 #19
0
    def _get_open_episode_cases(self, case_ids):
        case_accessor = CaseAccessors(self.domain)
        episode_cases = case_accessor.iter_cases(case_ids)
        for episode_case in episode_cases:
            # if this episode is part of a deleted or archived person, don't update
            try:
                person_case = get_person_case_from_episode(self.domain, episode_case.case_id)
            except ENikshayCaseNotFound:
                continue

            if person_case.owner_id == ARCHIVED_CASE_OWNER_ID:
                continue

            if person_case.closed:
                continue

            yield episode_case
예제 #20
0
    def allowed_to_forward(self, episode_case):
        # When case property episode.episode_pending_registration transitions from 'yes' to 'no',
        # and (episode.nikshay_registered != 'true'  or episode.nikshay_id != '')
        allowed_case_types_and_users = self._allowed_case_type(episode_case) and self._allowed_user(episode_case)
        if allowed_case_types_and_users:
            episode_case_properties = episode_case.dynamic_case_properties()
            person_case = get_person_case_from_episode(episode_case.domain, episode_case.get_id)

            return (
                not episode_case_properties.get('nikshay_registered', 'false') == 'true' and
                not episode_case_properties.get('nikshay_id', False) and
                case_properties_changed(episode_case, [EPISODE_PENDING_REGISTRATION]) and
                episode_case_properties.get(EPISODE_PENDING_REGISTRATION, 'yes') == 'no' and
                not test_submission(person_case)
            )
        else:
            return False
예제 #21
0
    def create_180_treatment_payload(cls, episode_case):
        episode_case_properties = episode_case.dynamic_case_properties()
        person_case = get_person_case_from_episode(episode_case.domain,
                                                   episode_case.case_id)
        location = cls._get_location(person_case.owner_id,
                                     field_name="owner_id",
                                     related_case_type="person",
                                     related_case_id=person_case.case_id)

        return cls(
            EventID=TREATMENT_180_EVENT,
            EventOccurDate=episode_case_properties.get(TREATMENT_OUTCOME_DATE),
            BeneficiaryUUID=episode_case_properties.get(
                LAST_VOUCHER_CREATED_BY_ID),
            BeneficiaryType="patient",
            EpisodeID=episode_case.case_id,
            Location=location.metadata["nikshay_code"],
        )
예제 #22
0
    def allowed_to_forward(self, episode_case):
        allowed_case_types_and_users = self._allowed_case_type(episode_case) and self._allowed_user(episode_case)
        if not allowed_case_types_and_users:
            return False

        try:
            person_case = get_person_case_from_episode(episode_case.domain, episode_case.get_id)
        except ENikshayCaseNotFound:
            return False

        episode_case_properties = episode_case.dynamic_case_properties()
        return (
            episode_case_properties.get('private_nikshay_registered', 'false') == 'false' and
            not episode_case_properties.get('nikshay_id') and
            valid_nikshay_patient_registration(episode_case_properties, private_registration=True) and
            case_properties_changed(episode_case, [PRIVATE_PATIENT_EPISODE_PENDING_REGISTRATION]) and
            is_valid_person_submission(person_case)
        )
예제 #23
0
    def create_successful_treatment_payload(cls, episode_case):
        episode_case_properties = episode_case.dynamic_case_properties()
        person_case = get_person_case_from_episode(episode_case.domain,
                                                   episode_case.case_id)

        location = cls._get_location(
            person_case.dynamic_case_properties().get('last_owner'),
            field_name="last_owner",
            related_case_type="person",
            related_case_id=person_case.case_id,
        )

        return cls(
            EventID=SUCCESSFUL_TREATMENT_EVENT,
            EventOccurDate=episode_case_properties[TREATMENT_OUTCOME_DATE],
            BeneficiaryUUID=person_case.case_id,
            BeneficiaryType="patient",
            EpisodeID=episode_case.case_id,
            Location=location.metadata["nikshay_code"],
        )
예제 #24
0
    def create_diagnosis_and_notification_payload(cls, episode_case):
        person_case = get_person_case_from_episode(episode_case.domain,
                                                   episode_case.case_id)

        location = cls._get_location(
            person_case.owner_id,
            field_name="owner_id",
            related_case_type="person",
            related_case_id=person_case.case_id,
        )

        return cls(
            EventID=DIAGNOSIS_AND_NOTIFICATION_EVENT,
            EventOccurDate=cls._india_now(),
            BeneficiaryUUID=episode_case.dynamic_case_properties().get(
                NOTIFYING_PROVIDER_USER_ID),
            BeneficiaryType=LOCATION_TYPE_MAP[location.location_type],
            EpisodeID=episode_case.case_id,
            Location=location.metadata["nikshay_code"],
        )
예제 #25
0
    def create_drug_refill_payload(cls, episode_case, n):
        episode_case_properties = episode_case.dynamic_case_properties()
        person_case = get_person_case_from_episode(episode_case.domain,
                                                   episode_case.case_id)
        event_date = episode_case_properties.get(
            PRESCRIPTION_TOTAL_DAYS_THRESHOLD.format(n))

        pcp_location = cls._get_location(
            person_case.owner_id,
            field_name="owner_id",
            related_case_type="person",
            related_case_id=person_case.case_id,
        )

        return cls(EventID=DRUG_REFILL_EVENT,
                   EventOccurDate=event_date,
                   BeneficiaryUUID=person_case.case_id,
                   BeneficiaryType="patient",
                   EpisodeID=episode_case.case_id,
                   Location=person_case.owner_id,
                   DTOLocation=_get_district_location(pcp_location))
예제 #26
0
    def _get_open_episode_cases(self, case_ids):
        case_accessor = CaseAccessors(self.domain)
        episode_cases = case_accessor.iter_cases(case_ids)
        for episode_case in episode_cases:

            # only run on private sector
            if episode_case.get_case_property(ENROLLED_IN_PRIVATE) != 'true':
                continue

            # if this episode is part of a deleted or archived person, don't update
            try:
                person_case = get_person_case_from_episode(
                    self.domain, episode_case.case_id)
            except ENikshayCaseNotFound:
                continue

            if person_case.owner_id == ARCHIVED_CASE_OWNER_ID:
                continue

            if person_case.closed:
                continue

            yield episode_case
예제 #27
0
    def create_180_treatment_payload(cls, episode_case):
        episode_case_properties = episode_case.dynamic_case_properties()
        person_case = get_person_case_from_episode(episode_case.domain,
                                                   episode_case.case_id)
        pcp_location = cls._get_location(person_case.owner_id,
                                         field_name="owner_id",
                                         related_case_type="person",
                                         related_case_id=person_case.case_id)

        treatment_outcome_date = episode_case_properties.get(
            TREATMENT_OUTCOME_DATE, None)
        if treatment_outcome_date is None:
            treatment_outcome_date = datetime.utcnow().strftime("%Y-%m-%d")

        return cls(
            EventID=TREATMENT_180_EVENT,
            EventOccurDate=treatment_outcome_date,
            BeneficiaryUUID=episode_case_properties.get(
                LAST_VOUCHER_CREATED_BY_ID),
            BeneficiaryType="mbbs",
            EpisodeID=episode_case.case_id,
            Location=person_case.owner_id,
            DTOLocation=_get_district_location(pcp_location),
        )
예제 #28
0
 def test_get_person_case_from_episode(self):
     self.assertEqual(
         get_person_case_from_episode(self.domain, self.episode_id).case_id,
         self.person_id)
 def get_person(self, episode):
     if 'person' not in self.context:
         self.context['person'] = get_person_case_from_episode(
             DOMAIN, episode.case_id)
     return self.context['person']
예제 #30
0
 def _get_person_case(self, episode_case):
     return get_person_case_from_episode(episode_case.domain,
                                         episode_case.get_id)