コード例 #1
0
ファイル: casediff.py プロジェクト: marionumza/commcare-hq
def iter_ledger_diffs(case_ids, dd_count):
    couch_state_map = {
        state.ledger_reference: state
        for state in StockState.objects.filter(case_id__in=case_ids)
    }
    sql_refs = set()
    for ledger_value in LedgerAccessorSQL.get_ledger_values_for_cases(case_ids):
        ref = ledger_value.ledger_reference
        sql_refs.add(ref)
        couch_state = couch_state_map.get(ref, None)
        if couch_state is None:
            couch_json = get_stock_state_json(ledger_value)
            dd_count("commcare.couchsqlmigration.ledger.rebuild")
        else:
            couch_json = couch_state.to_json()
        dd_count("commcare.couchsqlmigration.ledger.diffed")
        diffs = json_diff(couch_json, ledger_value.to_json(), track_list_indices=False)
        diffs = filter_ledger_diffs(diffs)
        if diffs:
            dd_count("commcare.couchsqlmigration.ledger.has_diff")
        yield "stock state", ref.as_id(), diffs
    for ref, couch_state in couch_state_map.items():
        if ref not in sql_refs:
            diffs = json_diff(couch_state.to_json(), {}, track_list_indices=False)
            dd_count("commcare.couchsqlmigration.ledger.diffed")
            dd_count("commcare.couchsqlmigration.ledger.has_diff")
            yield "stock state", ref.as_id(), filter_ledger_diffs(diffs)
コード例 #2
0
def ledger_data():
    from casexml.apps.stock.mock import Balance
    from casexml.apps.case.mock import CaseFactory
    from casexml.apps.stock.mock import Entry

    factory = CaseFactory('domain')
    with case_data() as case_ids:
        balance_blocks = [
            Balance(
                entity_id=case_id,
                date=datetime.utcnow(),
                section_id='test',
                entry=Entry(id='chocolate', quantity=4),
            ).as_xml()
            for case_id in case_ids
        ]
        form, _ = factory.post_case_blocks(balance_blocks)

        ledgers = LedgerAccessorSQL.get_ledger_values_for_cases(case_ids)

        try:
            yield [ledger.ledger_id for ledger in ledgers]
        finally:
            form.delete()
            for ledger in ledgers:
                ledger.delete()
コード例 #3
0
ファイル: casediff.py プロジェクト: fmagege/commcare-hq
def diff_ledgers(case_ids, dd_count):
    def diff(couch_state, ledger_value):
        couch_json = couch_state.to_json() if couch_state is not None else {}
        diffs = json_diff(couch_json,
                          ledger_value.to_json(),
                          track_list_indices=False)
        return filter_ledger_diffs(diffs)

    stock_tx = StockTransactionLoader()
    couch_state_map = {
        state.ledger_reference: state
        for state in StockState.objects.filter(case_id__in=case_ids)
    }
    sql_refs = set()
    all_diffs = []
    all_changes = []
    for ledger_value in LedgerAccessorSQL.get_ledger_values_for_cases(
            case_ids):
        ref = ledger_value.ledger_reference
        sql_refs.add(ref)
        dd_count("commcare.couchsqlmigration.ledger.diffed")
        couch_state = couch_state_map.get(ref, None)
        if couch_state is None:
            couch_state = stock_tx.get_stock_state(ref)
            dd_count("commcare.couchsqlmigration.ledger.rebuild")
        if couch_state is None:
            diffs = [stock_tx.diff_missing_ledger(ledger_value)]
            old_value = diffs[0].old_value
            if old_value[
                    "form_state"] == FORM_PRESENT and "ledger" not in old_value:
                changes = diffs_to_changes(diffs,
                                           "missing couch stock transaction")
                all_changes.append(("stock state", ref.as_id(), changes))
                dd_count("commcare.couchsqlmigration.ledger.did_change")
                diffs = []
        else:
            diffs = diff(couch_state, ledger_value)
            if diffs and stock_tx.has_duplicate_transactions(ref):
                changes = diffs_to_changes(diffs,
                                           "duplicate stock transaction")
                all_changes.append(("stock state", ref.as_id(), changes))
                dd_count("commcare.couchsqlmigration.ledger.did_change")
                diffs = []
        if diffs:
            dd_count("commcare.couchsqlmigration.ledger.has_diff")
        all_diffs.append(("stock state", ref.as_id(), diffs))
    for ref, couch_state in couch_state_map.items():
        if ref not in sql_refs:
            diffs = [stock_tx.diff_missing_ledger(couch_state, sql_miss=True)]
            dd_count("commcare.couchsqlmigration.ledger.diffed")
            dd_count("commcare.couchsqlmigration.ledger.has_diff")
            all_diffs.append(("stock state", ref.as_id(), diffs))
    return all_diffs, all_changes
