Skip to content

Commit

Permalink
Send whatsapp messages
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathansberry committed Dec 13, 2024
1 parent 927db7e commit 71fe0cf
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 19 deletions.
43 changes: 26 additions & 17 deletions ckanext/dataset_subscriptions/actions/twilio_notifications.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@

ACCOUNT_SID = toolkit.config.get('ckanext.dataset_subscriptions.twilio_account_sid')
AUTH_TOKEN = toolkit.config.get('ckanext.dataset_subscriptions.twilio_auth_token')
SENDER_NR = toolkit.config.get('ckanext.dataset_subscriptions.sms_sender_nr')
SMS_SENDER_NR = toolkit.config.get('ckanext.dataset_subscriptions.sms_sender_nr')
WHATSAPP_SENDER_NR = toolkit.config.get('ckanext.dataset_subscriptions.whatsapp_sender_nr')


client = Client(ACCOUNT_SID, AUTH_TOKEN)
Expand All @@ -26,11 +27,18 @@ def send_twilio_notifications(context, data_dict):
if _twilio_notifications_enabled(user):
recent_activities = _get_recent_activity_list(user, context)
if recent_activities:
message_body = _create_message(recent_activities)
if _sms_notifications_enabled(user):
message_sids.append(_send_sms_message(message_body, user['phonenumber']))
message_sids.append(_send_message(
_create_sms_message(recent_activities),
SMS_SENDER_NR,
user['phonenumber']
))
if _whatsapp_notifications_enabled(user):
message_sids.append(_send_whatsapp_message(message_body, user['phonenumber']))
message_sids.append(_send_message(
_create_message_header(recent_activities),
f"whatsapp:{WHATSAPP_SENDER_NR}",
f"whatsapp:{user['phonenumber']}"
))
return message_sids


Expand Down Expand Up @@ -78,14 +86,9 @@ def _get_recent_activity_list(user_dict, context):
return recent_activity_list


def _create_message(activities):
def _create_sms_message(activities):
nr_of_datasets_to_display = toolkit.config.get('ckanext.dataset_subscriptions.sms_nr_of_datasets_to_display', 2)
header = toolkit.ungettext(
"{n} dataset have recently been updated in {site_title}",
"{n} datasets have recently been updated in {site_title}",
len(activities)).format(
site_title=toolkit.config.get('ckan.site_title'),
n=len(activities))
header = _create_message_header(activities)
return toolkit.render(
'dataset-subscriptions_sms_body.j2',
extra_vars={
Expand All @@ -96,18 +99,24 @@ def _create_message(activities):
)


def _send_sms_message(message_body, phonenumber):
def _create_message_header(activities):
return toolkit.ungettext(
"{n} dataset that you are following has recently been updated in {site_title}",
"{n} datasets that you are following have recently been updated in {site_title}",
len(activities)).format(
site_title=toolkit.config.get('ckan.site_title'),
n=len(activities)
)


def _send_message(message_body, sender, phonenumber):
try:
message = client.messages.create(
from_=SENDER_NR,
from_=sender,
body=message_body,
to=phonenumber
)
except TwilioRestException:
logger.exception(f"Failed to send sms message to {phonenumber}", exc_info=True)
return
return message.sid


def _send_whatsapp_message(message_body, phonenumber):
return f"whatsapp-message-sid-{phonenumber}"
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,16 @@ def test_if_sms_notifications_are_generated(create_message_mock, sysadmin_contex
@pytest.mark.usefixtures("with_request_context")
@pytest.mark.usefixtures("clean_db")
@pytest.mark.usefixtures("with_plugins")
@mock.patch('ckanext.dataset_subscriptions.actions.twilio_notifications._send_whatsapp_message')
@mock.patch('ckanext.dataset_subscriptions.actions.twilio_notifications.client.messages.create')
def test_if_whatsapp_notifications_are_generated(create_message_mock, sysadmin_context):
create_user_with_resources(True, False, True)
expected_sid = 'SM87105da94bff44b999e4e6eb90d8eb6a'
create_message_mock.return_value = expected_sid
create_message_mock.return_value.sid = expected_sid
sid = helpers.call_action("send_sms_notifications")
print(sid)
assert create_message_mock.called is True
assert sid[0] == expected_sid
call_args = dict(create_message_mock.call_args.kwargs.items())
assert 'whatsapp:+' in call_args['to']
assert 'whatsapp:+' in call_args['from_']

1 change: 1 addition & 0 deletions test.ini
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ ckan.plugins = dataset_subscriptions activity
ckanext.dataset_subscriptions.twilio_account_sid = dummy_sid
ckanext.dataset_subscriptions.twilio_auth_token = dummy_token
ckanext.dataset_subscriptions.sms_sender_nr = +11234
ckanext.dataset_subscriptions.whatsapp_sender_nr = +11234
ckanext.dataset_subscriptions.sms_notifications_hours_since = 1

# Logging configuration
Expand Down

0 comments on commit 71fe0cf

Please sign in to comment.