def process_form_archived(self, form): from corehq.form_processor.parsers.ledgers.form import get_ledger_references_from_stock_transactions refs_to_rebuild = get_ledger_references_from_stock_transactions(form) case_ids = list({ref.case_id for ref in refs_to_rebuild}) LedgerAccessorSQL.delete_ledger_transactions_for_form(case_ids, form.form_id) for ref in refs_to_rebuild: self.rebuild_ledger_state(**ref._asdict())
def delete_all_ledgers(domain): if should_use_sql_backend(domain): for case_id in CaseAccessorSQL.get_case_ids_in_domain(domain): transactions = LedgerAccessorSQL.get_ledger_transactions_for_case(case_id) form_ids = {tx.form_id for tx in transactions} for form_id in form_ids: LedgerAccessorSQL.delete_ledger_transactions_for_form([case_id], form_id) LedgerAccessorSQL.delete_ledger_values(case_id) else: from casexml.apps.stock.models import StockReport from casexml.apps.stock.models import StockTransaction stock_report_ids = StockReport.objects.filter(domain=domain).values_list('id', flat=True) StockReport.objects.filter(domain=domain).delete() StockTransaction.objects.filter(report_id__in=stock_report_ids).delete()
def update_case_transactions_for_form(case_cache, live_case_updates, deprecated_case_updates, live_form, deprecated_form): for case_update in live_case_updates + deprecated_case_updates: case_id = case_update.id count, _ = CaseTransaction.objects.partitioned_query(case_id)\ .filter(case_id=case_id, form_id=live_form.form_id).delete() rebuild_transactions = CaseTransaction.objects.partitioned_query(case_id).filter( case_id=case_id, type=CaseTransaction.TYPE_REBUILD_FORM_EDIT ) for transaction in rebuild_transactions: if transaction.details.get('deprecated_form_id') == deprecated_form.original_form_id: transaction.delete() for case_update in live_case_updates: case_id = case_update.id case = case_cache.get(case_id) SqlCaseUpdateStrategy.add_transaction_for_form(case, case_update, live_form) for case_update in deprecated_case_updates: case_id = case_update.id case = case_cache.get(case_id) SqlCaseUpdateStrategy.add_transaction_for_form(case, case_update, deprecated_form) stock_result = process_stock([live_form, deprecated_form], case_cache) stock_result.populate_models() affected_ledgers = set() affected_cases = set() ledger_transactions = [] for ledger_value in stock_result.models_to_save: affected_ledgers.add(ledger_value.ledger_reference) affected_cases.add(ledger_value.case_id) for transaction in ledger_value.get_tracked_models_to_create(LedgerTransaction): ledger_transactions.append(transaction) if affected_cases: LedgerAccessorSQL.delete_ledger_transactions_for_form(list(affected_cases), live_form.form_id) for transaction in ledger_transactions: transaction.save() for case in case_cache.cache.values(): affected_cases.add(case.case_id) transactions = case.get_tracked_models_to_create(CaseTransaction) for transaction in transactions: transaction.case = case transaction.save() return affected_cases, affected_ledgers
def test_delete_ledger_values_case_section(self): from corehq.apps.commtrack.tests.util import get_single_balance_block form_id = self._submit_ledgers([ get_single_balance_block(self.case_one.case_id, product_id, 10) for product_id in [self.product_a._id, self.product_b._id] ]) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case(self.case_one.case_id) self.assertEqual(2, len(ledger_values)) LedgerAccessorSQL.delete_ledger_transactions_for_form([self.case_one.case_id], form_id) deleted = LedgerAccessorSQL.delete_ledger_values(self.case_one.case_id, 'stock') self.assertEqual(2, deleted) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case(self.case_one.case_id) self.assertEqual(0, len(ledger_values))
def test_delete_ledger_values_case_section_1(self): from corehq.apps.commtrack.tests import get_single_balance_block form_id = self._submit_ledgers([ get_single_balance_block(self.case_one.case_id, self.product_a._id, 10, section_id=section_id) for section_id in ['stock', 'consumption'] ]) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case(self.case_one.case_id) self.assertEqual(2, len(ledger_values)) LedgerAccessorSQL.delete_ledger_transactions_for_form([self.case_one.case_id], form_id) deleted = LedgerAccessorSQL.delete_ledger_values(self.case_one.case_id, 'stock') self.assertEqual(1, deleted) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case(self.case_one.case_id) self.assertEqual(1, len(ledger_values)) self.assertEqual('consumption', ledger_values[0].section_id)
def test_delete_ledger_values_case_section(self): from corehq.apps.commtrack.tests.util import get_single_balance_block form_id = self._submit_ledgers([ get_single_balance_block(self.case_one.case_id, product_id, 10) for product_id in [self.product_a._id, self.product_b._id] ]) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case( self.case_one.case_id) self.assertEqual(2, len(ledger_values)) LedgerAccessorSQL.delete_ledger_transactions_for_form( [self.case_one.case_id], form_id) deleted = LedgerAccessorSQL.delete_ledger_values( self.case_one.case_id, 'stock') self.assertEqual(2, deleted) ledger_values = LedgerAccessorSQL.get_ledger_values_for_case( self.case_one.case_id) self.assertEqual(0, len(ledger_values))
def test_delete_ledger_transactions_for_form(self): from corehq.apps.commtrack.tests.util import get_single_balance_block self._set_balance(100, self.case_one.case_id, self.product_a._id) case_ids = [self.case_one.case_id, self.case_two.case_id] form_id = self._submit_ledgers([ get_single_balance_block(case_id, product_id, 10) for case_id in case_ids for product_id in [self.product_a._id, self.product_b._id] ]) deleted = LedgerAccessorSQL.delete_ledger_transactions_for_form(case_ids, form_id) self.assertEqual(4, deleted) self.assertEqual( 1, len(LedgerAccessorSQL.get_ledger_transactions_for_case(self.case_one.case_id)) ) self.assertEqual( 0, len(LedgerAccessorSQL.get_ledger_transactions_for_case(self.case_two.case_id)) )
def test_delete_ledger_transactions_for_form(self): from corehq.apps.commtrack.tests.util import get_single_balance_block self._set_balance(100, self.case_one.case_id, self.product_a._id) case_ids = [self.case_one.case_id, self.case_two.case_id] form_id = self._submit_ledgers([ get_single_balance_block(case_id, product_id, 10) for case_id in case_ids for product_id in [self.product_a._id, self.product_b._id] ]) deleted = LedgerAccessorSQL.delete_ledger_transactions_for_form( case_ids, form_id) self.assertEqual(4, deleted) self.assertEqual( 1, len( LedgerAccessorSQL.get_ledger_transactions_for_case( self.case_one.case_id))) self.assertEqual( 0, len( LedgerAccessorSQL.get_ledger_transactions_for_case( self.case_two.case_id)))
def _delete_ledgers_for_case(case_id): transactions = LedgerAccessorSQL.get_ledger_transactions_for_case(case_id) form_ids = {tx.form_id for tx in transactions} for form_id in form_ids: LedgerAccessorSQL.delete_ledger_transactions_for_form([case_id], form_id) LedgerAccessorSQL.delete_ledger_values(case_id)
def delete_ledger_transactions(self, form_id): LedgerAccessorSQL.delete_ledger_transactions_for_form( self.case_ids, form_id)