def handle(self, domain, **options): verbose = options["verbose"] or options["dryrun"] succeeded = [] failed = [] error_messages = defaultdict(lambda: 0) problem_ids = self._get_form_ids(domain) prefix = "Processing: " form_iterator = FormAccessors(domain).iter_forms(problem_ids) if not verbose: form_iterator = with_progress_bar(form_iterator, len(problem_ids), prefix=prefix, oneline=False) for form in form_iterator: if verbose: print("%s\t%s\t%s\t%s" % (form.form_id, form.received_on, form.xmlns, form.problem.strip())) if not options["dryrun"]: try: reprocess_xform_error(form) except Exception as e: raise failed.append(form.form_id) error_messages[str(e)] += 1 else: succeeded.append(form.form_id) if not options["dryrun"]: print("%s / %s forms successfully processed, %s failures" % (len(succeeded), len(succeeded) + len(failed), len(failed))) if error_messages: print("The following errors were seen: \n%s" % ("\n".join("%s: %s" % (v, k) for k, v in error_messages.items())))
def test_reprocess_xform_error(self): case_id = uuid.uuid4().hex parent_case_id = uuid.uuid4().hex case = CaseBlock( create=True, case_id=case_id, user_id='user1', owner_id='user1', case_type='demo', case_name='child', index={'parent': ('parent_type', parent_case_id)} ) post_case_blocks([case.as_xml()], domain=self.domain) form_accessors = FormAccessors(self.domain) error_forms = form_accessors.get_forms_by_type('XFormError', 10) self.assertEqual(1, len(error_forms)) form = error_forms[0] reprocess_xform_error(form) error_forms = form_accessors.get_forms_by_type('XFormError', 10) self.assertEqual(1, len(error_forms)) case = CaseBlock( create=True, case_id=parent_case_id, user_id='user1', owner_id='user1', case_type='parent_type', case_name='parent', ) post_case_blocks([case.as_xml()], domain=self.domain) reprocess_xform_error(form_accessors.get_form(form.form_id)) form = form_accessors.get_form(form.form_id) # self.assertTrue(form.initial_processing_complete) Can't change this with SQL forms at the moment self.assertTrue(form.is_normal) self.assertIsNone(form.problem) case = CaseAccessors(self.domain).get_case(case_id) self.assertEqual(1, len(case.indices)) self.assertEqual(case.indices[0].referenced_id, parent_case_id) self._validate_case(case)