def hard_rebuild_case(domain, case_id, detail): try: case = CommCareCase.get(case_id) assert case.domain == domain found = True except CaseNotFound: case = CommCareCase() case.case_id = case_id case.domain = domain found = False forms = FormProcessorCouch.get_case_forms(case_id) filtered_forms = [f for f in forms if f.is_normal] sorted_forms = sorted(filtered_forms, key=lambda f: f.received_on) actions = _get_actions_from_forms(domain, sorted_forms, case_id) if not found and case.domain is None: case.domain = domain rebuild_case_from_actions(case, actions) # todo: should this move to case.rebuild? if not case.xform_ids: if not found: return None # there were no more forms. 'delete' the case case.doc_type = 'CommCareCase-Deleted' # add a "rebuild" action case.actions.append(_rebuild_action()) case.save() return case
def prepare_case_json(planning_db): case_ids = planning_db.get_all_case_ids(valid_only=False) for case_json in iter_docs(CommCareCase.get_db(), case_ids): case = CommCareCase.wrap(case_json) if case.doc_type != "CommCareCase": assert case.doc_type == "CommCareCase-Deleted" continue # to normalize for any new fields added case_json = deepcopy(case.to_json()) actions = [CommCareCaseAction.wrap(action) for action in planning_db.get_actions_by_case(case.case_id)] rebuild_case_from_actions(case, actions) planning_db.update_case_json(case.case_id, case.to_json()) planning_db.add_diffs("case", case.case_id, json_diff(case_json, case.to_json())) return planning_db
def hard_rebuild_case(domain, case_id, detail, save=True, lock=True): if lock: # only record metric if locking since otherwise it has been # (most likley) recorded elsewhere case_load_counter("rebuild_case", domain)() case, lock_obj = FormProcessorCouch.get_case_with_lock(case_id, lock=lock, wrap=True) found = bool(case) if not found: case = CommCareCase() case.case_id = case_id case.domain = domain if lock: lock_obj = CommCareCase.get_obj_lock_by_id(case_id) acquire_lock(lock_obj, degrade_gracefully=False) try: assert case.domain == domain, (case.domain, domain) forms = FormProcessorCouch.get_case_forms(case_id) form_load_counter("rebuild_case", domain)(len(forms)) filtered_forms = [f for f in forms if f.is_normal] sorted_forms = sorted(filtered_forms, key=lambda f: f.received_on) actions = _get_actions_from_forms(domain, sorted_forms, case_id) if not found and case.domain is None: case.domain = domain rebuild_case_from_actions(case, actions) # todo: should this move to case.rebuild? if not case.xform_ids: if not found: return None # there were no more forms. 'delete' the case case.doc_type = 'CommCareCase-Deleted' # add a "rebuild" action case.actions.append(_rebuild_action()) if save: case.save() return case finally: release_lock(lock_obj, degrade_gracefully=True)