Skip to content

Commit 4603d08

Browse files
Merge pull request #38 from hyperwallet/V3
Merge_V3_to_master_release
2 parents 313a52f + edea090 commit 4603d08

8 files changed

Lines changed: 521 additions & 7 deletions

File tree

CHANGELOG.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
Changelog
22
=========
3+
1.5.0
4+
-------------------
5+
- Added Venmo accounts
6+
- Added User status transitions
7+
- Added Transfer refunds
8+
- Added upload multipart documents feature
39

410
1.4.0
511
-------------------

README.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
Hyperwallet REST SDK (Beta)
88
===========================
99

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

1213
Prerequisites
1314
-------------

hyperwallet/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
Account, # noqa
3232
StatusTransition, # noqa
3333
TransferMethodConfiguration, # noqa
34-
Webhook # noqa
34+
Webhook, # noqa
35+
TransferRefunds # naqa
3536
)
3637

3738
from .api import Api # noqa

hyperwallet/api.py

Lines changed: 250 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
Account,
2323
StatusTransition,
2424
TransferMethodConfiguration,
25-
Webhook
25+
Webhook,
26+
TransferRefunds
2627
)
2728

2829

@@ -2684,3 +2685,251 @@ def listWebhookNotifications(self,
26842685

26852686
def __buildUrl(self, *paths):
26862687
return '/'.join(s.strip('/') for s in paths)
2688+
2689+
def uploadDocumentsForUser(self,
2690+
userToken=None,
2691+
data=None,
2692+
files=None):
2693+
'''
2694+
Upload documents for Users
2695+
2696+
:param userToken:
2697+
A token identifying the User. **REQUIRED**
2698+
:param data:
2699+
A dictionary containing data for the input documents. **REQUIRED**
2700+
sample data:
2701+
jsonData={'data': ['{"documents": [{"type": "DRIVERS_LICENSE", "country": "US", "category": "IDENTIFICATION"}]}']};
2702+
:param files: Dictionary of ``'filename': file-like-objects``
2703+
for multipart encoding upload. **REQUIRED**
2704+
sample data:
2705+
files = {
2706+
'drivers_license_front': open('F1.png', 'rb'),
2707+
'drivers_license_back': open('F22.png', 'rb')
2708+
}
2709+
:returns:
2710+
A User with documents information
2711+
'''
2712+
2713+
if not userToken:
2714+
raise HyperwalletException('userToken is required')
2715+
2716+
response = self.apiClient.putDocument(
2717+
self.__buildUrl(
2718+
'users',
2719+
userToken
2720+
),
2721+
data,
2722+
files
2723+
)
2724+
2725+
return User(response)
2726+
2727+
'''
2728+
2729+
Transfer Refunds
2730+
2731+
'''
2732+
2733+
def createTransferRefund(self,
2734+
transferToken=None,
2735+
data=None):
2736+
'''
2737+
Create a Transfer Refund.
2738+
:param transferToken:
2739+
A token identifying the Transfer. **REQUIRED**
2740+
:param data:
2741+
A dictionary containing Transfer Refund information. **REQUIRED**
2742+
:returns:
2743+
A Transfer Refund.
2744+
'''
2745+
2746+
if not transferToken:
2747+
raise HyperwalletException('transferToken is required')
2748+
2749+
if not data:
2750+
raise HyperwalletException('data is required')
2751+
2752+
response = self.apiClient.doPost(
2753+
self.__buildUrl(
2754+
'transfers',
2755+
transferToken,
2756+
'refunds'
2757+
),
2758+
data
2759+
)
2760+
2761+
return TransferRefunds(response)
2762+
2763+
def createTransferSpendBackRefund(self,
2764+
transferToken=None,
2765+
sourceToken=None,
2766+
params=None):
2767+
'''
2768+
Create a Transfer Refund.
2769+
:param transferToken:
2770+
A token identifying the Transfer. **REQUIRED**
2771+
:param data:
2772+
A dictionary containing Transfer Refund information. **REQUIRED**
2773+
:returns:
2774+
A Transfer Refund.
2775+
'''
2776+
2777+
if not transferToken:
2778+
raise HyperwalletException('transferToken is required')
2779+
2780+
if not sourceToken:
2781+
raise HyperwalletException('sourceToken is required')
2782+
2783+
response = self.apiClient.doGet(
2784+
self.__buildUrl(
2785+
'transfers',
2786+
transferToken,
2787+
'refunds',
2788+
sourceToken
2789+
),
2790+
params
2791+
)
2792+
2793+
return TransferRefunds(response)
2794+
2795+
'''
2796+
2797+
Create User Status Transition
2798+
2799+
'''
2800+
2801+
def createUserStatusTransition(self,
2802+
userToken=None,
2803+
data=None):
2804+
'''
2805+
Create User Status Transition.
2806+
:param userToken:
2807+
A token identifying the User Create UserToken. **REQUIRED**
2808+
:param data:
2809+
A dictionary containing User Status Create Data information. **REQUIRED**
2810+
:returns:
2811+
StatusTransition.
2812+
'''
2813+
if not userToken:
2814+
raise HyperwalletException('userToken is required')
2815+
if not data:
2816+
raise HyperwalletException('data is required')
2817+
response = self.apiClient.doPost(
2818+
self.__buildUrl(
2819+
'users',
2820+
userToken,
2821+
'status-transitions'
2822+
),
2823+
data
2824+
)
2825+
2826+
return StatusTransition(response)
2827+
2828+
def activateUser(self,
2829+
userToken=None):
2830+
2831+
'''
2832+
Create User Activate Status Transition.
2833+
:param userToken:
2834+
A token identifying the User Create UserToken. **REQUIRED**
2835+
:returns:
2836+
StatusTransition.
2837+
'''
2838+
if not userToken:
2839+
raise HyperwalletException('userToken is required')
2840+
2841+
data = {
2842+
'transition': 'ACTIVATED'
2843+
}
2844+
2845+
return self.createUserStatusTransition(
2846+
userToken,
2847+
data
2848+
)
2849+
2850+
def deactivateUser(self,
2851+
userToken=None):
2852+
2853+
'''
2854+
Create User DeActivate Status Transition.
2855+
:param userToken:
2856+
A token identifying the User Create UserToken. **REQUIRED**
2857+
:returns:
2858+
StatusTransition.
2859+
'''
2860+
if not userToken:
2861+
raise HyperwalletException('userToken is required')
2862+
2863+
data = {
2864+
'transition': 'DE_ACTIVATED'
2865+
}
2866+
2867+
return self.createUserStatusTransition(
2868+
userToken,
2869+
data
2870+
)
2871+
2872+
def preactivateUser(self,
2873+
userToken=None):
2874+
2875+
'''
2876+
Create User Pre Activate Status Transition.
2877+
:param userToken:
2878+
A token identifying the User Create UserToken. **REQUIRED**
2879+
:returns:
2880+
StatusTransition.
2881+
'''
2882+
if not userToken:
2883+
raise HyperwalletException('userToken is required')
2884+
data = {
2885+
'transition': 'PRE-ACTIVATED'
2886+
}
2887+
2888+
return self.createUserStatusTransition(
2889+
userToken,
2890+
data
2891+
)
2892+
2893+
def freezeUser(self,
2894+
userToken=None):
2895+
2896+
'''
2897+
Create User Freeze Status Transition.
2898+
:param userToken:
2899+
A token identifying the User Create UserToken. **REQUIRED**
2900+
:returns:
2901+
StatusTransition.
2902+
'''
2903+
if not userToken:
2904+
raise HyperwalletException('userToken is required')
2905+
2906+
data = {
2907+
'transition': 'FROZEN'
2908+
}
2909+
2910+
return self.createUserStatusTransition(
2911+
userToken,
2912+
data
2913+
)
2914+
2915+
def lockUser(self,
2916+
userToken=None):
2917+
2918+
'''
2919+
Create User Lock Status Transition.
2920+
:param userToken:
2921+
A token identifying the User Create UserToken. **REQUIRED**
2922+
:returns:
2923+
StatusTransition.
2924+
'''
2925+
if not userToken:
2926+
raise HyperwalletException('userToken is required')
2927+
2928+
data = {
2929+
'transition': 'LOCKED'
2930+
}
2931+
2932+
return self.createUserStatusTransition(
2933+
userToken,
2934+
data
2935+
)

hyperwallet/models.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ def __init__(self, data):
113113
'stateProvince': None,
114114
'status': None,
115115
'token': None,
116-
'verificationStatus': None
116+
'verificationStatus': None,
117+
'timeZone': None,
118+
'documents': None
117119
}
118120

