예제 #1
0
def get_parent_of_case(domain, case_id, parent_case_type):
    case_accessor = CaseAccessors(domain)
    try:
        if not isinstance(case_id, basestring):
            case_id = case_id.case_id

        child_case = case_accessor.get_case(case_id)
    except CaseNotFound:
        raise ENikshayCaseNotFound("Couldn't find case: {}".format(case_id))

    parent_case_ids = [
        indexed_case.referenced_id for indexed_case in child_case.indices
        if indexed_case.referenced_type == parent_case_type
    ]
    parent_cases = case_accessor.get_cases(parent_case_ids)
    open_parent_cases = [
        occurrence_case for occurrence_case in parent_cases
        if not occurrence_case.closed
    ]

    if not open_parent_cases:
        raise ENikshayCaseNotFound(
            "Couldn't find any open {} cases for id: {}".format(
                parent_case_type, case_id))

    return open_parent_cases[0]
예제 #2
0
def get_open_episode_case_from_person(domain, person_case_id):
    """
    Gets the first open 'episode' case for the person

    Assumes the following case structure:
    Person <--ext-- Occurrence <--ext-- Episode

    """
    case_accessor = CaseAccessors(domain)
    occurrence_cases = case_accessor.get_reverse_indexed_cases(
        [person_case_id])
    open_occurrence_cases = [
        case for case in occurrence_cases
        if not case.closed and case.type == CASE_TYPE_OCCURRENCE
    ]
    if not open_occurrence_cases:
        raise ENikshayCaseNotFound(
            "Person with id: {} exists but has no open occurrence cases".
            format(person_case_id))
    occurrence_case = open_occurrence_cases[0]
    episode_cases = case_accessor.get_reverse_indexed_cases(
        [occurrence_case.case_id])
    open_episode_cases = [
        case for case in episode_cases
        if not case.closed and case.type == CASE_TYPE_EPISODE and
        case.dynamic_case_properties().get('episode_type') == "confirmed_tb"
    ]
    if open_episode_cases:
        return open_episode_cases[0]
    else:
        raise ENikshayCaseNotFound(
            "Person with id: {} exists but has no open episode cases".format(
                person_case_id))
예제 #3
0
def get_associated_episode_case_for_test(test_case, occurrence_case_id):
    """
    get associated episode case set on the test case for new structure
    if has a new_episode_id (for diagnostic -> confirmed_tb or dstb -> drtb episode transition)
        return that episode which should be a confirmed_tb/confirmed_drtb case
    elif has a episode_case_id (for follow up test cases)
        return the associated episode case only
        which should be a confirmed_tb/confirmed_drtb case
    else
        fallback to finding the open confirmed tb episode case
    """
    test_case_properties = test_case.dynamic_case_properties()
    test_case_episode_id = (test_case_properties.get('new_episode_case_id')
                            or test_case_properties.get('episode_case_id'))
    if test_case_episode_id:
        accessor = CaseAccessors(test_case.domain)
        try:
            return accessor.get_case(test_case_episode_id)
        except CaseNotFound:
            raise ENikshayCaseNotFound(
                "Could not find episode case %s associated with test %s" %
                (test_case_episode_id, test_case.get_id))

    return get_open_episode_case_from_occurrence(test_case.domain,
                                                 occurrence_case_id)
예제 #4
0
def get_lab_referral_from_test(domain, test_case_id):
    case_accessor = CaseAccessors(domain)
    lab_referral_cases = case_accessor.get_reverse_indexed_cases(
        [test_case_id], case_types=[CASE_TYPE_LAB_REFERRAL])
    if lab_referral_cases:
        return lab_referral_cases[0]
    else:
        raise ENikshayCaseNotFound(
            "test with id: {} exists but has no lab referral cases".format(
                test_case_id))
예제 #5
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
예제 #6
0
def get_first_parent_of_case(domain, case_id, parent_case_type):
    parent_cases = get_all_parents_of_case(domain, case_id)
    case_type_parent_cases = [
        parent_case for parent_case in parent_cases if parent_case.type == parent_case_type
    ]

    if not case_type_parent_cases:
        raise ENikshayCaseNotFound(
            "Couldn't find any {} cases for id: {}".format(parent_case_type, case_id)
        )

    return case_type_parent_cases[0]
예제 #7
0
def get_open_occurrence_case_from_person(domain, person_case_id):
    """
    Gets the first open 'occurrence' case for the person

    Assumes the following case structure:
    Person <--ext-- Occurrence

    """
    open_occurrence_cases = CaseAccessors(domain).get_reverse_indexed_cases(
        [person_case_id], case_types=[CASE_TYPE_OCCURRENCE], is_closed=False)
    if not open_occurrence_cases:
        raise ENikshayCaseNotFound(
            "Person with id: {} exists but has no open occurrence cases".
            format(person_case_id))
    return open_occurrence_cases[0]
