Skip to content
Merged
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.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
Changelog
=========
1.5.0
-------------------
- Added Venmo accounts
- Added User status transitions
- Added Transfer refunds
- Added upload multipart documents feature

1.4.0
-------------------
Expand Down
3 changes: 2 additions & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
Hyperwallet REST SDK (Beta)
===========================

A library to manage users, transfer methods and payments through the Hyperwallet API
A library to manage users, transfer methods and payments through the Hyperwallet Rest V3 API
For Rest V4 APIs please use SDK V2.0.1

Prerequisites
-------------
Expand Down
3 changes: 2 additions & 1 deletion hyperwallet/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
Account, # noqa
StatusTransition, # noqa
TransferMethodConfiguration, # noqa
Webhook # noqa
Webhook, # noqa
TransferRefunds # naqa
)

from .api import Api # noqa
251 changes: 250 additions & 1 deletion hyperwallet/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
Account,
StatusTransition,
TransferMethodConfiguration,
Webhook
Webhook,
TransferRefunds
)


Expand Down Expand Up @@ -2684,3 +2685,251 @@ def listWebhookNotifications(self,

def __buildUrl(self, *paths):
return '/'.join(s.strip('/') for s in paths)

def uploadDocumentsForUser(self,
userToken=None,
data=None,
files=None):
'''
Upload documents for Users

:param userToken:
A token identifying the User. **REQUIRED**
:param data:
A dictionary containing data for the input documents. **REQUIRED**
sample data:
jsonData={'data': ['{"documents": [{"type": "DRIVERS_LICENSE", "country": "US", "category": "IDENTIFICATION"}]}']};
:param files: Dictionary of ``'filename': file-like-objects``
for multipart encoding upload. **REQUIRED**
sample data:
files = {
'drivers_license_front': open('F1.png', 'rb'),
'drivers_license_back': open('F22.png', 'rb')
}
:returns:
A User with documents information
'''

if not userToken:
raise HyperwalletException('userToken is required')

response = self.apiClient.putDocument(
self.__buildUrl(
'users',
userToken
),
data,
files
)

return User(response)

'''

Transfer Refunds

'''

def createTransferRefund(self,
transferToken=None,
data=None):
'''
Create a Transfer Refund.
:param transferToken:
A token identifying the Transfer. **REQUIRED**
:param data:
A dictionary containing Transfer Refund information. **REQUIRED**
:returns:
A Transfer Refund.
'''

if not transferToken:
raise HyperwalletException('transferToken is required')

if not data:
raise HyperwalletException('data is required')

response = self.apiClient.doPost(
self.__buildUrl(
'transfers',
transferToken,
'refunds'
),
data
)

return TransferRefunds(response)

def createTransferSpendBackRefund(self,
transferToken=None,
sourceToken=None,
params=None):
'''
Create a Transfer Refund.
:param transferToken:
A token identifying the Transfer. **REQUIRED**
:param data:
A dictionary containing Transfer Refund information. **REQUIRED**
:returns:
A Transfer Refund.
'''

if not transferToken:
raise HyperwalletException('transferToken is required')

if not sourceToken:
raise HyperwalletException('sourceToken is required')

response = self.apiClient.doGet(
self.__buildUrl(
'transfers',
transferToken,
'refunds',
sourceToken
),
params
)

return TransferRefunds(response)

'''

Create User Status Transition

'''

def createUserStatusTransition(self,
userToken=None,
data=None):
'''
Create User Status Transition.
:param userToken:
A token identifying the User Create UserToken. **REQUIRED**
:param data:
A dictionary containing User Status Create Data information. **REQUIRED**
:returns:
StatusTransition.
'''
if not userToken:
raise HyperwalletException('userToken is required')
if not data:
raise HyperwalletException('data is required')
response = self.apiClient.doPost(
self.__buildUrl(
'users',
userToken,
'status-transitions'
),
data
)

return StatusTransition(response)

def activateUser(self,
userToken=None):

'''
Create User Activate Status Transition.
:param userToken:
A token identifying the User Create UserToken. **REQUIRED**
:returns:
StatusTransition.
'''
if not userToken:
raise HyperwalletException('userToken is required')

data = {
'transition': 'ACTIVATED'
}

return self.createUserStatusTransition(
userToken,
data
)

def deactivateUser(self,
userToken=None):

'''
Create User DeActivate Status Transition.
:param userToken:
A token identifying the User Create UserToken. **REQUIRED**
:returns:
StatusTransition.
'''
if not userToken:
raise HyperwalletException('userToken is required')

data = {
'transition': 'DE_ACTIVATED'
}

return self.createUserStatusTransition(
userToken,
data
)

def preactivateUser(self,
userToken=None):

'''
Create User Pre Activate Status Transition.
:param userToken:
A token identifying the User Create UserToken. **REQUIRED**
:returns:
StatusTransition.
'''
if not userToken:
raise HyperwalletException('userToken is required')
data = {
'transition': 'PRE-ACTIVATED'
}

return self.createUserStatusTransition(
userToken,
data
)

def freezeUser(self,
userToken=None):

'''
Create User Freeze Status Transition.
:param userToken:
A token identifying the User Create UserToken. **REQUIRED**
:returns:
StatusTransition.
'''
if not userToken:
raise HyperwalletException('userToken is required')

data = {
'transition': 'FROZEN'
}

return self.createUserStatusTransition(
userToken,
data
)

def lockUser(self,
userToken=None):

'''
Create User Lock Status Transition.
:param userToken:
A token identifying the User Create UserToken. **REQUIRED**
:returns:
StatusTransition.
'''
if not userToken:
raise HyperwalletException('userToken is required')

data = {
'transition': 'LOCKED'
}

return self.createUserStatusTransition(
userToken,
data
)
55 changes: 54 additions & 1 deletion hyperwallet/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,9 @@ def __init__(self, data):
'stateProvince': None,
'status': None,
'token': None,
'verificationStatus': None
'verificationStatus': None,
'timeZone': None,
'documents': None
}

for (param, default) in self.defaults.items():
Expand Down Expand Up @@ -796,3 +798,54 @@ def __repr__(self):
date=self.createdOn,
token=self.token
)


'''

Transfer Refunds

'''


class TransferRefunds(HyperwalletModel):
'''
The TransferRefunds Model.

:param data:
A dictionary containing the attributes for the Transfer Refunds.
'''

def __init__(self, data):
'''
Create a new Transfer Refunds with the provided attributes.
'''

super(TransferRefunds, self).__init__(data)

self.defaults = {
'token': None,
'status': None,
'createdOn': None,
'clientRefundId': None,
'sourceToken': None,
'sourceAmount': None,
'sourceFeeAmount': None,
'sourceCurrency': None,
'destinationToken': None,
'destinationAmount': None,
'destinationFeeAmount': None,
'destinationCurrency': None,
'foreignExchanges': None,
'notes': None,
'memo': None,
'expiresOn': None
}

for (param, default) in self.defaults.items():
setattr(self, param, data.get(param, default))

def __repr__(self):
return "TransferRefunds({date}, {token})".format(
date=self.createdOn,
token=self.token
)
Loading