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)