def _rebuild_couch_case_and_re_diff(self, couch_case, sql_case_json): from corehq.form_processor.backends.couch.processor import FormProcessorCouch from corehq.apps.tzmigration.timezonemigration import json_diff rebuilt_case = FormProcessorCouch.hard_rebuild_case( self.domain, couch_case['_id'], None, save=False, lock=False ) rebuilt_case_json = rebuilt_case.to_json() diffs = json_diff(rebuilt_case_json, sql_case_json, track_list_indices=False) diffs = filter_case_diffs( rebuilt_case_json, sql_case_json, diffs, self.forms_that_touch_cases_without_actions ) return rebuilt_case_json, diffs
def _rebuild_couch_case_and_re_diff(self, couch_case, sql_case_json): from corehq.form_processor.backends.couch.processor import FormProcessorCouch from corehq.apps.tzmigration.timezonemigration import json_diff rebuilt_case = FormProcessorCouch.hard_rebuild_case( self.domain, couch_case['_id'], None, save=False, lock=False ) rebuilt_case_json = rebuilt_case.to_json() diffs = json_diff(rebuilt_case_json, sql_case_json, track_list_indices=False) diffs = filter_case_diffs( rebuilt_case_json, sql_case_json, diffs, self.forms_that_touch_cases_without_actions ) return rebuilt_case_json, diffs
def rebuild_couch_case_and_re_diff(couch_case, sql_case_json, statedb): assert couch_case["domain"] == sql_case_json["domain"], \ (couch_case["domain"], sql_case_json["domain"]) rebuilt_case = FormProcessorCouch.hard_rebuild_case(couch_case["domain"], couch_case['_id'], None, save=False, lock=False) rebuilt_case_json = rebuilt_case.to_json() diffs = json_diff(rebuilt_case_json, sql_case_json, track_list_indices=False) diffs = filter_case_diffs(rebuilt_case_json, sql_case_json, diffs, statedb) return rebuilt_case_json, diffs
def xml_to_form(domain, xml_meta, case_id, all_metas): form_id = xml_meta.parent_id with xml_meta.open() as fh: xml = fh.read() form_data = convert_xform_to_json(xml) form = FormProcessorCouch.new_xform(form_data) form.domain = domain form.received_on = get_received_on(case_id, form_id) for meta in all_metas: form.external_blobs[meta.name] = BlobMetaRef( key=meta.key, blobmeta_id=meta.id, content_type=meta.content_type, content_length=meta.content_length, ) return form
def test_get_case_with_lock(self, lock, wrap): case, case_lock = FormProcessorCouch.get_case_with_lock(self.case_id, lock, wrap) try: if lock: self.assertIsNotNone(case_lock) else: self.assertIsNone(case_lock) if wrap: self.assertEqual(len(case.actions), 2) else: self.assertEqual('actions' in case, True) self.assertIsInstance(case, CommCareCase if wrap else dict) finally: release_lock(case_lock, True)
def diff_case(sql_case, couch_case, dd_count): def diff(couch_json, sql_json): diffs = json_diff(couch_json, sql_json, track_list_indices=False) return filter_case_diffs(couch_json, sql_json, diffs, _diff_state) case_id = couch_case['_id'] sql_json = sql_case.to_json() dd_count("commcare.couchsqlmigration.case.diffed") diffs = check_domains(case_id, couch_case, sql_json) if diffs: dd_count("commcare.couchsqlmigration.case.has_diff") return couch_case, diffs diffs = diff(couch_case, sql_json) if diffs: domain = couch_case["domain"] try: with convert_rebuild_error(): couch_case = FormProcessorCouch.hard_rebuild_case( domain, case_id, None, save=False, lock=False ).to_json() dd_count("commcare.couchsqlmigration.case.rebuild.couch") diffs = diff(couch_case, sql_json) if diffs: if should_sort_sql_transactions(sql_case, couch_case): with convert_rebuild_error(): sql_case = rebuild_case_with_couch_action_order(sql_case) dd_count("commcare.couchsqlmigration.case.rebuild.sql.sort") diffs = diff(couch_case, sql_case.to_json()) elif not was_rebuilt(sql_case): with convert_rebuild_error(): sql_case = rebuild_case(sql_case) dd_count("commcare.couchsqlmigration.case.rebuild.sql") diffs = diff(couch_case, sql_case.to_json()) except RebuildError as err: dd_count("commcare.couchsqlmigration.case.rebuild.error") log.warning(f"Case {case_id} rebuild -> {err}") if diffs: dd_count("commcare.couchsqlmigration.case.has_diff") return couch_case, diffs
def hard_rebuild(couch_case): return FormProcessorCouch.hard_rebuild_case(couch_case["domain"], couch_case['_id'], None, save=False, lock=False).to_json()
cls.case = post_case_blocks([case.as_xml()], domain=cls.domain)[1][0] @classmethod def tearDownClass(cls): cls.case.delete() super(TestFormProcessorCouch, cls).tearDownClass() @generate_cases([ (True, True), (True, False), (False, True), (False, False), ], TestFormProcessorCouch) def test_get_case_with_lock(self, lock, wrap): case, case_lock = FormProcessorCouch.get_case_with_lock( self.case_id, lock, wrap) try: if lock: self.assertIsNotNone(case_lock) else: self.assertIsNone(case_lock) if wrap: self.assertEqual(len(case.actions), 2) else: self.assertEqual('actions' in case, True) self.assertIsInstance(case, CommCareCase if wrap else dict) finally: release_lock(case_lock, True)
cls.case.delete() super(TestFormProcessorCouch, cls).tearDownClass() @generate_cases([ (True, True, True), (True, True, False), (True, False, True), (True, False, False), (False, True, True), (False, True, False), (False, False, True), (False, False, False), ], TestFormProcessorCouch) def test_get_case_with_lock(self, lock, strip_history, wrap): case, case_lock = FormProcessorCouch.get_case_with_lock( self.case_id, lock, strip_history, wrap) try: if lock and not strip_history: self.assertIsNotNone(case_lock) else: self.assertIsNone(case_lock) if wrap: self.assertEqual(len(case.actions), 0 if strip_history else 2) else: self.assertEqual('actions' in case, False if strip_history else True) self.assertIsInstance(case, CommCareCase if wrap else dict) finally: