Skip to content

Commit f6cfdb6

Browse files
Merge pull request #242 from plivo/SMS-6064
SMS-6064: Verify Python SDK
2 parents 03f7030 + c6c3ef4 commit f6cfdb6

File tree

10 files changed

+1084
-5
lines changed

10 files changed

+1084
-5
lines changed

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
# Change Log
22

3+
## [4.41.0](https://github.com/plivo/plivo-python/tree/v4.41.0) (2023-08-10)
4+
**Feature - Verify**
5+
- Added Create Session API
6+
- Added Get Session API
7+
- Added List Session API
8+
- Added Validate Session API
9+
310
## [4.40.0](https://github.com/plivo/plivo-python/tree/v4.40.0) (2023-08-07)
411

512
**Feature - WhatsApp message support**
613
- Added new param `template` and new message_type `whatsapp` to [send message API](https://www.plivo.com/docs/sms/api/message#send-a-message)
714
- Added new `message_states` (`read`) `message_type`(`whatsapp`),`conversation_id`, `conversation_origin`, `conversation_expiry_timestamp` in [list all messages API](https://www.plivo.com/docs/sms/api/message#list-all-messages) and [get message details API](https://www.plivo.com/docs/sms/api/message#retrieve-a-message) response
815

9-
1016
## [4.39.0](https://github.com/plivo/plivo-python/tree/v4.39.0) (2023-08-03)
1117
**Feature - DLT parameters**
1218
- Added new params `DLTEntityID`, `DLTTemplateID`, `DLTTemplateCategory` to the [send message API](https://www.plivo.com/docs/sms/api/message/send-a-message/)

plivo/base.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,43 @@ def __repr__(self):
6060
return pprint.pformat(self.__dict__)
6161

6262

63+
class ListSessionResponseObject(ResponseObject):
64+
def __init__(self, client, dct):
65+
super(ListSessionResponseObject, self).__init__(dct)
66+
self.error = dct.get('error', None)
67+
self.sessions = dct.get('sessions', None)
68+
self.meta = dct.get('meta', None)
69+
self.apiID = dct.get('api_id', None)
70+
def __iter__(self):
71+
if self.sessions is not None:
72+
return self.sessions.__iter__()
73+
else:
74+
return iter([])
75+
76+
def __len__(self):
77+
if self.sessions is not None:
78+
return len(self.sessions)
79+
else:
80+
return 0 # Return 0 for error case
81+
82+
def __str__(self):
83+
if self.sessions is not None:
84+
response_dict = {'api_id': self.apiID, 'meta': self.meta, 'sessions': self.sessions}
85+
return pprint.pformat(response_dict)
86+
else:
87+
return str(self.error) # Display error message for error case
88+
89+
def __repr__(self):
90+
if self.sessions is not None:
91+
response_dict = {'api_id': self.apiID, 'meta': self.meta, 'sessions': [session for session in self.sessions]}
92+
return str(response_dict)
93+
else:
94+
return str(self.error) # Display error message for error case
95+
96+
def has_error(self):
97+
return self.error is not None
98+
99+
63100
class ListResponseObject(ResponseObject):
64101
def __init__(self, client, dct):
65102
super(ListResponseObject, self).__init__(dct)
@@ -243,4 +280,4 @@ def gen():
243280
yield item
244281
offset += limit
245282

246-
return gen()
283+
return gen()

plivo/resources/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@
2020
from .campaign import Campaign
2121
from .profile import Profile
2222
from .multipartycall import MultiPartyCalls, MultiPartyCall, MultiPartyCallParticipant
23+
from .verify import Sessions

plivo/resources/verify.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# -*- coding: utf-8 -*-
2+
from plivo.utils.validators import *
3+
4+
from ..base import ListResponseObject, PlivoResource, PlivoResourceInterface, ListSessionResponseObject
5+
from ..exceptions import *
6+
from ..utils import *
7+
8+
9+
class Session(PlivoResource):
10+
_name = 'Session'
11+
_identifier_string = 'session_uuid'
12+
13+
def delete(self):
14+
raise InvalidRequestError('Cannot delete a Session resource')
15+
16+
def update(self):
17+
raise InvalidRequestError('Cannot update a Session resource')
18+
19+
20+
class Sessions(PlivoResourceInterface):
21+
_resource_type = Session
22+
23+
@validate_args(
24+
app_uuid=[optional(of_type(six.text_type))],
25+
recipient=[required(is_phonenumber())],
26+
channel=[optional(all_of(of_type(six.text_type), is_in(('sms', 'voice'))))],
27+
url=[optional(is_url())],
28+
method=[optional(of_type(six.text_type))])
29+
def create(self,
30+
app_uuid=None,
31+
recipient=None,
32+
channel=None,
33+
url=None,
34+
method='POST'):
35+
if recipient is None:
36+
raise ValidationError('destination number is required')
37+
return self.client.request('POST', ('Verify', 'Session', ),
38+
to_param_dict(self.create, locals()))
39+
40+
@validate_args(session_uuid=[of_type(six.text_type)])
41+
def get(self, session_uuid):
42+
return self.client.request(
43+
'GET', ('Verify', 'Session', session_uuid), response_type=Session)
44+
45+
@validate_args(
46+
subaccount=[optional(is_subaccount())],
47+
status=[optional(is_in(('in-progress', 'expired', 'verified')))],
48+
session_time__gt=[optional(is_valid_date())],
49+
session_time__gte=[optional(is_valid_date())],
50+
session_time__lt=[optional(is_valid_date())],
51+
session_time__lte=[optional(is_valid_date())],
52+
session_time=[optional(is_valid_date())],
53+
country=[optional(of_type(six.text_type))],
54+
alias=[optional(of_type(six.text_type))],
55+
app_uuid=[optional(of_type(six.text_type))],
56+
recipient=[optional(of_type(six.text_type))],
57+
limit=[
58+
optional(
59+
all_of(
60+
of_type(*six.integer_types),
61+
check(lambda limit: 0 < limit <= 20, '0 < limit <= 20')))
62+
],
63+
offset=[
64+
optional(
65+
all_of(
66+
of_type(*six.integer_types),
67+
check(lambda offset: 0 <= offset, '0 <= offset')))
68+
])
69+
def list(self,
70+
subaccount=None,
71+
status=None,
72+
session_time__gt=None,
73+
session_time__gte=None,
74+
session_time__lt=None,
75+
session_time__lte=None,
76+
session_time=None,
77+
country=None,
78+
alias=None,
79+
app_uuid=None,
80+
recipient=None,
81+
limit=None,
82+
offset=None):
83+
return self.client.request(
84+
'GET', ('Verify', 'Session', ),
85+
to_param_dict(self.list, locals()),
86+
response_type=ListSessionResponseObject,
87+
objects_type=Session)
88+
89+
@validate_args(
90+
otp=[optional(of_type(six.text_type))],
91+
session_uuid=[of_type(six.text_type)]
92+
)
93+
def validate(self, session_uuid, otp=None):
94+
if otp is None:
95+
raise ValidationError('otp is required')
96+
return self.client.request('POST', ('Verify', 'Session', session_uuid),
97+
to_param_dict(self.validate, locals()))
98+

plivo/rest/client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from plivo.resources import (Accounts, Addresses, Applications, Calls,Token,
1515
Conferences, Endpoints, Identities,
1616
Messages, Powerpacks, Media, Lookup, Brand, Campaign, Profile,
17-
Numbers, Pricings, Recordings, Subaccounts, CallFeedback, MultiPartyCalls)
17+
Numbers, Pricings, Recordings, Subaccounts, CallFeedback, MultiPartyCalls, Sessions)
1818
from plivo.resources.live_calls import LiveCalls
1919
from plivo.resources.maskingsession import MaskingSessions
2020
from plivo.resources.profile import Profile
@@ -118,6 +118,7 @@ def __init__(self, auth_id=None, auth_token=None, proxies=None, timeout=5):
118118
self.multi_party_calls = MultiPartyCalls(self)
119119
self.masking_sessions = MaskingSessions(self)
120120
self.voice_retry_count = 0
121+
self.verify_session = Sessions(self)
121122

122123
def __enter__(self):
123124
return self

plivo/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# -*- coding: utf-8 -*-
2-
__version__ = '4.40.0'
2+
__version__ = '4.41.0'

tests/resources/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@
1414
from .test_signature import *
1515
from .test_subaccounts import *
1616
from .test_brand import *
17-
from .test_campaign import *
17+
from .test_campaign import *
18+
from .test_verify import *
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"api_id": "8faf830c-4be8-485a-9235-045495b03148",
3+
"session_uuid": "5c533d15-1975-4f20-80be-40174142ea37",
4+
"app_uuid": "eeb90c7b-9367-4457-8644-47007661bff5",
5+
"recipient": "918681951370",
6+
"channel": "sms",
7+
"status": "expired",
8+
"count": 1,
9+
"attempt_details": [
10+
{
11+
"channel": "sms",
12+
"attempt_uuid": "c1ed6b11-783d-4efd-8b45-d372e02d2943",
13+
"status": "failed",
14+
"time": "2023-07-18T08:46:14.865388Z"
15+
}
16+
],
17+
"charges": {
18+
"total_charge": "0",
19+
"validation_charge": "0.0000",
20+
"attempt_charges": [
21+
{
22+
"attempt_uuid": "c1ed6b11-783d-4efd-8b45-d372e02d2943",
23+
"channel": "sms",
24+
"charge": "0.00000"
25+
}
26+
]
27+
},
28+
"created_at": "2023-07-18T08:46:14.851205Z",
29+
"updated_at": "2023-07-18T08:46:14.865388Z"
30+
}

0 commit comments

Comments
 (0)