diff --git a/app/__init__.py b/app/__init__.py index 6802f5353..ada26eee3 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -8,6 +8,7 @@ from flask_marshmallow import Marshmallow from werkzeug.local import LocalProxy from utils import logging from app.celery.celery import NotifyCelery +from app.clients.sms.mmg import MMGClient from app.clients.sms.twilio import TwilioClient from app.clients.sms.firetext import FiretextClient from app.clients.email.aws_ses import AwsSesClient @@ -21,6 +22,7 @@ ma = Marshmallow() notify_celery = NotifyCelery() twilio_client = TwilioClient() firetext_client = FiretextClient() +mmg_client = MMGClient() aws_ses_client = AwsSesClient() encryption = Encryption() @@ -42,6 +44,7 @@ def create_app(app_name=None): logging.init_app(application) twilio_client.init_app(application) firetext_client.init_app(application) + mmg_client.init_app(application.config) aws_ses_client.init_app(application.config['AWS_REGION']) notify_celery.init_app(application) encryption.init_app(application) diff --git a/app/celery/tasks.py b/app/celery/tasks.py index fd8ccb3a9..c3e52e669 100644 --- a/app/celery/tasks.py +++ b/app/celery/tasks.py @@ -22,7 +22,8 @@ from app import ( notify_celery, encryption, firetext_client, - aws_ses_client + aws_ses_client, + mmg_client ) from app.aws import s3 @@ -312,12 +313,20 @@ def send_email(service_id, notification_id, subject, from_address, encrypted_not @notify_celery.task(name='send-sms-code') def send_sms_code(encrypted_verification): verification_message = encryption.decrypt(encrypted_verification) + # send_sms_via_firetext(validate_and_format_phone_number(verification_message['to']), + # verification_message['secret_code'], + # 'send-sms-code') try: - firetext_client.send_sms( - validate_and_format_phone_number(verification_message['to']), - verification_message['secret_code'], - 'send-sms-code' - ) + mmg_client.send_sms(validate_and_format_phone_number(verification_message['to']), + verification_message['secret_code'], + 'send-sms-code') + except Exception as e: + current_app.logger.exception(e) + + +def send_sms_via_firetext(to, content, reference): + try: + firetext_client.send_sms(to=to, content=content, reference=reference) except FiretextClientException as e: current_app.logger.exception(e) diff --git a/app/clients/sms/mmg.py b/app/clients/sms/mmg.py new file mode 100644 index 000000000..cb5c007a6 --- /dev/null +++ b/app/clients/sms/mmg.py @@ -0,0 +1,48 @@ +from flask import current_app +from monotonic import monotonic +from requests import request, RequestException, HTTPError +from app.clients.sms import SmsClient + + +class MMGClient(SmsClient): + ''' + MMG sms client + ''' + + def init_app(self, config, *args, **kwargs): + super(SmsClient, self).__init__(*args, *kwargs) + self.api_key = config.get('MMG_API_KEY') + self.from_number = config.get('NOTIFY_FROM_NUMBER') + self.name = 'mmg' + + def get_name(self): + return self.name + + def send_sms(self, to, content, reference): + data = { + "reqType": "BULK", + "MSISDN": to, + "msg": content, + "sender": self.from_number + } + + start_time = monotonic() + try: + response = request("POST", "https://www.mmgrp.co.uk/API/json/api.php", + data=data) + except RequestException as e: + api_error = HTTPError.create(e) + current_app.logger.error( + "API {} request on {} failed with {} '{}'".format( + "POST", + "https://www.mmgrp.co.uk/API/json/api.php", + api_error.status_code, + api_error.message + ) + ) + raise api_error + finally: + elapsed_time = monotonic() - start_time + current_app.logger.info("MMG request finished in {}".format(elapsed_time)) + return response + diff --git a/config.py b/config.py index 0bf45618c..8576cbdb4 100644 --- a/config.py +++ b/config.py @@ -17,12 +17,14 @@ class Config(object): NOTIFY_JOB_QUEUE = os.environ['NOTIFY_JOB_QUEUE'] # Notification Queue names are a combination of a prefx plus a name NOTIFICATION_QUEUE_PREFIX = os.environ['NOTIFICATION_QUEUE_PREFIX'] + MMG_API_KEY = os.environ['MMG_API_KEY'] SECRET_KEY = os.environ['SECRET_KEY'] SQLALCHEMY_COMMIT_ON_TEARDOWN = False SQLALCHEMY_DATABASE_URI = os.environ['SQLALCHEMY_DATABASE_URI'] SQLALCHEMY_RECORD_QUERIES = True VERIFY_CODE_FROM_EMAIL_ADDRESS = os.environ['VERIFY_CODE_FROM_EMAIL_ADDRESS'] NOTIFY_EMAIL_DOMAIN = os.environ['NOTIFY_EMAIL_DOMAIN'] + NOTIFY_FROM_NUMBER= os.environ['NOTIFY_FROM_NUMBER'] PAGE_SIZE = 50 BROKER_URL = 'sqs://'