def _submit_data(user): answer_store = get_answer_store(user) if answer_store: questionnaire_store = get_questionnaire_store(user.user_id, user.user_ik) answer_store = questionnaire_store.answer_store metadata = questionnaire_store.metadata response_metadata = questionnaire_store.response_metadata progress_store = questionnaire_store.progress_store list_store = questionnaire_store.list_store submitted_at = datetime.now(timezone.utc) schema = load_schema_from_metadata(metadata) router = Router( schema, answer_store, list_store, progress_store, metadata, response_metadata, ) full_routing_path = router.full_routing_path() message = json_dumps( convert_answers( schema, questionnaire_store, full_routing_path, submitted_at, flushed=True, )) encrypted_message = encrypt(message, current_app.eq["key_store"], KEY_PURPOSE_SUBMISSION) sent = current_app.eq["submitter"].send_message( encrypted_message, tx_id=metadata.get("tx_id"), case_id=metadata["case_id"], ) if not sent: raise SubmissionFailedException() get_questionnaire_store(user.user_id, user.user_ik).delete() logger.info("successfully flushed answers") return True logger.info("no answers found to flush") return False
def test_full_routing_path_with_repeating_sections(self): schema = load_schema_from_name( "test_repeating_sections_with_hub_and_spoke") list_store = ListStore([{ "items": ["abc123", "123abc"], "name": "people", "primary_person": "abc123", }]) router = Router(schema, self.answer_store, list_store, self.progress_store, self.metadata) routing_path = router.full_routing_path() expected_path = [ RoutingPath( [ "primary-person-list-collector", "list-collector", "next-interstitial", "another-list-collector-block", "visitors-block", ], section_id="section", list_name=None, list_item_id=None, ), RoutingPath( [ "proxy", "date-of-birth", "confirm-dob", "sex", "personal-summary" ], section_id="personal-details-section", list_name="people", list_item_id="abc123", ), RoutingPath( [ "proxy", "date-of-birth", "confirm-dob", "sex", "personal-summary" ], section_id="personal-details-section", list_name="people", list_item_id="123abc", ), ] self.assertEqual(routing_path, expected_path)
def dump_routing(schema, questionnaire_store): router = Router( schema, questionnaire_store.answer_store, questionnaire_store.list_store, questionnaire_store.progress_store, questionnaire_store.metadata, ) response = [{ "section_id": routing_path.section_id, "list_item_id": routing_path.list_item_id, "routing_path": routing_path.block_ids, } for routing_path in router.full_routing_path()] return json_dumps(response), 200
def dump_submission(schema, questionnaire_store): router = Router( schema, questionnaire_store.answer_store, questionnaire_store.list_store, questionnaire_store.progress_store, questionnaire_store.metadata, ) routing_path = router.full_routing_path() questionnaire_store = get_questionnaire_store( current_user.user_id, current_user.user_ik ) response = { "submission": convert_answers(schema, questionnaire_store, routing_path) } return json.dumps(response, for_json=True), 200
def post_questionnaire(schema, questionnaire_store): if any(action in request.form for action in ("action[save_sign_out]", "action[sign_out]")): return redirect(url_for("session.get_sign_out")) router = Router( schema, questionnaire_store.answer_store, questionnaire_store.list_store, questionnaire_store.progress_store, questionnaire_store.metadata, ) if schema.is_hub_enabled() and router.is_survey_complete(): return submit_answers(schema, questionnaire_store, router.full_routing_path()) return redirect(router.get_first_incomplete_location_in_survey().url())
def dump_submission(schema, questionnaire_store): router = Router( schema, questionnaire_store.answer_store, questionnaire_store.list_store, questionnaire_store.progress_store, questionnaire_store.metadata, ) routing_path = router.full_routing_path() questionnaire_store = get_questionnaire_store(current_user.user_id, current_user.user_ik) submission_handler = SubmissionHandler(schema, questionnaire_store, routing_path) response = {"submission": submission_handler.get_payload()} return json_dumps(response), 200
def get_questionnaire(schema, questionnaire_store): router = Router( schema, questionnaire_store.answer_store, questionnaire_store.list_store, questionnaire_store.progress_store, questionnaire_store.metadata, questionnaire_store.response_metadata, ) if not router.can_access_hub(): redirect_location_url = ( router.get_first_incomplete_location_in_questionnaire_url() ) return redirect(redirect_location_url) if request.method == "POST": if router.is_questionnaire_complete: submission_handler = SubmissionHandler( schema, questionnaire_store, router.full_routing_path() ) submission_handler.submit_questionnaire() return redirect(url_for("post_submission.get_thank_you")) return redirect(router.get_first_incomplete_location_in_questionnaire_url()) hub_context = HubContext( language=flask_babel.get_locale().language, schema=schema, answer_store=questionnaire_store.answer_store, list_store=questionnaire_store.list_store, progress_store=questionnaire_store.progress_store, metadata=questionnaire_store.metadata, response_metadata=questionnaire_store.response_metadata, ) context = hub_context( survey_complete=router.is_questionnaire_complete, enabled_section_ids=router.enabled_section_ids, ) return render_template( "hub", content=context, page_title=context["title"], )
def test_full_routing_path_without_repeating_sections(self): schema = load_schema_from_name("test_checkbox") router = Router( schema, self.answer_store, self.list_store, self.progress_store, self.metadata, ) routing_path = router.full_routing_path() expected_path = [ RoutingPath( ["mandatory-checkbox", "non-mandatory-checkbox", "summary"], section_id="default-section", ) ] self.assertEqual(routing_path, expected_path)
def get_questionnaire(schema, questionnaire_store): router = Router( schema, questionnaire_store.answer_store, questionnaire_store.list_store, questionnaire_store.progress_store, questionnaire_store.metadata, ) if not router.can_access_hub(): redirect_location_url = router.get_first_incomplete_location_in_survey_url( ) return redirect(redirect_location_url) if request.method == "POST": if router.is_survey_complete(): submission_handler = SubmissionHandler(schema, questionnaire_store, router.full_routing_path()) submission_handler.submit_questionnaire() return redirect(url_for("post_submission.get_thank_you")) return redirect(router.get_first_incomplete_location_in_survey_url()) language_code = get_session_store().session_data.language_code hub = HubContext( language=language_code, schema=schema, answer_store=questionnaire_store.answer_store, list_store=questionnaire_store.list_store, progress_store=questionnaire_store.progress_store, metadata=questionnaire_store.metadata, ) hub_context = hub.get_context(router.is_survey_complete(), router.enabled_section_ids) return render_template("hub", content=hub_context, page_title=hub_context["title"])