def delete_exploded_cases(domain, explosion_id, task=None): if task: DownloadBase.set_progress(delete_exploded_case_task, 0, 0) query = (CaseSearchES().domain(domain).case_property_query( "cc_explosion_id", explosion_id)) case_ids = query.values_list('_id', flat=True) if task: DownloadBase.set_progress(delete_exploded_case_task, 0, len(case_ids)) case_accessor = CaseAccessors(domain) form_accessor = FormAccessors(domain) ledger_accessor = LedgerAccessorSQL deleted_form_ids = set() num_deleted_ledger_entries = 0 for id in case_ids: ledger_form_ids = { tx.form_id for tx in ledger_accessor.get_ledger_transactions_for_case(id) } for form_id in ledger_form_ids: ledger_accessor.delete_ledger_transactions_for_form([id], form_id) num_deleted_ledger_entries += ledger_accessor.delete_ledger_values(id) new_form_ids = set( case_accessor.get_case_xform_ids(id)) - deleted_form_ids form_accessor.soft_delete_forms(list(new_form_ids)) deleted_form_ids |= new_form_ids completed = 0 for ids in chunked(case_ids, 100): case_accessor.soft_delete_cases(list(ids)) if task: completed += len(ids) DownloadBase.set_progress(delete_exploded_case_task, completed, len(case_ids)) return { 'messages': [ "Successfully deleted {} cases".format(len(case_ids)), "Successfully deleted {} forms".format(len(deleted_form_ids)), "Successfully deleted {} ledgers".format( num_deleted_ledger_entries), ] }