def tag_forms_as_deleted_rebuild_associated_cases(user_id, domain, form_id_list, deletion_id, deletion_date, deleted_cases=None): """ Upon user deletion, mark associated forms as deleted and prep cases for a rebuild. - 2 saves/sec for cloudant slowness (rate_limit) """ deleted_cases = deleted_cases or set() cases_to_rebuild = set() for form in FormAccessors(domain).iter_forms(form_id_list): if form.domain != domain or not form.is_normal: continue # rebuild all cases anyways since we don't know if this has run or not if the task was killed cases_to_rebuild.update(get_case_ids_from_form(form)) # do this after getting case_id's since iter_forms won't return deleted forms FormAccessors(domain).soft_delete_forms(list(form_id_list), deletion_date, deletion_id) detail = UserArchivedRebuild(user_id=user_id) for case_id in cases_to_rebuild - deleted_cases: _rebuild_case_with_retries.delay(domain, case_id, detail)
def test_multiple_case_blocks_all_rebuilt(self, rebuild_case): """ Rebuild all cases in forms with multiple case blocks """ case_ids = [uuid.uuid4().hex, uuid.uuid4().hex, uuid.uuid4().hex] caseblocks = [ CaseBlock( create=True, case_id=case_id, owner_id=self.commcare_user._id, user_id=self.commcare_user._id, ) for case_id in case_ids ] casexmls = [ ElementTree.tostring(caseblock.as_xml()) for caseblock in caseblocks ] submit_case_blocks(casexmls, self.domain, user_id=self.other_user._id) self.other_user.retire() detail = UserArchivedRebuild(user_id=self.other_user.user_id) expected_call_args = [ mock.call(self.domain, case_id, detail) for case_id in case_ids ] self.assertEqual(rebuild_case.call_count, len(case_ids)) self.assertItemsEqual(rebuild_case.call_args_list, expected_call_args)
def test_multiple_case_blocks_some_deleted(self, rebuild_case): """ Don't rebuild deleted cases """ case_ids = [uuid.uuid4().hex, uuid.uuid4().hex, uuid.uuid4().hex] for i, case_id in enumerate(case_ids): if i == 0: # only the first case is owned by the user getting retired owner_id = self.other_user._id else: owner_id = self.commcare_user._id caseblock = CaseBlock( create=True, case_id=case_id, owner_id=owner_id, user_id=self.commcare_user._id, ) submit_case_blocks(caseblock.as_string(), self.domain, user_id=self.other_user._id) self.other_user.retire() detail = UserArchivedRebuild(user_id=self.other_user.user_id) expected_call_args = [ mock.call(self.domain, case_id, detail) for case_id in case_ids[1:] ] self.assertEqual(rebuild_case.call_count, len(case_ids) - 1) self.assertItemsEqual(rebuild_case.call_args_list, expected_call_args)
def test_rebuild_cases_with_new_owner(self, rebuild_case): """ If cases have a different owner to the person who submitted it rebuild it when the submitter is retired. """ case_id = uuid.uuid4().hex caseblock = CaseBlock( create=True, case_id=case_id, owner_id=self.commcare_user._id, user_id=self.commcare_user._id, ) casexml = ElementTree.tostring(caseblock.as_xml()) submit_case_blocks(casexml, self.domain, user_id=self.other_user._id) self.other_user.retire() detail = UserArchivedRebuild(user_id=self.other_user.user_id) rebuild_case.assert_called_once_with(self.domain, case_id, detail)