def send_sms_with_backend_name(domain, phone_number, text, backend_name, metadata=None): phone_number = clean_phone_number(phone_number) backend = SQLMobileBackend.load_by_name(SQLMobileBackend.SMS, domain, backend_name) msg = get_sms_class()( domain=domain, phone_number=phone_number, direction=OUTGOING, date=get_utcnow(), backend_id=backend.couch_id, text=text ) add_msg_tags(msg, metadata) return queue_outgoing_sms(msg)
def send_sms_with_backend_name(domain, phone_number, text, backend_name, metadata=None): phone_number = clean_phone_number(phone_number) backend = SQLMobileBackend.load_by_name(SQLMobileBackend.SMS, domain, backend_name) msg = get_sms_class()( domain=domain, phone_number=phone_number, direction=OUTGOING, date=get_utcnow(), backend_id=backend.couch_id, text=text ) add_msg_tags(msg, metadata) return queue_outgoing_sms(msg)
def backend(self): from corehq.apps.sms.models import SQLMobileBackend from corehq.apps.sms.util import clean_phone_number if isinstance(self.backend_id, basestring) and self.backend_id.strip() != '': return SQLMobileBackend.load_by_name( SQLMobileBackend.SMS, self.domain, self.backend_id ) else: return SQLMobileBackend.load_default_by_phone_and_domain( SQLMobileBackend.SMS, clean_phone_number(self.phone_number), domain=self.domain )
def send_sms(domain, contact, phone_number, text, metadata=None, logged_subevent=None): """ Sends an outbound SMS. Returns false if it fails. """ if phone_number is None: return False if isinstance(phone_number, six.integer_types): phone_number = str(phone_number) phone_number = clean_phone_number(phone_number) msg = get_sms_class()(domain=domain, phone_number=phone_number, direction=OUTGOING, date=get_utcnow(), backend_id=None, location_id=get_location_id_by_contact( domain, contact), text=text) if contact: msg.couch_recipient = contact.get_id msg.couch_recipient_doc_type = contact.doc_type if domain and contact and is_commcarecase(contact): backend_name = contact.get_case_property('contact_backend_id') backend_name = backend_name.strip() if isinstance( backend_name, six.string_types) else '' soft_assert_type_text(backend_name) if backend_name: try: backend = SQLMobileBackend.load_by_name( SQLMobileBackend.SMS, domain, backend_name) except BadSMSConfigException as e: if logged_subevent: logged_subevent.error( MessagingEvent.ERROR_GATEWAY_NOT_FOUND, additional_error_text=six.text_type(e)) return False msg.backend_id = backend.couch_id add_msg_tags(msg, metadata) return queue_outgoing_sms(msg)
def get_ivr_backend(recipient, verified_number=None, unverified_number=None): if verified_number and verified_number.ivr_backend_id: return SQLMobileBackend.load_by_name(SQLMobileBackend.IVR, verified_number.domain, verified_number.ivr_backend_id) else: phone_number = (verified_number.phone_number if verified_number else unverified_number) phone_number = strip_plus(str(phone_number)) prefixes = settings.IVR_BACKEND_MAP.keys() prefixes = sorted(prefixes, key=lambda x: len(x), reverse=True) for prefix in prefixes: if phone_number.startswith(prefix): return SQLMobileBackend.get_global_backend_by_name( SQLMobileBackend.IVR, settings.IVR_BACKEND_MAP[prefix]) return None
def get_ivr_backend(recipient, verified_number=None, unverified_number=None): if verified_number and verified_number.ivr_backend_id: return SQLMobileBackend.load_by_name( SQLMobileBackend.IVR, verified_number.domain, verified_number.ivr_backend_id ) else: phone_number = (verified_number.phone_number if verified_number else unverified_number) phone_number = strip_plus(str(phone_number)) prefixes = settings.IVR_BACKEND_MAP.keys() prefixes = sorted(prefixes, key=lambda x: len(x), reverse=True) for prefix in prefixes: if phone_number.startswith(prefix): return SQLMobileBackend.get_global_backend_by_name( SQLMobileBackend.IVR, settings.IVR_BACKEND_MAP[prefix] ) return None
def send_sms(domain, contact, phone_number, text, metadata=None, logged_subevent=None): """ Sends an outbound SMS. Returns false if it fails. """ if phone_number is None: return False if isinstance(phone_number, six.integer_types): phone_number = str(phone_number) phone_number = clean_phone_number(phone_number) msg = get_sms_class()( domain=domain, phone_number=phone_number, direction=OUTGOING, date=get_utcnow(), backend_id=None, location_id=get_location_id_by_contact(domain, contact), text = text ) if contact: msg.couch_recipient = contact.get_id msg.couch_recipient_doc_type = contact.doc_type if domain and contact and is_commcarecase(contact): backend_name = contact.get_case_property('contact_backend_id') backend_name = backend_name.strip() if isinstance(backend_name, six.string_types) else '' soft_assert_type_text(backend_name) if backend_name: try: backend = SQLMobileBackend.load_by_name(SQLMobileBackend.SMS, domain, backend_name) except BadSMSConfigException as e: if logged_subevent: logged_subevent.error(MessagingEvent.ERROR_GATEWAY_NOT_FOUND, additional_error_text=six.text_type(e)) return False msg.backend_id = backend.couch_id add_msg_tags(msg, metadata) return queue_outgoing_sms(msg)
def test_load_by_name(self): backend1 = SQLTestSMSBackend.objects.create( name='BACKEND_BY_NAME_TEST', is_global=False, domain='backend-by-name-test-1', hq_api_id=SQLTestSMSBackend.get_api_id(), ) backend2 = SQLTestSMSBackend.objects.create( name='BACKEND_BY_NAME_TEST', is_global=False, domain='backend-by-name-test-2', hq_api_id=SQLTestSMSBackend.get_api_id(), ) backend2.set_shared_domains(['backend-by-name-test-1']) backend3 = SQLTestSMSBackend.objects.create( name='BACKEND_BY_NAME_TEST', is_global=True, hq_api_id=SQLTestSMSBackend.get_api_id(), ) self.assertBackendsEqual( SQLMobileBackend.load_by_name( SQLMobileBackend.SMS, 'backend-by-name-test-1', 'BACKEND_BY_NAME_TEST' ), backend1 ) self.assertBackendsEqual( SQLMobileBackend.load_by_name( SQLMobileBackend.SMS, 'backend-by-name-test-3', 'BACKEND_BY_NAME_TEST' ), backend3 ) backend1.soft_delete() self.assertBackendsEqual( SQLMobileBackend.load_by_name( SQLMobileBackend.SMS, 'backend-by-name-test-1', 'BACKEND_BY_NAME_TEST' ), backend2 ) backend2.set_shared_domains([]) self.assertBackendsEqual( SQLMobileBackend.load_by_name( SQLMobileBackend.SMS, 'backend-by-name-test-1', 'BACKEND_BY_NAME_TEST' ), backend3 ) self.assertBackendsEqual( SQLMobileBackend.load_by_name( SQLMobileBackend.SMS, 'backend-by-name-test-2', 'BACKEND_BY_NAME_TEST' ), backend2 ) backend2.soft_delete() self.assertBackendsEqual( SQLMobileBackend.load_by_name( SQLMobileBackend.SMS, 'backend-by-name-test-2', 'BACKEND_BY_NAME_TEST' ), backend3 ) backend3.soft_delete() with self.assertRaises(BadSMSConfigException): SQLMobileBackend.load_by_name( SQLMobileBackend.SMS, 'backend-by-name-test-1', 'BACKEND_BY_NAME_TEST' ) backend1.delete() backend2.delete() backend3.delete()