Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
# Change Log
## [4.60.2](https://github.com/plivo/plivo-python/tree/v4.60.2) (2026-05-22)
**Feature - Messages API parameter update**
- Added `allow_dtmf` optional parameter to messages.create (POST /v1/Account/{auth_id}/Message/)

_Source: plivo/api-messaging#624_

## [4.60.1](https://github.com/plivo/plivo-python/tree/v4.60.1) (2026-04-17)
**Bug Fix - PhoneNumber Compliance API**
- Fixed Requirements.get() sending None values as query params when not provided
Expand Down
14 changes: 14 additions & 0 deletions examples/messages_create.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Example of sending a message with allow_dtmf using Plivo API

import plivo

client = plivo.RestClient("auth_id", "auth_token")

response = client.messages.create(
src='14151234567', # Sender's phone number with country code
dst='14157654321', # Receiver's phone number with country code
text='Test message with DTMF allowed',
allow_dtmf=True
)

print(response)
8 changes: 5 additions & 3 deletions plivo/resources/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ class Messages(PlivoResourceInterface):
location=[optional(is_location())],
dlt_entity_id=[optional(of_type(six.text_type))],
dlt_template_id=[optional(of_type(six.text_type))],
dlt_template_category=[optional(of_type(six.text_type))]
dlt_template_category=[optional(of_type(six.text_type))],
allow_dtmf=[optional(of_type_exact(bool))]
)
def create(self,
dst,
Expand All @@ -66,7 +67,8 @@ def create(self,
location=None,
dlt_entity_id=None,
dlt_template_id=None,
dlt_template_category=None):
dlt_template_category=None,
allow_dtmf=None):
if src in dst.split('<'):
raise ValidationError(
'destination number cannot be same as source number')
Expand Down Expand Up @@ -161,4 +163,4 @@ def list(self,
'GET', ('Message', ),
to_param_dict(self.list, locals()),
response_type=ListMessagesResponseObject,
objects_type=Message)
objects_type=Message)
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

setup(
name='plivo',
version='4.60.1',
version='4.60.2',
description='A Python SDK to make voice calls & send SMS using Plivo and to generate Plivo XML',
long_description=long_description,
url='https://github.com/plivo/plivo-python',
Expand Down
18 changes: 17 additions & 1 deletion tests/resources/test_messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,22 @@ def test_send_message_with_no_src_powerpack(self):
dst='1234',
text='Abcd')

@with_response(202)
def test_send_message_with_allow_dtmf(self):
expected_response = {'message_uuid': 'newmessageuuid'}
self.client.set_expected_response(
status_code=202, data_to_return=expected_response)

test_message = self.client.messages.create(
src='1234', dst='12345', text='Test message', allow_dtmf=True)

self.assertResponseMatches(test_message)
self.assertUrlEqual(self.client.current_request.url,
self.get_url('Message'))
self.assertEqual(self.client.current_request.method, 'POST')
self.assertEqual(test_message.message_uuid,
expected_response['message_uuid'])

@with_response(200)
def test_get(self):
message_uuid = 'message_uuid'
Expand Down Expand Up @@ -91,4 +107,4 @@ def test_list(self):
self.assertEqual(len(list(messages)), 20)
self.assertUrlEqual(self.client.current_request.url,
self.get_url('Message'))
self.assertEqual(self.client.current_request.method, 'GET')
self.assertEqual(self.client.current_request.method, 'GET')
Loading