Merge branch 'philip/notify-errors' into 'master'

Philip/notify errors

Closes cic-notify#4

See merge request grassrootseconomics/cic-internal-integration!161
This commit is contained in:
Louis Holbrook 2021-05-19 16:13:06 +00:00
commit db2ec0dcfa
5 changed files with 46 additions and 5 deletions

View File

@ -9,3 +9,7 @@ class AlreadyInitializedError(Exception):
class PleaseCommitFirstError(Exception): class PleaseCommitFirstError(Exception):
"""Raised when there exists uncommitted changes in the code while trying to build out the package.""" """Raised when there exists uncommitted changes in the code while trying to build out the package."""
pass pass
class NotificationSendError(Exception):
"""Raised when a notification failed to due to some error as per the service responsible for dispatching the notification."""

View File

@ -0,0 +1,19 @@
# standard imports
from enum import IntEnum
class AfricasTalkingStatusCodes(IntEnum):
PROCESSED = 100
SENT = 101
QUEUED = 102
RISK_HOLD = 401
INVALID_SENDER_ID = 402
INVALID_PHONE_NUMBER = 403
UNSUPPORTED_NUMBER_TYPE = 404
INSUFFICIENT_BALANCE = 405
USER_IN_BLACKLIST = 406
COULD_NOT_ROUTE = 407
INTERNAL_SERVER_ERROR = 500
GATEWAY_ERROR = 501
REJECTED_BY_GATEWAY = 502

View File

@ -6,7 +6,8 @@ import celery
import africastalking import africastalking
# local imports # local imports
from cic_notify.error import NotInitializedError, AlreadyInitializedError from cic_notify.error import NotInitializedError, AlreadyInitializedError, NotificationSendError
from cic_notify.ext.enums import AfricasTalkingStatusCodes
logg = logging.getLogger() logg = logging.getLogger()
celery_app = celery.current_app celery_app = celery.current_app
@ -50,10 +51,27 @@ class AfricasTalkingNotifier:
if self.sender_id: if self.sender_id:
response = self.api_client.send(message=message, recipients=[recipient], sender_id=self.sender_id) response = self.api_client.send(message=message, recipients=[recipient], sender_id=self.sender_id)
logg.debug(f'Africastalking response sender-id {response}') logg.debug(f'Africastalking response sender-id {response}')
else: else:
response = self.api_client.send(message=message, recipients=[recipient]) response = self.api_client.send(message=message, recipients=[recipient])
logg.debug(f'africastalking response no-sender-id {response}') logg.debug(f'africastalking response no-sender-id {response}')
recipients = response.get('Recipients')
if len(recipients) != 1:
status = response.get('SMSMessageData').get('Message')
raise NotificationSendError(f'Unexpected number of recipients: {len(recipients)}. Status: {status}')
status_code = recipients[0].get('statusCode')
status = recipients[0].get('status')
if status_code not in [
AfricasTalkingStatusCodes.PROCESSED.value,
AfricasTalkingStatusCodes.SENT.value,
AfricasTalkingStatusCodes.QUEUED.value
]:
raise NotificationSendError(f'Sending notification failed due to: {status}')
@celery_app.task @celery_app.task
def send(message, recipient): def send(message, recipient):

View File

@ -9,7 +9,7 @@ import semver
logg = logging.getLogger() logg = logging.getLogger()
version = (0, 4, 0, 'alpha.4') version = (0, 4, 0, 'alpha.5')
version_object = semver.VersionInfo( version_object = semver.VersionInfo(
major=version[0], major=version[0],

View File

@ -446,9 +446,9 @@ services:
PGPASSWORD: ${DATABASE_PASSWORD:-tralala} PGPASSWORD: ${DATABASE_PASSWORD:-tralala}
CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://redis} CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://redis}
CELERY_RESULT_URL: ${CELERY_BROKER_URL:-redis://redis} CELERY_RESULT_URL: ${CELERY_BROKER_URL:-redis://redis}
TASKS_AFRICASTALKING: $TASKS_AFRICASTALKING AFRICASTALKING_API_USERNAME: $AFRICASTALKING_API_USERNAME
TASKS_SMS_DB: $TASKS_SMS_DB AFRICASTALKING_API_KEY: $AFRICASTALKING_API_KEY
TASKS_LOG: $TASKS_LOG AFRICASTALKING_API_SENDER_ID: $AFRICASTALKING_API_SENDER_ID
depends_on: depends_on:
- postgres - postgres
- redis - redis