def handle_event(self, event, handler_config): """ Expects the event 'content' to be a dict with the following keys and values: NOTE: perhaps all we need here is the message_id and lookup the rest of the required data from the message in the message store :param from_addr: the from_addr of the user interaction that triggered the event :param message_id: the id of the message that triggered the event, used to keep an audit trail of opt-outs and which messages they were triggered by. :param transport_type: the transport_type that the message was received on. """ account_key = event.payload['account_key'] oo_store = OptOutStore(self.vumi_api.manager, account_key) event_data = event.payload['content'] from_addr = event_data['from_addr'] message_id = event_data['message_id'] transport_type = event_data.get('transport_type') if transport_type != 'ussd': log.info("SNAUSSDOptOutHandler skipping non-ussd" " message for %r" % (from_addr,)) return contact = yield self.find_contact(account_key, from_addr) if contact: opted_out = contact.extra['opted_out'] if opted_out is not None and opted_out.isdigit(): if int(opted_out) > 1: yield oo_store.new_opt_out('msisdn', from_addr, { 'message_id': message_id, }) else: yield oo_store.delete_opt_out('msisdn', from_addr)
def consume_user_message(self, message): msg_mdh = self.get_metadata_helper(message) if not msg_mdh.has_user_account(): # We don't have an account to opt out of. # Since this can only happen for redirected messages, assume we # aren't dealing with an API. yield self.reply_to( message, "Your opt-out was received but we failed to link it " "to a specific service, please try again later.") return account_key = yield msg_mdh.get_account_key() opt_out_store = OptOutStore(self.manager, account_key) from_addr = message.get("from_addr") # Note: for now we are hardcoding addr_type as 'msisdn' # as only msisdn's are opting out currently yield opt_out_store.new_opt_out("msisdn", from_addr, message) if message.get('transport_type') == 'http_api': yield self.reply_to( message, '{"msisdn":"%s","opted_in": false}' % (from_addr, )) else: yield self.reply_to(message, "You have opted out")
def consume_user_message(self, message): msg_mdh = self.get_metadata_helper(message) if not msg_mdh.has_user_account(): # We don't have an account to opt out of. # Since this can only happen for redirected messages, assume we # aren't dealing with an API. yield self.reply_to( message, "Your opt-out was received but we failed to link it " "to a specific service, please try again later.") return account_key = yield msg_mdh.get_account_key() opt_out_store = OptOutStore(self.manager, account_key) from_addr = message.get("from_addr") # Note: for now we are hardcoding addr_type as 'msisdn' # as only msisdn's are opting out currently yield opt_out_store.new_opt_out("msisdn", from_addr, message) if message.get('transport_type') == 'http_api': yield self.reply_to( message, '{"msisdn":"%s","opted_in": false}' % (from_addr,)) else: yield self.reply_to(message, "You have opted out")
class TestUSSDOptOutHandler(VumiTestCase): @inlineCallbacks def setUp(self): self.eh_helper = self.add_helper(EventHandlerHelper()) yield self.eh_helper.setup_event_dispatcher( 'sisi_ni_amani', USSDOptOutHandler, { 'poll_manager_prefix': 'vumigo.', }) vumi_api = self.eh_helper.vumi_helper.get_vumi_api() user_helper = yield self.eh_helper.vumi_helper.get_or_create_user() self.contact_store = user_helper.user_api.contact_store self.oo_store = OptOutStore(vumi_api.manager, user_helper.account_key) self.pm = PollManager(vumi_api.redis, 'vumigo.') self.add_cleanup(self.pm.stop) self.eh_helper.track_event('survey_completed', 'sisi_ni_amani') @inlineCallbacks def test_opt_in(self): msisdn = u'+2345' message_id = u'message-id' event = self.eh_helper.make_event('survey_completed', { 'from_addr': msisdn, 'message_id': message_id, 'transport_type': 'ussd', }) yield self.oo_store.new_opt_out('msisdn', msisdn, { 'message_id': message_id}) contact = yield self.contact_store.new_contact(msisdn=msisdn) contact.extra['opted_out'] = u'1' yield contact.save() [opt_out] = yield self.oo_store.list_opt_outs() self.assertTrue(opt_out) yield self.eh_helper.dispatch_event(event) opt_outs = yield self.oo_store.list_opt_outs() self.assertEqual(opt_outs, []) @inlineCallbacks def test_opt_out(self): msisdn = u'+2345' message_id = u'message-id' event = self.eh_helper.make_event('survey_completed', { 'from_addr': msisdn, 'message_id': message_id, 'transport_type': 'ussd', }) contact = yield self.contact_store.new_contact(msisdn=msisdn) contact.extra['opted_out'] = u'2' yield contact.save() opt_outs = yield self.oo_store.list_opt_outs() self.assertEqual(opt_outs, []) yield self.eh_helper.dispatch_event(event) [opt_out] = yield self.oo_store.list_opt_outs() self.assertTrue(opt_out) @inlineCallbacks def test_opt_out_for_empty_outed_out_value(self): msisdn = u'+2345' message_id = u'message-id' event = self.eh_helper.make_event('survey_completed', { 'from_addr': msisdn, 'message_id': message_id, 'transport_type': 'ussd', }) contact = yield self.contact_store.new_contact(msisdn=msisdn) contact.extra['opted_out'] = u'' yield contact.save() opt_outs = yield self.oo_store.list_opt_outs() self.assertEqual(opt_outs, []) yield self.eh_helper.dispatch_event(event) opt_outs = yield self.oo_store.list_opt_outs() self.assertEqual(opt_outs, [])
class TestUSSDOptOutHandler(VumiTestCase): @inlineCallbacks def setUp(self): self.eh_helper = self.add_helper(EventHandlerHelper()) yield self.eh_helper.setup_event_dispatcher( 'sisi_ni_amani', USSDOptOutHandler, { 'poll_manager_prefix': 'vumigo.', }) vumi_api = self.eh_helper.vumi_helper.get_vumi_api() user_helper = yield self.eh_helper.vumi_helper.get_or_create_user() self.contact_store = user_helper.user_api.contact_store self.oo_store = OptOutStore(vumi_api.manager, user_helper.account_key) self.pm = PollManager(vumi_api.redis, 'vumigo.') self.add_cleanup(self.pm.stop) self.eh_helper.track_event('survey_completed', 'sisi_ni_amani') @inlineCallbacks def test_opt_in(self): msisdn = u'+2345' message_id = u'message-id' event = self.eh_helper.make_event( 'survey_completed', { 'from_addr': msisdn, 'message_id': message_id, 'transport_type': 'ussd', }) yield self.oo_store.new_opt_out('msisdn', msisdn, {'message_id': message_id}) contact = yield self.contact_store.new_contact(msisdn=msisdn) contact.extra['opted_out'] = u'1' yield contact.save() [opt_out] = yield self.oo_store.list_opt_outs() self.assertTrue(opt_out) yield self.eh_helper.dispatch_event(event) opt_outs = yield self.oo_store.list_opt_outs() self.assertEqual(opt_outs, []) @inlineCallbacks def test_opt_out(self): msisdn = u'+2345' message_id = u'message-id' event = self.eh_helper.make_event( 'survey_completed', { 'from_addr': msisdn, 'message_id': message_id, 'transport_type': 'ussd', }) contact = yield self.contact_store.new_contact(msisdn=msisdn) contact.extra['opted_out'] = u'2' yield contact.save() opt_outs = yield self.oo_store.list_opt_outs() self.assertEqual(opt_outs, []) yield self.eh_helper.dispatch_event(event) [opt_out] = yield self.oo_store.list_opt_outs() self.assertTrue(opt_out) @inlineCallbacks def test_opt_out_for_empty_outed_out_value(self): msisdn = u'+2345' message_id = u'message-id' event = self.eh_helper.make_event( 'survey_completed', { 'from_addr': msisdn, 'message_id': message_id, 'transport_type': 'ussd', }) contact = yield self.contact_store.new_contact(msisdn=msisdn) contact.extra['opted_out'] = u'' yield contact.save() opt_outs = yield self.oo_store.list_opt_outs() self.assertEqual(opt_outs, []) yield self.eh_helper.dispatch_event(event) opt_outs = yield self.oo_store.list_opt_outs() self.assertEqual(opt_outs, [])