From c09ad237b61fa74200dcb8fbe8bf91e62949dddd Mon Sep 17 00:00:00 2001 From: Hlamalani Date: Wed, 26 Jul 2023 17:29:20 +0200 Subject: [PATCH 1/5] survey key words --- yal/endline_terms_and_conditions.py | 1 + yal/main.py | 17 ++++++++--- yal/tests/surveys/test_endline.py | 46 +++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/yal/endline_terms_and_conditions.py b/yal/endline_terms_and_conditions.py index f87fad3b..95b114bc 100644 --- a/yal/endline_terms_and_conditions.py +++ b/yal/endline_terms_and_conditions.py @@ -15,6 +15,7 @@ class Application(BaseApplication): START_STATE = "state_start_terms" + NO_STATE = "state_no_consent" async def state_start_terms(self): question = self._( diff --git a/yal/main.py b/yal/main.py index 52b895b1..f0412c1d 100644 --- a/yal/main.py +++ b/yal/main.py @@ -84,7 +84,7 @@ QA_RESET_FEEDBACK_TIMESTAMP_KEYWORDS = {"resetfeedbacktimestampobzvmp"} EMERGENCY_KEYWORDS = utils.get_keywords("emergency") AAQ_KEYWORDS = {"ask a question"} -EJAF_ENDLINE_SURVEY_KEYWORDS = {"answer", "yes i want to answer"} +EJAF_ENDLINE_SURVEY_KEYWORDS = {"answer", "yes i want to answer", "remind me tomorrow", "i m not interested"} class Application( @@ -180,7 +180,7 @@ async def process_message(self, message): if self.user.metadata.get("onboarding_reminder_sent"): self.user.session_id = None self.state_name = OnboardingApplication.REMINDER_STATE - + if keyword in ASSESSMENT_REENGAGEMENT_KEYWORDS: if self.user.metadata.get("assessment_reminder_sent"): self.user.session_id = None @@ -190,6 +190,7 @@ async def process_message(self, message): self.user.session_id = None self.state_name = "state_baseline_start" + baseline_survey_completed = self.user.metadata.get( "baseline_survey_completed" ) @@ -201,8 +202,16 @@ async def process_message(self, message): and baseline_survey_completed and not endline_survey_completed ): - self.user.session_id = None - self.state_name = EndlineTermsApplication.START_STATE + if keyword == "remind me tomorrow": + self.user.session_id = None + self.state_name = AssessmentApplication.REMINDER_STATE + if keyword == "i m not interested": + self.user.session_id = None + self.state_name = EndlineTermsApplication.NO_STATE + else: + self.user.session_id = None + self.state_name = EndlineTermsApplication.START_STATE + # Fields that RapidPro sets after a feedback push message feedback_state = await self.get_feedback_state() if feedback_state: diff --git a/yal/tests/surveys/test_endline.py b/yal/tests/surveys/test_endline.py index d5d339c0..3ddb885a 100644 --- a/yal/tests/surveys/test_endline.py +++ b/yal/tests/surveys/test_endline.py @@ -92,6 +92,52 @@ async def test_endline_invitation_i_want_to_answer(tester: AppTester, rapidpro_m assert user.state.name == "state_start_terms" +@pytest.mark.asyncio +async def test_endline_invitation_remind_me_tomorrow( + tester: AppTester, rapidpro_mock, +): + user = User( + addr="278201234567", + state=StateData(), + session_id=1, + metadata={"baseline_survey_completed": True}, + ) + app = Application(user) + msg = Message( + content="Remind me tomorrow", + to_addr="27820001002", + from_addr="27820001003", + transport_name="whatsapp", + transport_type=Message.TRANSPORT_TYPE.HTTP_API, + ) + + [reply] = await app.process_message(msg) + + assert user.state.name == "state_handle_assessment_reminder_response" + +@pytest.mark.asyncio +async def test_endline_invitation_not_interested( + tester: AppTester, rapidpro_mock, +): + user = User( + addr="278201234567", + state=StateData(), + session_id=1, + metadata={"baseline_survey_completed": True}, + ) + app = Application(user) + msg = Message( + content="I'm not interested", + to_addr="27820001002", + from_addr="27820001003", + transport_name="whatsapp", + transport_type=Message.TRANSPORT_TYPE.HTTP_API, + ) + + [reply] = await app.process_message(msg) + + assert user.state.name == "state_no_consent" + @pytest.mark.asyncio async def test_endline_invitation_answer(tester: AppTester, rapidpro_mock): From 6557030948c636fab1c61de532cccb9a1c7f5a11 Mon Sep 17 00:00:00 2001 From: Hlamalani Date: Thu, 27 Jul 2023 12:28:54 +0200 Subject: [PATCH 2/5] survey start --- yal/main.py | 9 ++++++++- yal/tests/surveys/test_endline.py | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/yal/main.py b/yal/main.py index f0412c1d..b4ca42eb 100644 --- a/yal/main.py +++ b/yal/main.py @@ -197,15 +197,22 @@ async def process_message(self, message): endline_survey_completed = self.user.metadata.get( "endline_survey_completed" ) + + # self.save_metadata("survey_name", "baseline_survey") + if ( keyword in EJAF_ENDLINE_SURVEY_KEYWORDS and baseline_survey_completed and not endline_survey_completed ): + # self.save_metadata("survey_name", "endline_survey") + # self.save_metadata("assessment_reminder_sent", False) + # self.save_metadata("assessment_reminder_name", "Not set") + if keyword == "remind me tomorrow": self.user.session_id = None self.state_name = AssessmentApplication.REMINDER_STATE - if keyword == "i m not interested": + elif keyword == "i m not interested": self.user.session_id = None self.state_name = EndlineTermsApplication.NO_STATE else: diff --git a/yal/tests/surveys/test_endline.py b/yal/tests/surveys/test_endline.py index 3ddb885a..57d2d7c2 100644 --- a/yal/tests/surveys/test_endline.py +++ b/yal/tests/surveys/test_endline.py @@ -113,7 +113,7 @@ async def test_endline_invitation_remind_me_tomorrow( [reply] = await app.process_message(msg) - assert user.state.name == "state_handle_assessment_reminder_response" + assert user.state.name == "state_remind_tomorrow" @pytest.mark.asyncio async def test_endline_invitation_not_interested( From f5b561a9f7dd0db3139397b223138981a89f8fad Mon Sep 17 00:00:00 2001 From: Hlamalani Date: Thu, 27 Jul 2023 15:22:45 +0200 Subject: [PATCH 3/5] survey start --- yal/endline_terms_and_conditions.py | 8 +++----- yal/main.py | 8 +++----- yal/tests/test_endline_terms_and_condition.py | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/yal/endline_terms_and_conditions.py b/yal/endline_terms_and_conditions.py index c90ab5bf..67efc0a0 100644 --- a/yal/endline_terms_and_conditions.py +++ b/yal/endline_terms_and_conditions.py @@ -221,7 +221,7 @@ async def state_set_reminder_timer(self): question = self._( "\n".join( [ - "[persona_emoji] No worries, we get it!", + "No worries, we get it!", "", "I'll send you a reminder message in 30 mins, so you can come back " "and answer these questions.", @@ -231,12 +231,10 @@ async def state_set_reminder_timer(self): ) ) - return WhatsAppButtonState( + return FreeText( self, question=question, - choices=[Choice("menu", "Go to main menu")], - error=get_generic_error(), - next="state_pre_mainmenu", + next=None, ) async def state_submit_terms_and_conditions_endline(self): diff --git a/yal/main.py b/yal/main.py index b4ca42eb..89acfe6a 100644 --- a/yal/main.py +++ b/yal/main.py @@ -198,16 +198,14 @@ async def process_message(self, message): "endline_survey_completed" ) - # self.save_metadata("survey_name", "baseline_survey") - if ( keyword in EJAF_ENDLINE_SURVEY_KEYWORDS and baseline_survey_completed and not endline_survey_completed ): - # self.save_metadata("survey_name", "endline_survey") - # self.save_metadata("assessment_reminder_sent", False) - # self.save_metadata("assessment_reminder_name", "Not set") + self.save_metadata("assessment_reminder_sent", False) + self.save_metadata("assessment_reminder_name", "") + if keyword == "remind me tomorrow": self.user.session_id = None diff --git a/yal/tests/test_endline_terms_and_condition.py b/yal/tests/test_endline_terms_and_condition.py index cadfa630..ac7b3e0b 100644 --- a/yal/tests/test_endline_terms_and_condition.py +++ b/yal/tests/test_endline_terms_and_condition.py @@ -96,7 +96,7 @@ async def test_state_accept_consent_reminder(tester: AppTester, rapidpro_mock): message = "\n".join( [ - "🤖 No worries, we get it!", + "No worries, we get it!", "", "I'll send you a reminder message in 30 mins, so you can come back" " and answer these questions.", From cb674566626b9e9aed68e5cd325f345d720d30ef Mon Sep 17 00:00:00 2001 From: Hlamalani Date: Thu, 27 Jul 2023 15:25:35 +0200 Subject: [PATCH 4/5] survey start --- yal/main.py | 11 +++++++---- yal/tests/surveys/test_endline.py | 8 ++++++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/yal/main.py b/yal/main.py index 89acfe6a..eb6ca6b9 100644 --- a/yal/main.py +++ b/yal/main.py @@ -84,7 +84,12 @@ QA_RESET_FEEDBACK_TIMESTAMP_KEYWORDS = {"resetfeedbacktimestampobzvmp"} EMERGENCY_KEYWORDS = utils.get_keywords("emergency") AAQ_KEYWORDS = {"ask a question"} -EJAF_ENDLINE_SURVEY_KEYWORDS = {"answer", "yes i want to answer", "remind me tomorrow", "i m not interested"} +EJAF_ENDLINE_SURVEY_KEYWORDS = { + "answer", + "yes i want to answer", + "remind me tomorrow", + "i m not interested", +} class Application( @@ -180,7 +185,7 @@ async def process_message(self, message): if self.user.metadata.get("onboarding_reminder_sent"): self.user.session_id = None self.state_name = OnboardingApplication.REMINDER_STATE - + if keyword in ASSESSMENT_REENGAGEMENT_KEYWORDS: if self.user.metadata.get("assessment_reminder_sent"): self.user.session_id = None @@ -190,7 +195,6 @@ async def process_message(self, message): self.user.session_id = None self.state_name = "state_baseline_start" - baseline_survey_completed = self.user.metadata.get( "baseline_survey_completed" ) @@ -206,7 +210,6 @@ async def process_message(self, message): self.save_metadata("assessment_reminder_sent", False) self.save_metadata("assessment_reminder_name", "") - if keyword == "remind me tomorrow": self.user.session_id = None self.state_name = AssessmentApplication.REMINDER_STATE diff --git a/yal/tests/surveys/test_endline.py b/yal/tests/surveys/test_endline.py index 57d2d7c2..58e7c6a2 100644 --- a/yal/tests/surveys/test_endline.py +++ b/yal/tests/surveys/test_endline.py @@ -92,9 +92,11 @@ async def test_endline_invitation_i_want_to_answer(tester: AppTester, rapidpro_m assert user.state.name == "state_start_terms" + @pytest.mark.asyncio async def test_endline_invitation_remind_me_tomorrow( - tester: AppTester, rapidpro_mock, + tester: AppTester, + rapidpro_mock, ): user = User( addr="278201234567", @@ -115,9 +117,11 @@ async def test_endline_invitation_remind_me_tomorrow( assert user.state.name == "state_remind_tomorrow" + @pytest.mark.asyncio async def test_endline_invitation_not_interested( - tester: AppTester, rapidpro_mock, + tester: AppTester, + rapidpro_mock, ): user = User( addr="278201234567", From 91876cd3547b73f36a97c4fe65c64e162d7bf734 Mon Sep 17 00:00:00 2001 From: Hlamalani Date: Thu, 27 Jul 2023 15:36:50 +0200 Subject: [PATCH 5/5] survey start --- yal/endline_terms_and_conditions.py | 2 +- yal/main.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/yal/endline_terms_and_conditions.py b/yal/endline_terms_and_conditions.py index 67efc0a0..94c0010c 100644 --- a/yal/endline_terms_and_conditions.py +++ b/yal/endline_terms_and_conditions.py @@ -15,7 +15,7 @@ class Application(BaseApplication): START_STATE = "state_start_terms" - NO_STATE = "state_no_consent" + NO_CONSENT_STATE = "state_no_consent" async def state_start_terms(self): question = self._( diff --git a/yal/main.py b/yal/main.py index eb6ca6b9..b8d06de5 100644 --- a/yal/main.py +++ b/yal/main.py @@ -215,7 +215,7 @@ async def process_message(self, message): self.state_name = AssessmentApplication.REMINDER_STATE elif keyword == "i m not interested": self.user.session_id = None - self.state_name = EndlineTermsApplication.NO_STATE + self.state_name = EndlineTermsApplication.NO_CONSENT_STATE else: self.user.session_id = None self.state_name = EndlineTermsApplication.START_STATE