コード例 #4
0
def diff_ledgers(case_ids, statedb):
    log.debug('Calculating ledger diffs for {} cases'.format(len(case_ids)))
    couch_state_map = {
        state.ledger_reference: state
        for state in StockState.objects.filter(case_id__in=case_ids)
    }
    for ledger_value in LedgerAccessorSQL.get_ledger_values_for_cases(
            case_ids):
        couch_state = couch_state_map.get(ledger_value.ledger_reference, None)
        diffs = json_diff(couch_state.to_json(),
                          ledger_value.to_json(),
                          track_list_indices=False)
        statedb.add_diffs('stock state', ledger_value.ledger_reference.as_id(),
                          filter_ledger_diffs(diffs))
コード例 #5
0
    def _diff_ledgers(self, case_ids):
        from corehq.apps.tzmigration.timezonemigration import json_diff
        from corehq.apps.commtrack.models import StockState
        couch_state_map = {
            state.ledger_reference: state
            for state in StockState.objects.filter(case_id__in=case_ids)
        }

        self.log_debug('Calculating ledger diffs for {} cases'.format(len(case_ids)))

        for ledger_value in LedgerAccessorSQL.get_ledger_values_for_cases(case_ids):
            couch_state = couch_state_map.get(ledger_value.ledger_reference, None)
            diffs = json_diff(couch_state.to_json(), ledger_value.to_json(), track_list_indices=False)
            self.diff_db.add_diffs(
                'stock state', ledger_value.ledger_reference.as_id(),
                filter_ledger_diffs(diffs)
            )
コード例 #6
0
    def _diff_ledgers(self, case_ids):
        from corehq.apps.tzmigration.timezonemigration import json_diff
        from corehq.apps.commtrack.models import StockState
        couch_state_map = {
            state.ledger_reference: state
            for state in StockState.objects.filter(case_id__in=case_ids)
        }

        self.log_debug('Calculating ledger diffs for {} cases'.format(len(case_ids)))

        for ledger_value in LedgerAccessorSQL.get_ledger_values_for_cases(case_ids):
            couch_state = couch_state_map.get(ledger_value.ledger_reference, None)
            diffs = json_diff(couch_state.to_json(), ledger_value.to_json(), track_list_indices=False)
            self.diff_db.add_diffs(
                'stock state', ledger_value.ledger_reference.as_id(),
                filter_ledger_diffs(diffs)
            )
コード例 #7
0
def get_tasks_case_immunization_ledger_values(tasks_case):
    if tasks_case.type != 'tasks':
        raise ValueError("Expected 'tasks' case")

    return LedgerAccessorSQL.get_ledger_values_for_cases([tasks_case.case_id], section_id='immuns')
コード例 #8
0
ファイル: retrydb.py プロジェクト: tobiasmcnulty/commcare-hq
def get_sql_ledger_values(case_ids):
    return LedgerAccessorSQL.get_ledger_values_for_cases(case_ids)