def submit_unfinished_form(session_id, include_case_side_effects=False): """ Gets the raw instance of the session's form and submits it. This is used with sms and ivr surveys to save all questions answered so far in a session that needs to close. If include_case_side_effects is False, no case create / update / close actions will be performed, but the form will still be submitted. The form is only submitted if the smsforms session has not yet completed. """ session = SQLXFormsSession.by_session_id(session_id) if session is not None and session.end_time is None: # Get and clean the raw xml try: xml = get_raw_instance(session_id)['output'] except InvalidSessionIdException: session.end(completed=False) session.save() return root = XML(xml) case_tag_regex = re.compile( "^(\{.*\}){0,1}case$" ) # Use regex in order to search regardless of namespace meta_tag_regex = re.compile("^(\{.*\}){0,1}meta$") timeEnd_tag_regex = re.compile("^(\{.*\}){0,1}timeEnd$") current_timstamp = json_format_datetime(datetime.utcnow()) for child in root: if case_tag_regex.match(child.tag) is not None: # Found the case tag case_element = child case_element.set("date_modified", current_timstamp) if not include_case_side_effects: # Remove case actions (create, update, close) child_elements = [ case_action for case_action in case_element ] for case_action in child_elements: case_element.remove(case_action) elif meta_tag_regex.match(child.tag) is not None: # Found the meta tag, now set the value for timeEnd for meta_child in child: if timeEnd_tag_regex.match(meta_child.tag): meta_child.text = current_timstamp cleaned_xml = tostring(root) # Submit the xml and end the session process_sms_form_complete(session, cleaned_xml, completed=False)
def submit_unfinished_form(session_id, include_case_side_effects=False): """ Gets the raw instance of the session's form and submits it. This is used with sms and ivr surveys to save all questions answered so far in a session that needs to close. If include_case_side_effects is False, no case create / update / close actions will be performed, but the form will still be submitted. The form is only submitted if the smsforms session has not yet completed. """ session = SQLXFormsSession.by_session_id(session_id) if session is not None and session.end_time is None: # Get and clean the raw xml try: xml = get_raw_instance(session_id)["output"] except InvalidSessionIdException: session.end(completed=False) session.save() return root = XML(xml) case_tag_regex = re.compile("^(\{.*\}){0,1}case$") # Use regex in order to search regardless of namespace meta_tag_regex = re.compile("^(\{.*\}){0,1}meta$") timeEnd_tag_regex = re.compile("^(\{.*\}){0,1}timeEnd$") current_timstamp = json_format_datetime(datetime.utcnow()) for child in root: if case_tag_regex.match(child.tag) is not None: # Found the case tag case_element = child case_element.set("date_modified", current_timstamp) if not include_case_side_effects: # Remove case actions (create, update, close) child_elements = [case_action for case_action in case_element] for case_action in child_elements: case_element.remove(case_action) elif meta_tag_regex.match(child.tag) is not None: # Found the meta tag, now set the value for timeEnd for meta_child in child: if timeEnd_tag_regex.match(meta_child.tag): meta_child.text = current_timstamp cleaned_xml = tostring(root) # Submit the xml and end the session process_sms_form_complete(session, cleaned_xml, completed=False)
def handle_sms_form_complete(sender, session_id, form, **kwargs): from corehq.apps.smsforms.models import SQLXFormsSession session = SQLXFormsSession.by_session_id(session_id) if session: process_sms_form_complete(session, form, completed=True)
def handle_sms_form_complete(sender, session_id, form, **kwargs): from corehq.apps.smsforms.models import SQLXFormsSession session = SQLXFormsSession.by_session_id(session_id) if session: process_sms_form_complete(session, form)