def test_reconcile_transactions_within_fudge_factor(self, soft_assert_mock): """ tests a transanction with an early client date and late server date """ with freeze_time("2018-10-10"): case = self._create_case() with freeze_time("2018-10-11 06:00"): new_old_xform = self._create_form() with freeze_time("2018-10-10 18:00"): new_old_trans = self._create_case_transaction(case, new_old_xform) with freeze_time("2018-10-11 06:00"): case.track_create(new_old_trans) FormProcessorSQL.save_processed_models(ProcessedForms(new_old_xform, []), [case]) with freeze_time("2018-10-11"): new_old_xform = self._create_form() new_old_trans = self._create_case_transaction(case, new_old_xform) case.track_create(new_old_trans) FormProcessorSQL.save_processed_models(ProcessedForms(new_old_xform, []), [case]) case = CaseAccessorSQL.get_case(case.case_id) update_strategy = SqlCaseUpdateStrategy(case) self.assertTrue(update_strategy.reconcile_transactions_if_necessary()) self._check_for_reconciliation_error_soft_assert(soft_assert_mock) CaseAccessorSQL.save_case(case) case = CaseAccessorSQL.get_case(case.case_id) update_strategy = SqlCaseUpdateStrategy(case) self.assertFalse(update_strategy.reconcile_transactions_if_necessary()) self._check_for_reconciliation_error_soft_assert(soft_assert_mock)
def _rebuild_case_from_transactions(case, detail, updated_xforms=None): transactions = get_case_transactions(case.case_id, updated_xforms=updated_xforms) strategy = SqlCaseUpdateStrategy(case) rebuild_transaction = CaseTransaction.rebuild_transaction(case, detail) strategy.rebuild_from_transactions(transactions, rebuild_transaction) return case
def test_update_known_properties_with_empty_values(): def test(prop): case = SqlCaseUpdateStrategy.case_implementation_class() setattr(case, prop, "value") action = CaseUpdateAction(block=None, **{prop: ""}) SqlCaseUpdateStrategy(case)._update_known_properties(action) eq(getattr(case, prop), "")
def _rebuild_case_from_transactions(case, detail, updated_xforms=None): transactions = get_case_transactions(case.case_id, updated_xforms=updated_xforms) strategy = SqlCaseUpdateStrategy(case) rebuild_transaction = CaseTransaction.rebuild_transaction(case, detail) unarchived_form_id = None if detail.type == CaseTransaction.TYPE_REBUILD_FORM_ARCHIVED and not detail.archived: # we're rebuilding because a form was un-archived unarchived_form_id = detail.form_id strategy.rebuild_from_transactions( transactions, rebuild_transaction, unarchived_form_id=unarchived_form_id ) return case
def test_reconcile_not_necessary(self): with freeze_time("2018-10-10"): case = self._create_case() with freeze_time("2018-10-11"): new_old_xform = self._create_form() new_old_trans = self._create_case_transaction(case, new_old_xform) case.track_create(new_old_trans) FormProcessorSQL.save_processed_models(ProcessedForms(new_old_xform, []), [case]) case = CaseAccessorSQL.get_case(case.case_id) update_strategy = SqlCaseUpdateStrategy(case) self.assertFalse(update_strategy.reconcile_transactions_if_necessary())
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 _rebuild_case_from_transactions(case, detail, updated_xforms=None): transactions = CaseAccessorSQL.get_case_transactions_by_case_id( case, updated_xforms=updated_xforms) strategy = SqlCaseUpdateStrategy(case) rebuild_transaction = CaseTransaction.rebuild_transaction(case, detail) if updated_xforms: rebuild_transaction.server_date = updated_xforms[0].edited_on unarchived_form_id = None if detail.type == CaseTransaction.TYPE_REBUILD_FORM_ARCHIVED and not detail.archived: # we're rebuilding because a form was un-archived unarchived_form_id = detail.form_id strategy.rebuild_from_transactions( transactions, rebuild_transaction, unarchived_form_id=unarchived_form_id ) return case, rebuild_transaction
def test_ignores_before_rebuild_transaction(self): with freeze_time("2018-10-10"): case = self._create_case() with freeze_time("2018-10-11"): new_old_xform = self._create_form() with freeze_time("2018-10-08"): new_old_trans = self._create_case_transaction(case, new_old_xform) with freeze_time("2018-10-11"): case.track_create(new_old_trans) FormProcessorSQL.save_processed_models(ProcessedForms(new_old_xform, []), [case]) self.assertFalse(case.check_transaction_order()) with freeze_time("2018-10-13"): new_rebuild_xform = self._create_form() rebuild_detail = RebuildWithReason(reason="shadow's golden coin") rebuild_transaction = CaseTransaction.rebuild_transaction(case, rebuild_detail) case.track_create(rebuild_transaction) FormProcessorSQL.save_processed_models(ProcessedForms(new_rebuild_xform, []), [case]) case = CaseAccessorSQL.get_case(case.case_id) update_strategy = SqlCaseUpdateStrategy(case) self.assertFalse(update_strategy.reconcile_transactions_if_necessary())