119121
for (param, default) in self.defaults.items():
@@ -796,3 +798,54 @@ def __repr__(self):
796798
date=self.createdOn,
797799
token=self.token
798800
)
801+
802+
803+
'''
804+
805+
Transfer Refunds
806+
807+
'''
808+
809+
810+
class TransferRefunds(HyperwalletModel):
811+
'''
812+
The TransferRefunds Model.
813+
814+
:param data:
815+
A dictionary containing the attributes for the Transfer Refunds.
816+
'''
817+
818+
def __init__(self, data):
819+
'''
820+
Create a new Transfer Refunds with the provided attributes.
821+
'''
822+
823+
super(TransferRefunds, self).__init__(data)
824+
825+
self.defaults = {
826+
'token': None,
827+
'status': None,
828+
'createdOn': None,
829+
'clientRefundId': None,
830+
'sourceToken': None,
831+
'sourceAmount': None,
832+
'sourceFeeAmount': None,
833+
'sourceCurrency': None,
834+
'destinationToken': None,
835+
'destinationAmount': None,
836+
'destinationFeeAmount': None,
837+
'destinationCurrency': None,
838+
'foreignExchanges': None,
839+
'notes': None,
840+
'memo': None,
841+
'expiresOn': None
842+
}
843+
844+
for (param, default) in self.defaults.items():
845+
setattr(self, param, data.get(param, default))
846+
847+
def __repr__(self):
848+
return "TransferRefunds({date}, {token})".format(
849+
date=self.createdOn,
850+
token=self.token
851+
)

0 commit comments

Comments
 (0)