def _get_new_form_json(xml, xform_id): form_json = convert_xform_to_json(xml) with force_phone_timezones_should_be_processed(): adjust_datetimes(form_json) # this is actually in-place because of how jsonobject works scrub_meta(XFormInstance.wrap({'form': form_json, '_id': xform_id})) return form_json
def _migrate_form_and_associated_models(self, couch_form, form_is_processed=True): """ Copies `couch_form` into a new sql form """ if form_is_processed: form_data = couch_form.form with force_phone_timezones_should_be_processed(): adjust_datetimes(form_data) xmlns = form_data.get("@xmlns", "") user_id = extract_meta_user_id(form_data) else: xmlns = couch_form.xmlns user_id = couch_form.user_id sql_form = XFormInstanceSQL( form_id=couch_form.form_id, domain=self.domain, xmlns=xmlns, user_id=user_id, ) _copy_form_properties(sql_form, couch_form) _migrate_form_attachments(sql_form, couch_form) _migrate_form_operations(sql_form, couch_form) if couch_form.doc_type != 'SubmissionErrorLog': self._save_diffs(couch_form, sql_form) case_stock_result = self._get_case_stock_result( sql_form, couch_form) if form_is_processed else None _save_migrated_models(sql_form, case_stock_result)
def _migrate_form_and_associated_models(self, couch_form, form_is_processed=True): """ Copies `couch_form` into a new sql form """ sql_form = None try: if form_is_processed: form_data = couch_form.form with force_phone_timezones_should_be_processed(): adjust_datetimes(form_data) xmlns = form_data.get("@xmlns", "") user_id = extract_meta_user_id(form_data) else: xmlns = couch_form.xmlns user_id = couch_form.user_id if xmlns == SYSTEM_ACTION_XMLNS: for form_id, case_ids in do_system_action(couch_form): self.case_diff_queue.update(case_ids, form_id) sql_form = XFormInstanceSQL( form_id=couch_form.form_id, domain=self.domain, xmlns=xmlns, user_id=user_id, ) _copy_form_properties(sql_form, couch_form) _migrate_form_attachments(sql_form, couch_form) _migrate_form_operations(sql_form, couch_form) case_stock_result = (self._get_case_stock_result( sql_form, couch_form) if form_is_processed else None) _save_migrated_models(sql_form, case_stock_result) except IntegrityError as err: exc_info = sys.exc_info() try: sql_form = FormAccessorSQL.get_form(couch_form.form_id) except XFormNotFound: proc = "" if form_is_processed else " unprocessed" log.error("Error migrating%s form %s", proc, couch_form.form_id, exc_info=exc_info) if self.stop_on_error: raise err from None except Exception as err: proc = "" if form_is_processed else " unprocessed" log.exception("Error migrating%s form %s", proc, couch_form.form_id) try: sql_form = FormAccessorSQL.get_form(couch_form.form_id) except XFormNotFound: pass if self.stop_on_error: raise err from None finally: if couch_form.doc_type != 'SubmissionErrorLog': self._save_diffs(couch_form, sql_form)
def form_data(self): from couchforms import XMLSyntaxError from .utils import convert_xform_to_json, adjust_datetimes from corehq.form_processor.utils.metadata import scrub_form_meta xml = self.get_xml() try: form_json = convert_xform_to_json(xml) except XMLSyntaxError: return {} # we can assume all sql domains are new timezone domains with force_phone_timezones_should_be_processed(): adjust_datetimes(form_json) scrub_form_meta(self.form_id, form_json) return form_json
def _migrate_form(domain, couch_form): """ This copies the couch form into a new sql form but does not save it. See form_processor.parsers.form._create_new_xform and SubmissionPost._set_submission_properties for what this should do. """ interface = FormProcessorInterface(domain) form_data = couch_form.form with force_phone_timezones_should_be_processed(): adjust_datetimes(form_data) sql_form = interface.new_xform(form_data) sql_form.form_id = couch_form.form_id # some legacy forms don't have ID's so are assigned random ones if sql_form.xmlns is None: sql_form.xmlns = '' return _copy_form_properties(domain, sql_form, couch_form)