def test_get_extension_to_close_child_host(self): """should still return extension chain if outgoing index is a child index""" created_cases = self._create_host_is_subcase_chain() # host open, should be empty no_cases = get_all_extensions_to_close(self.domain, [created_cases[-1]]) self.assertEqual(set(), no_cases) # close parent, shouldn't get extensions # don't actually close the cases otherwise they will get excluded created_cases[-1].closed = True no_cases = get_all_extensions_to_close(self.domain, [created_cases[-1]]) self.assertEqual(set(), no_cases) # close host that is also a child created_cases[-2].closed = True full_chain = get_all_extensions_to_close(self.domain, [created_cases[-2]]) self.assertEqual(set(self.extension_ids[0:2]), full_chain)
def test_get_extension_to_close(self): """should return empty if case is not a host, otherwise should return full chain""" created_cases = self._create_extension_chain() # host open, should be empty no_cases = get_all_extensions_to_close(self.domain, [created_cases[-1]]) self.assertEqual(set(), no_cases) # don't actually close the cases otherwise they will get excluded created_cases[-1].closed = True # top level host closed, should get full chain full_chain = get_all_extensions_to_close(self.domain, [created_cases[-1]]) self.assertEqual(set(self.extension_ids), full_chain) # extension (also a host), should get it's chain created_cases[2].closed = True no_cases = get_all_extensions_to_close(self.domain, [created_cases[2]]) self.assertEqual(set(self.extension_ids[1:3]), no_cases)
def _get_case_and_ledger_updates(domain, sql_form): """ Get a CaseStockProcessingResult with the appropriate cases and ledgers to be saved. See SubmissionPost.process_xforms_for_cases and methods it calls for the equivalent section of the form-processing code. """ from corehq.apps.commtrack.processing import process_stock interface = FormProcessorInterface(domain) assert sql_form.domain xforms = [sql_form] with interface.casedb_cache( domain=domain, lock=False, deleted_ok=True, xforms=xforms, load_src="couchsqlmigration", ) as case_db: touched_cases = FormProcessorInterface(domain).get_cases_from_forms( case_db, xforms) extensions_to_close = get_all_extensions_to_close( domain, list(touched_cases.values())) case_result = CaseProcessingResult( domain, [update.case for update in touched_cases.values()], [], # ignore dirtiness_flags, extensions_to_close) for case in case_result.cases: case_db.post_process_case(case, sql_form) case_db.mark_changed(case) cases = case_result.cases try: stock_result = process_stock(xforms, case_db) cases = case_db.get_cases_for_saving(sql_form.received_on) stock_result.populate_models() except MissingFormXml: stock_result = None return CaseStockProcessingResult( case_result=case_result, case_models=cases, stock_result=stock_result, )
def _get_case_and_ledger_updates(domain, sql_form): """ Get a CaseStockProcessingResult with the appropriate cases and ledgers to be saved. See SubmissionPost.process_xforms_for_cases and methods it calls for the equivalent section of the form-processing code. """ from casexml.apps.case.xform import get_and_check_xform_domain from corehq.apps.commtrack.processing import process_stock interface = FormProcessorInterface(domain) get_and_check_xform_domain(sql_form) xforms = [sql_form] # todo: I think this can be changed to lock=False with interface.casedb_cache(domain=domain, lock=True, deleted_ok=True, xforms=xforms) as case_db: touched_cases = FormProcessorInterface(domain).get_cases_from_forms( case_db, xforms) extensions_to_close = get_all_extensions_to_close( domain, touched_cases.values()) case_result = CaseProcessingResult( domain, [update.case for update in touched_cases.values()], [], # ignore dirtiness_flags, extensions_to_close) # todo: is this necessary? for case in case_result.cases: case_db.mark_changed(case) stock_result = process_stock(xforms, case_db) cases = case_db.get_cases_for_saving(sql_form.received_on) stock_result.populate_models() return CaseStockProcessingResult( case_result=case_result, case_models=cases, stock_result=stock_result, )
def _get_case_and_ledger_updates(domain, sql_form): """ Get a CaseStockProcessingResult with the appropriate cases and ledgers to be saved. See SubmissionPost.process_xforms_for_cases and methods it calls for the equivalent section of the form-processing code. """ from corehq.apps.commtrack.processing import process_stock interface = FormProcessorInterface(domain) assert sql_form.domain xforms = [sql_form] with interface.casedb_cache( domain=domain, lock=False, deleted_ok=True, xforms=xforms, load_src="couchsqlmigration", ) as case_db: touched_cases = FormProcessorInterface(domain).get_cases_from_forms(case_db, xforms) extensions_to_close = get_all_extensions_to_close(domain, list(touched_cases.values())) case_result = CaseProcessingResult( domain, [update.case for update in touched_cases.values()], [], # ignore dirtiness_flags, extensions_to_close ) for case in case_result.cases: case_db.post_process_case(case, sql_form) case_db.mark_changed(case) stock_result = process_stock(xforms, case_db) cases = case_db.get_cases_for_saving(sql_form.received_on) stock_result.populate_models() return CaseStockProcessingResult( case_result=case_result, case_models=cases, stock_result=stock_result, )