예제 #1
0
def get_cleanliness_flag_from_scratch(domain, owner_id):
    casedb = CaseAccessors(domain)
    footprint_info = get_case_footprint_info(domain, owner_id)
    owned_cases = footprint_info.base_ids
    cases_to_check = footprint_info.all_ids - owned_cases
    if cases_to_check:
        closed_owned_case_ids = set(casedb.get_closed_case_ids(owner_id))
        cases_to_check = cases_to_check - closed_owned_case_ids - footprint_info.extension_ids
        # check extension cases that are unowned or owned by others
        extension_cases_to_check = footprint_info.extension_ids - closed_owned_case_ids - owned_cases
        while extension_cases_to_check:
            extension_case = extension_cases_to_check.pop()
            dependent_cases = set(get_dependent_case_info(domain, [extension_case]).all_ids)
            unowned_dependent_cases = dependent_cases - owned_cases
            extension_cases_to_check = extension_cases_to_check - dependent_cases
            dependent_cases_owned_by_other_owners = {
                dependent_case.case_id
                for dependent_case in casedb.get_cases(list(unowned_dependent_cases))
                if dependent_case.owner_id != UNOWNED_EXTENSION_OWNER_ID
            }
            if dependent_cases_owned_by_other_owners:
                hint_id = dependent_cases & owned_cases
                return CleanlinessFlag(False, hint_id.pop())

        if cases_to_check:
            # it wasn't in any of the open or closed IDs - it must be dirty
            reverse_index_infos = casedb.get_all_reverse_indices_info(list(cases_to_check))
            reverse_index_ids = set([r.case_id for r in reverse_index_infos])
            indexed_with_right_owner = reverse_index_ids & (owned_cases | closed_owned_case_ids)
            found_deleted_cases = False
            while indexed_with_right_owner:
                hint_id = indexed_with_right_owner.pop()
                infos_for_this_owner = _get_info_by_case_id(reverse_index_infos, hint_id)
                for info in infos_for_this_owner:
                    try:
                        case = CaseAccessors(domain).get_case(info.referenced_id)
                        if not case.is_deleted:
                            return CleanlinessFlag(False, hint_id)
                        else:
                            found_deleted_cases = True
                    except ResourceNotFound:
                        # the case doesn't exist - don't use it as a dirty flag
                        found_deleted_cases = True

            if found_deleted_cases:
                # if we made it all the way to the end of the loop without returning anything
                # then the owner was only flagged as dirty due to missing cases,
                # This implies the owner is still clean.
                return CleanlinessFlag(True, None)
            else:
                # I don't believe code can ever be hit, but if it is we should fail hard
                # until we can better understand it.
                raise IllegalCaseId(
                    "Owner {} in domain {} has an invalid index reference chain!!".format(owner_id, domain)
                )

    return CleanlinessFlag(True, None)