예제 #8
0
def get_open_drtb_hiv_case_from_episode(domain, episode_case_id):
    """
    Gets the first open 'drtb-hiv-referral' case for the episode

    Assumes the following case structure:
    episode <--ext-- drtb-hiv-referral
    """
    case_accessor = CaseAccessors(domain)
    open_drtb_cases = case_accessor.get_reverse_indexed_cases(
        [episode_case_id], case_types=[CASE_TYPE_DRTB_HIV_REFERRAL], is_closed=False)
    if open_drtb_cases:
        return open_drtb_cases[0]
    else:
        raise ENikshayCaseNotFound(
            "Occurrence with id: {} exists but has no open episode cases".format(episode_case_id)
        )
예제 #9
0
def get_all_parents_of_case(domain, case_id):
    case_accessor = CaseAccessors(domain)
    try:
        if not isinstance(case_id, basestring):
            case_id = case_id.case_id

        child_case = case_accessor.get_case(case_id)
    except CaseNotFound:
        raise ENikshayCaseNotFound("Couldn't find case: {}".format(case_id))

    parent_case_ids = [
        indexed_case.referenced_id for indexed_case in child_case.indices
    ]
    parent_cases = case_accessor.get_cases(parent_case_ids)

    return parent_cases
예제 #10
0
def get_open_occurrence_case_from_person(domain, person_case_id):
    """
    Gets the first open 'occurrence' case for the person

    Assumes the following case structure:
    Person <--ext-- Occurrence

    """
    case_accessor = CaseAccessors(domain)
    occurrence_cases = case_accessor.get_reverse_indexed_cases([person_case_id])
    open_occurrence_cases = [case for case in occurrence_cases
                             if not case.closed and case.type == CASE_TYPE_OCCURRENCE]
    if not open_occurrence_cases:
        raise ENikshayCaseNotFound(
            "Person with id: {} exists but has no open occurrence cases".format(person_case_id)
        )
    return open_occurrence_cases[0]
예제 #11
0
def _get_voucher_parent(domain, voucher_case_id):
    prescription = None
    test = None

    try:
        prescription = get_first_parent_of_case(domain, voucher_case_id, CASE_TYPE_PRESCRIPTION)
    except ENikshayCaseNotFound:
        pass
    try:
        test = get_first_parent_of_case(domain, voucher_case_id, CASE_TYPE_TEST)
    except ENikshayCaseNotFound:
        pass
    if not (prescription or test):
        raise ENikshayCaseNotFound(
            "Couldn't find any open parent prescription or test cases for id: {}".format(voucher_case_id)
        )
    assert not (prescription and test), "Didn't expect voucher to have prescription AND test parent"
    return test or prescription
예제 #12
0
    Assumes the following case structure:
    Occurrence <--ext-- Episode

    """
    open_episode_cases = CaseAccessors(domain).get_reverse_indexed_cases(
        [occurrence_case_id], case_types=[CASE_TYPE_EPISODE], is_closed=False)
    confirmed_episode_cases = [
        case for case in open_episode_cases
        if case.dynamic_case_properties().get('episode_type') == "confirmed_tb"
    ]
    if confirmed_episode_cases:
        return confirmed_episode_cases[0]
    else:
        raise ENikshayCaseNotFound(
            "Occurrence with id: {} exists but has no open episode cases".
            format(occurrence_case_id))


def get_open_drtb_hiv_case_from_episode(domain, episode_case_id):
    """
    Gets the first open 'drtb-hiv-referral' case for the episode

    Assumes the following case structure:
    episode <--ext-- drtb-hiv-referral
    """
    case_accessor = CaseAccessors(domain)
    open_drtb_cases = case_accessor.get_reverse_indexed_cases(
        [episode_case_id],
        case_types=[CASE_TYPE_DRTB_HIV_REFERRAL],
        is_closed=False)
예제 #13
0

@hqnottest
def get_lab_referral_from_test(domain, test_case_id):
    case_accessor = CaseAccessors(domain)
    reverse_indexed_cases = case_accessor.get_reverse_indexed_cases(
        [test_case_id])
    lab_referral_cases = [
        case for case in reverse_indexed_cases
        if case.type == CASE_TYPE_LAB_REFERRAL
    ]
    if lab_referral_cases:
        return lab_referral_cases[0]
    else:
        raise ENikshayCaseNotFound(
            "test with id: {} exists but has no lab referral cases".format(
                test_case_id))


def get_adherence_cases_by_day(domain, episode_case_id):
    indexed_cases = CaseAccessors(domain).get_reverse_indexed_cases(
        [episode_case_id])
    adherence_cases = [
        case for case in indexed_cases if case.type == CASE_TYPE_ADHERENCE
    ]

    adherence = defaultdict(list)  # datetime.date -> list of adherence cases

    for case in adherence_cases:
        # adherence_date is in India timezone
        adherence_datetime = parse(