mangopay4-python-sdk 3.52.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mangopay/__init__.py +27 -0
- mangopay/api.py +381 -0
- mangopay/auth.py +130 -0
- mangopay/base.py +289 -0
- mangopay/compat.py +16 -0
- mangopay/constants.py +466 -0
- mangopay/exceptions.py +26 -0
- mangopay/fields.py +1345 -0
- mangopay/page.py +17 -0
- mangopay/query.py +280 -0
- mangopay/ratelimit.py +5 -0
- mangopay/resources.py +3219 -0
- mangopay/signals.py +14 -0
- mangopay/utils.py +1582 -0
- mangopay4_python_sdk-3.52.0.dist-info/METADATA +53 -0
- mangopay4_python_sdk-3.52.0.dist-info/RECORD +20 -0
- mangopay4_python_sdk-3.52.0.dist-info/WHEEL +6 -0
- mangopay4_python_sdk-3.52.0.dist-info/entry_points.txt +2 -0
- mangopay4_python_sdk-3.52.0.dist-info/licenses/LICENSE +22 -0
- mangopay4_python_sdk-3.52.0.dist-info/top_level.txt +1 -0
mangopay/fields.py
ADDED
|
@@ -0,0 +1,1345 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
import json
|
|
3
|
+
import re
|
|
4
|
+
import sys
|
|
5
|
+
import time
|
|
6
|
+
|
|
7
|
+
import six
|
|
8
|
+
|
|
9
|
+
from .utils import timestamp_from_datetime, timestamp_from_date, Money, DebitedBankAccount, Address, ShippingAddress, \
|
|
10
|
+
Reason, ReportTransactionsFilters, ReportWalletsFilters, \
|
|
11
|
+
PlatformCategorization, Billing, SecurityInfo, Birthplace, ApplepayPaymentData, GooglepayPaymentData, \
|
|
12
|
+
ScopeBlocked, BrowserInfo, Shipping, CurrentState, FallbackReason, InstantPayout, CountryAuthorizationData, \
|
|
13
|
+
PayinsLinked, ConversionRate, CardInfo, LocalAccountDetails, InternationalAccountDetails, \
|
|
14
|
+
VirtualAccountCapabilities, PaymentRef, PendingUserAction, LegalRepresentative, IndividualRecipient, \
|
|
15
|
+
BusinessRecipient, RecipientPropertySchema, IndividualRecipientPropertySchema, BusinessRecipientPropertySchema, \
|
|
16
|
+
CompanyNumberValidation, ReportFilter, PayInIntentExternalData, PayInIntentBuyer, SupportedBank, VerificationOfPayee
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class FieldDescriptor(object):
|
|
20
|
+
def __init__(self, field):
|
|
21
|
+
self.field = field
|
|
22
|
+
self.att_name = self.field.name
|
|
23
|
+
|
|
24
|
+
def __get__(self, instance, instance_type=None):
|
|
25
|
+
if instance is not None:
|
|
26
|
+
return instance._data.get(self.att_name)
|
|
27
|
+
|
|
28
|
+
return self.field
|
|
29
|
+
|
|
30
|
+
def __set__(self, instance, value):
|
|
31
|
+
instance._data[self.att_name] = value
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class Field(object):
|
|
35
|
+
default = None
|
|
36
|
+
_field_counter = 0
|
|
37
|
+
_order = 0
|
|
38
|
+
|
|
39
|
+
def get_attributes(self):
|
|
40
|
+
return {}
|
|
41
|
+
|
|
42
|
+
def __init__(self, null=False, api_name=None,
|
|
43
|
+
help_text=None, api_value_callback=None,
|
|
44
|
+
choices=None, default=None,
|
|
45
|
+
python_value_callback=None, *args, **kwargs):
|
|
46
|
+
self.null = null
|
|
47
|
+
self.attributes = self.get_attributes()
|
|
48
|
+
self.default = kwargs.get('default', None)
|
|
49
|
+
self.api_name = api_name
|
|
50
|
+
self.api_value_callback = api_value_callback
|
|
51
|
+
self.python_value_callback = python_value_callback
|
|
52
|
+
self.help_text = help_text
|
|
53
|
+
self.required = kwargs.get('required', False)
|
|
54
|
+
self.choices = choices
|
|
55
|
+
self.default = default
|
|
56
|
+
|
|
57
|
+
self.attributes.update(kwargs)
|
|
58
|
+
|
|
59
|
+
self._order = Field._field_counter
|
|
60
|
+
|
|
61
|
+
def add_to_class(self, klass, name):
|
|
62
|
+
self.name = name
|
|
63
|
+
self.model = klass
|
|
64
|
+
self.api_name = self.api_name or re.sub('_+', ' ', name).title()
|
|
65
|
+
|
|
66
|
+
klass._meta.fields[self.name] = self
|
|
67
|
+
|
|
68
|
+
setattr(klass, name, FieldDescriptor(self))
|
|
69
|
+
|
|
70
|
+
def null_wrapper(self, value, default=None):
|
|
71
|
+
if (self.null and not value) or not default:
|
|
72
|
+
return value
|
|
73
|
+
return value or default
|
|
74
|
+
|
|
75
|
+
def api_value(self, value):
|
|
76
|
+
if self.api_value_callback:
|
|
77
|
+
value = self.api_value_callback(value)
|
|
78
|
+
return value
|
|
79
|
+
|
|
80
|
+
def python_value(self, value):
|
|
81
|
+
if self.python_value_callback:
|
|
82
|
+
value = self.python_value_callback(value)
|
|
83
|
+
return value
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class CharField(Field):
|
|
87
|
+
def python_value(self, value):
|
|
88
|
+
if self.python_value_callback:
|
|
89
|
+
value = self.python_value_callback(value)
|
|
90
|
+
|
|
91
|
+
return value
|
|
92
|
+
|
|
93
|
+
def api_value(self, value):
|
|
94
|
+
if sys.version_info > (3, 0) and isinstance(value, six.binary_type):
|
|
95
|
+
return value.decode('utf-8')
|
|
96
|
+
|
|
97
|
+
return value
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class DateTimeField(Field):
|
|
101
|
+
def python_value(self, value):
|
|
102
|
+
value = super(DateTimeField, self).python_value(value)
|
|
103
|
+
|
|
104
|
+
if isinstance(value, six.string_types):
|
|
105
|
+
value = value.rsplit('.', 1)[0]
|
|
106
|
+
value = datetime.datetime(*time.strptime(value, '%Y-%m-%d %H:%M:%S')[:6])
|
|
107
|
+
|
|
108
|
+
if isinstance(value, six.integer_types):
|
|
109
|
+
value = datetime.datetime.utcfromtimestamp(value)
|
|
110
|
+
|
|
111
|
+
return value
|
|
112
|
+
|
|
113
|
+
def api_value(self, value):
|
|
114
|
+
value = super(DateTimeField, self).api_value(value)
|
|
115
|
+
|
|
116
|
+
if isinstance(value, datetime.datetime):
|
|
117
|
+
value = timestamp_from_datetime(value)
|
|
118
|
+
|
|
119
|
+
return value
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class DateField(Field):
|
|
123
|
+
def python_value(self, value):
|
|
124
|
+
value = super(DateField, self).python_value(value)
|
|
125
|
+
|
|
126
|
+
if isinstance(value, six.string_types):
|
|
127
|
+
value = datetime.datetime.strptime(value, '%Y-%m-%d').date()
|
|
128
|
+
|
|
129
|
+
if isinstance(value, six.integer_types):
|
|
130
|
+
if value < 0:
|
|
131
|
+
value = (datetime.datetime.utcfromtimestamp(0) + datetime.timedelta(seconds=value)).date()
|
|
132
|
+
else:
|
|
133
|
+
value = datetime.datetime.utcfromtimestamp(value).date()
|
|
134
|
+
|
|
135
|
+
return value
|
|
136
|
+
|
|
137
|
+
def api_value(self, value):
|
|
138
|
+
value = super(DateField, self).api_value(value)
|
|
139
|
+
|
|
140
|
+
if isinstance(value, datetime.date):
|
|
141
|
+
value = timestamp_from_date(value)
|
|
142
|
+
|
|
143
|
+
return value
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class IntegerField(Field):
|
|
147
|
+
def api_value(self, value):
|
|
148
|
+
return self.null_wrapper(super(IntegerField, self).api_value(value), 0)
|
|
149
|
+
|
|
150
|
+
def python_value(self, value):
|
|
151
|
+
if value is not None:
|
|
152
|
+
return int(super(IntegerField, self).python_value(value))
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
class FloatField(Field):
|
|
156
|
+
def api_value(self, value):
|
|
157
|
+
return self.null_wrapper(super(FloatField, self).api_value(value), 0.0)
|
|
158
|
+
|
|
159
|
+
def python_value(self, value):
|
|
160
|
+
if value is not None:
|
|
161
|
+
return float(super(FloatField, self).python_value(value))
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class DictField(Field):
|
|
165
|
+
def api_value(self, value):
|
|
166
|
+
return value
|
|
167
|
+
|
|
168
|
+
def python_value(self, value):
|
|
169
|
+
if value is not None and isinstance(value, str):
|
|
170
|
+
return json.loads(value)
|
|
171
|
+
elif isinstance(value, dict):
|
|
172
|
+
return value
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class PrimaryKeyField(CharField):
|
|
176
|
+
pass
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class ListField(Field):
|
|
180
|
+
pass
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
class BooleanField(IntegerField):
|
|
184
|
+
def api_value(self, value):
|
|
185
|
+
value = super(BooleanField, self).api_value(value)
|
|
186
|
+
|
|
187
|
+
if value:
|
|
188
|
+
return 1
|
|
189
|
+
return 0
|
|
190
|
+
|
|
191
|
+
def python_value(self, value):
|
|
192
|
+
value = super(BooleanField, self).python_value(value)
|
|
193
|
+
|
|
194
|
+
return bool(value)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
class EmailField(CharField):
|
|
198
|
+
pass
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class MoneyField(Field):
|
|
202
|
+
def python_value(self, value):
|
|
203
|
+
if value is not None:
|
|
204
|
+
return Money(currency=value['Currency'], amount=value['Amount'])
|
|
205
|
+
|
|
206
|
+
return value
|
|
207
|
+
|
|
208
|
+
def api_value(self, value):
|
|
209
|
+
value = super(MoneyField, self).api_value(value)
|
|
210
|
+
|
|
211
|
+
if isinstance(value, Money):
|
|
212
|
+
if value.amount is not None:
|
|
213
|
+
value = {
|
|
214
|
+
'Currency': value.currency,
|
|
215
|
+
'Amount': int(value.amount)
|
|
216
|
+
}
|
|
217
|
+
else:
|
|
218
|
+
value = {
|
|
219
|
+
'Currency': value.currency,
|
|
220
|
+
'Amount': None
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return value
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class PaymentRefField(Field):
|
|
227
|
+
def python_value(self, value):
|
|
228
|
+
if value is not None:
|
|
229
|
+
return PaymentRef(reason_type=value['ReasonType'], reference_id=value['ReferenceId'])
|
|
230
|
+
|
|
231
|
+
return value
|
|
232
|
+
|
|
233
|
+
def api_value(self, value):
|
|
234
|
+
value = super(PaymentRefField, self).api_value(value)
|
|
235
|
+
|
|
236
|
+
if isinstance(value, PaymentRef):
|
|
237
|
+
value = {
|
|
238
|
+
'ReasonType': value.reason_type,
|
|
239
|
+
'ReferenceId': value.reference_id
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return value
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
class FallbackReasonField(Field):
|
|
246
|
+
def python_value(self, value):
|
|
247
|
+
if value is not None:
|
|
248
|
+
return FallbackReason(code=value['Code'], message=value['Message'])
|
|
249
|
+
|
|
250
|
+
return value
|
|
251
|
+
|
|
252
|
+
def api_value(self, value):
|
|
253
|
+
value = super(FallbackReasonField, self).api_value(value)
|
|
254
|
+
|
|
255
|
+
if isinstance(value, FallbackReason):
|
|
256
|
+
value = {
|
|
257
|
+
'Code': value.code,
|
|
258
|
+
'Message': value.message
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return value
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
class InstantPayoutField(Field):
|
|
265
|
+
def python_value(self, value):
|
|
266
|
+
if value is not None:
|
|
267
|
+
return InstantPayout(is_reachable=value['IsReachable'], unreachable_reason=value['UnreachableReason'])
|
|
268
|
+
|
|
269
|
+
return value
|
|
270
|
+
|
|
271
|
+
def api_value(self, value):
|
|
272
|
+
value = super(InstantPayoutField, self).api_value(value)
|
|
273
|
+
|
|
274
|
+
if isinstance(value, InstantPayoutField):
|
|
275
|
+
value = {
|
|
276
|
+
'IsReachable': value.is_reachable,
|
|
277
|
+
'UnreachableReason': value.unreachable_reason
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return value
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
class PlatformCategorizationField(Field):
|
|
284
|
+
def python_value(self, value):
|
|
285
|
+
if value is not None:
|
|
286
|
+
return PlatformCategorization(business_type=value['BusinessType'], sector=value['Sector'])
|
|
287
|
+
|
|
288
|
+
return value
|
|
289
|
+
|
|
290
|
+
def api_value(self, value):
|
|
291
|
+
value = super(PlatformCategorizationField, self).api_value(value)
|
|
292
|
+
|
|
293
|
+
if isinstance(value, PlatformCategorization):
|
|
294
|
+
value = {
|
|
295
|
+
'BusinessType': value.business_type,
|
|
296
|
+
'Sector': value.sector
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return value
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
class BillingField(Field):
|
|
303
|
+
def python_value(self, value):
|
|
304
|
+
if value is not None:
|
|
305
|
+
return Billing(first_name=value['FirstName'], last_name=value['LastName'], address=value['Address'])
|
|
306
|
+
return value
|
|
307
|
+
|
|
308
|
+
def api_value(self, value):
|
|
309
|
+
value = super(BillingField, self).api_value(value)
|
|
310
|
+
|
|
311
|
+
if isinstance(value, Billing):
|
|
312
|
+
value = {
|
|
313
|
+
'FirstName': value.first_name,
|
|
314
|
+
'LastName': value.last_name,
|
|
315
|
+
'Address': value.address
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return value
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
class SecurityInfoField(Field):
|
|
322
|
+
def python_value(self, value):
|
|
323
|
+
if value is not None:
|
|
324
|
+
return SecurityInfo(avs_result=value['AVSResult'])
|
|
325
|
+
|
|
326
|
+
return value
|
|
327
|
+
|
|
328
|
+
def api_value(self, value):
|
|
329
|
+
value = super(SecurityInfoField, self).api_value(value)
|
|
330
|
+
|
|
331
|
+
if isinstance(value, SecurityInfo):
|
|
332
|
+
value = {
|
|
333
|
+
'AVSResult': value.avs_result
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
return value
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
class DebitedBankAccountField(Field):
|
|
340
|
+
def python_value(self, value):
|
|
341
|
+
if value is not None:
|
|
342
|
+
return DebitedBankAccount(owner_name=value['OwnerName'], account_number=value['AccountNumber'],
|
|
343
|
+
iban=value['IBAN'], bic=value['BIC'], type=value['Type'],
|
|
344
|
+
country=value['Country'])
|
|
345
|
+
|
|
346
|
+
return value
|
|
347
|
+
|
|
348
|
+
def api_value(self, value):
|
|
349
|
+
value = super(DebitedBankAccountField, self).api_value(value)
|
|
350
|
+
|
|
351
|
+
if isinstance(value, DebitedBankAccount):
|
|
352
|
+
value = {
|
|
353
|
+
'OwnerName': value.owner_name,
|
|
354
|
+
'AccountNumber': value.account_number,
|
|
355
|
+
'IBAN': value.iban,
|
|
356
|
+
'BIC': value.bic,
|
|
357
|
+
'Type': value.type,
|
|
358
|
+
'Country': value.country
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
return value
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
class ReportTransactionsFiltersField(Field):
|
|
365
|
+
def python_value(self, value):
|
|
366
|
+
if value is not None:
|
|
367
|
+
local_min_debited_funds_amount = ''
|
|
368
|
+
local_max_debited_funds_amount = ''
|
|
369
|
+
local_min_fees_amount = ''
|
|
370
|
+
local_max_fees_amount = ''
|
|
371
|
+
|
|
372
|
+
if 'MinDebitedFundsAmount' in value and value['MinDebitedFundsAmount']:
|
|
373
|
+
local_min_debited_funds_amount = int(value['MinDebitedFundsAmount'])
|
|
374
|
+
|
|
375
|
+
if 'MaxDebitedFundsAmount' in value and value['MaxDebitedFundsAmount']:
|
|
376
|
+
local_max_debited_funds_amount = int(value['MaxDebitedFundsAmount'])
|
|
377
|
+
|
|
378
|
+
if 'MinFeesAmount' in value and value['MinFeesAmount']:
|
|
379
|
+
local_min_fees_amount = int(value['MinFeesAmount'])
|
|
380
|
+
|
|
381
|
+
if 'MaxFeesAmount' in value and value['MaxFeesAmount']:
|
|
382
|
+
local_max_fees_amount = int(value['MaxFeesAmount'])
|
|
383
|
+
|
|
384
|
+
author_id = None
|
|
385
|
+
wallet_id = None
|
|
386
|
+
if 'AuthorId' in value:
|
|
387
|
+
author_id = value['AuthorId']
|
|
388
|
+
if 'WalletId' in value:
|
|
389
|
+
wallet_id = value['WalletId']
|
|
390
|
+
|
|
391
|
+
return ReportTransactionsFilters(before_date=value['BeforeDate'],
|
|
392
|
+
after_date=value['AfterDate'],
|
|
393
|
+
transaction_type=value['Type'],
|
|
394
|
+
status=value['Status'],
|
|
395
|
+
nature=value['Nature'],
|
|
396
|
+
min_debited_funds_amount=local_min_debited_funds_amount,
|
|
397
|
+
min_debited_funds_currency=value['MinDebitedFundsCurrency'],
|
|
398
|
+
max_debited_funds_amount=local_max_debited_funds_amount,
|
|
399
|
+
max_debited_funds_currency=value['MaxDebitedFundsCurrency'],
|
|
400
|
+
result_code=value['ResultCode'],
|
|
401
|
+
min_fees_amount=local_min_fees_amount,
|
|
402
|
+
min_fees_currency=value['MinFeesCurrency'],
|
|
403
|
+
max_fees_amount=local_max_fees_amount,
|
|
404
|
+
max_fees_currency=value['MaxFeesCurrency'],
|
|
405
|
+
author_id=author_id, wallet_id=wallet_id
|
|
406
|
+
)
|
|
407
|
+
return value
|
|
408
|
+
|
|
409
|
+
def api_value(self, value):
|
|
410
|
+
value = super(ReportTransactionsFiltersField, self).api_value(value)
|
|
411
|
+
|
|
412
|
+
if isinstance(value, ReportTransactionsFilters):
|
|
413
|
+
|
|
414
|
+
if isinstance(value.before_date, datetime.datetime):
|
|
415
|
+
local_before_date = timestamp_from_datetime(value.before_date)
|
|
416
|
+
else:
|
|
417
|
+
local_before_date = value.before_date
|
|
418
|
+
|
|
419
|
+
if isinstance(value.after_date, datetime.datetime):
|
|
420
|
+
local_after_date = timestamp_from_datetime(value.after_date)
|
|
421
|
+
else:
|
|
422
|
+
local_after_date = value.after_date
|
|
423
|
+
|
|
424
|
+
value = {
|
|
425
|
+
'BeforeDate': local_before_date,
|
|
426
|
+
'AfterDate': local_after_date,
|
|
427
|
+
'Type': value.transaction_type,
|
|
428
|
+
'Status': value.status,
|
|
429
|
+
'Nature': value.nature,
|
|
430
|
+
'MinDebitedFundsAmount': value.min_debited_funds_amount,
|
|
431
|
+
'MinDebitedFundsCurrency': value.min_debited_funds_currency,
|
|
432
|
+
'MaxDebitedFundsAmount': value.max_debited_funds_amount,
|
|
433
|
+
'MaxDebitedFundsCurrency': value.max_debited_funds_currency,
|
|
434
|
+
'ResultCode': value.result_code,
|
|
435
|
+
'MinFeesAmount': value.min_fees_amount,
|
|
436
|
+
'MinFeesCurrency': value.min_fees_currency,
|
|
437
|
+
'MaxFeesAmount': value.max_fees_amount,
|
|
438
|
+
'MaxFeesCurrency': value.max_fees_currency,
|
|
439
|
+
'AuthorId': value.author_id,
|
|
440
|
+
'WalletId': value.wallet_id,
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
return value
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
class ReportWalletsFiltersField(Field):
|
|
447
|
+
def python_value(self, value):
|
|
448
|
+
if value is not None:
|
|
449
|
+
|
|
450
|
+
local_min_balance_amount = ''
|
|
451
|
+
local_max_balance_amount = ''
|
|
452
|
+
|
|
453
|
+
if 'MinBalanceAmount' in value and value['MinBalanceAmount']:
|
|
454
|
+
local_min_balance_amount = int(value['MinBalanceAmount'])
|
|
455
|
+
|
|
456
|
+
if 'MaxBalanceAmount' in value and value['MaxBalanceAmount']:
|
|
457
|
+
local_max_balance_amount = int(value['MaxBalanceAmount'])
|
|
458
|
+
|
|
459
|
+
return ReportWalletsFilters(before_date=value['BeforeDate'],
|
|
460
|
+
after_date=value['AfterDate'],
|
|
461
|
+
owner_id=value['OwnerId'],
|
|
462
|
+
currency=value['Currency'],
|
|
463
|
+
min_balance_amount=local_min_balance_amount,
|
|
464
|
+
min_balance_currency=value['MinBalanceCurrency'],
|
|
465
|
+
max_balance_amount=local_max_balance_amount,
|
|
466
|
+
max_balance_currency=value['MaxBalanceCurrency']
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
return value
|
|
470
|
+
|
|
471
|
+
def api_value(self, value):
|
|
472
|
+
value = super(ReportWalletsFiltersField, self).api_value(value)
|
|
473
|
+
|
|
474
|
+
if isinstance(value, ReportWalletsFilters):
|
|
475
|
+
|
|
476
|
+
if isinstance(value.before_date, datetime.datetime):
|
|
477
|
+
local_before_date = timestamp_from_datetime(value.before_date)
|
|
478
|
+
else:
|
|
479
|
+
local_before_date = value.before_date
|
|
480
|
+
|
|
481
|
+
if isinstance(value.after_date, datetime.datetime):
|
|
482
|
+
local_after_date = timestamp_from_datetime(value.after_date)
|
|
483
|
+
else:
|
|
484
|
+
local_after_date = value.after_date
|
|
485
|
+
|
|
486
|
+
value = {
|
|
487
|
+
'BeforeDate': local_before_date,
|
|
488
|
+
'AfterDate': local_after_date,
|
|
489
|
+
'OwnerId': value.owner_id,
|
|
490
|
+
'Currency': value.currency,
|
|
491
|
+
'MinBalanceAmount': value.min_balance_amount,
|
|
492
|
+
'MinBalanceCurrency': value.min_balance_currency,
|
|
493
|
+
'MaxBalanceAmount': value.max_balance_amount,
|
|
494
|
+
'MaxBalanceCurrency': value.max_balance_currency,
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
return value
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
class DisputeReasonField(Field):
|
|
501
|
+
def python_value(self, value):
|
|
502
|
+
if value is not None:
|
|
503
|
+
return Reason(type=value['DisputeReasonType'], message=value['DisputeReasonMessage'])
|
|
504
|
+
|
|
505
|
+
return value
|
|
506
|
+
|
|
507
|
+
def api_value(self, value):
|
|
508
|
+
value = super(DisputeReasonField, self).api_value(value)
|
|
509
|
+
|
|
510
|
+
if isinstance(value, Reason):
|
|
511
|
+
value = {
|
|
512
|
+
'DisputeReasonType': value.type,
|
|
513
|
+
'DisputeReasonMessage': str(value.message)
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
return value
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
class RefundReasonField(Field):
|
|
520
|
+
def python_value(self, value):
|
|
521
|
+
if value is not None:
|
|
522
|
+
return Reason(
|
|
523
|
+
type=value.get('RefundReasonType'),
|
|
524
|
+
message=value.get('RefundReasonMessage')
|
|
525
|
+
)
|
|
526
|
+
|
|
527
|
+
return value
|
|
528
|
+
|
|
529
|
+
def api_value(self, value):
|
|
530
|
+
value = super(RefundReasonField, self).api_value(value)
|
|
531
|
+
|
|
532
|
+
if isinstance(value, Reason):
|
|
533
|
+
value = {
|
|
534
|
+
'RefusedReasonType': value.type,
|
|
535
|
+
'RefusedReasonMessage': str(value.message)
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
return value
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
class AddressField(Field):
|
|
542
|
+
def python_value(self, value):
|
|
543
|
+
if value is not None:
|
|
544
|
+
return Address(address_line_1=value['AddressLine1'], address_line_2=value['AddressLine2'],
|
|
545
|
+
city=value['City'], region=value['Region'],
|
|
546
|
+
postal_code=value['PostalCode'], country=value['Country'])
|
|
547
|
+
|
|
548
|
+
return value
|
|
549
|
+
|
|
550
|
+
def api_value(self, value):
|
|
551
|
+
value = super(AddressField, self).api_value(value)
|
|
552
|
+
|
|
553
|
+
if isinstance(value, Address):
|
|
554
|
+
value = {
|
|
555
|
+
'AddressLine1': value.address_line_1,
|
|
556
|
+
'AddressLine2': value.address_line_2,
|
|
557
|
+
'City': value.city,
|
|
558
|
+
'Region': value.region,
|
|
559
|
+
'PostalCode': value.postal_code,
|
|
560
|
+
'Country': value.country
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
return value
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
class ShippingAddressField(Field):
|
|
567
|
+
def python_value(self, value):
|
|
568
|
+
return value if value is None else ShippingAddress(recipient_name=value['RecipientName'],
|
|
569
|
+
address=value['Address'])
|
|
570
|
+
|
|
571
|
+
def api_value(self, value):
|
|
572
|
+
value = super(ShippingAddressField, self).api_value(value)
|
|
573
|
+
|
|
574
|
+
if isinstance(value, ShippingAddress):
|
|
575
|
+
return {'RecipientName': value.recipient_name, 'Address': value.address}
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
class ReverseOneToOneRelatedObject(object):
|
|
579
|
+
def __init__(self, related_model, name):
|
|
580
|
+
self.field_name = name
|
|
581
|
+
self.related_model = related_model
|
|
582
|
+
|
|
583
|
+
def __get__(self, instance, instance_type=None):
|
|
584
|
+
return instance.one(self.related_model)
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
class ForeignKeyField(CharField):
|
|
588
|
+
def __init__(self, to, related_name=None, *args, **kwargs):
|
|
589
|
+
self.to = to
|
|
590
|
+
self.related_name = related_name
|
|
591
|
+
|
|
592
|
+
super(ForeignKeyField, self).__init__(*args, **kwargs)
|
|
593
|
+
|
|
594
|
+
def add_to_class(self, klass, name):
|
|
595
|
+
self.descriptor = name
|
|
596
|
+
self.name = name + '_id'
|
|
597
|
+
self.model = klass
|
|
598
|
+
|
|
599
|
+
self.api_name = self.api_name or re.sub('_', ' ', name).title()
|
|
600
|
+
|
|
601
|
+
if self.related_name is None:
|
|
602
|
+
self.related_name = klass._meta.verbose_name + '_set'
|
|
603
|
+
|
|
604
|
+
klass._meta.rel_fields[name] = self.name
|
|
605
|
+
setattr(klass, self.descriptor, ForeignRelatedObject(self.to, self.name, getattr(klass, self.descriptor)))
|
|
606
|
+
setattr(klass, self.name, None)
|
|
607
|
+
|
|
608
|
+
reverse_rel = ReverseForeignRelatedObject(klass, self.name)
|
|
609
|
+
setattr(self.to, self.related_name, reverse_rel)
|
|
610
|
+
self.to._meta.reverse_relations[self.related_name] = klass
|
|
611
|
+
|
|
612
|
+
def api_value(self, value):
|
|
613
|
+
from .base import BaseApiModel
|
|
614
|
+
value = super(ForeignKeyField, self).api_value(value)
|
|
615
|
+
|
|
616
|
+
if isinstance(value, BaseApiModel):
|
|
617
|
+
value = value.get_pk()
|
|
618
|
+
|
|
619
|
+
return value
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
class OneToOneField(ForeignKeyField):
|
|
623
|
+
def add_to_class(self, klass, name):
|
|
624
|
+
self.descriptor = name
|
|
625
|
+
self.name = name + '_id'
|
|
626
|
+
self.model = klass
|
|
627
|
+
|
|
628
|
+
self.api_name = self.api_name or re.sub('_', ' ', name).title()
|
|
629
|
+
|
|
630
|
+
if self.related_name is None:
|
|
631
|
+
self.related_name = klass._meta.verbose_name
|
|
632
|
+
|
|
633
|
+
klass._meta.rel_fields[name] = self.name
|
|
634
|
+
setattr(klass, self.descriptor, ForeignRelatedObject(self.to, self.name))
|
|
635
|
+
setattr(klass, self.name, None)
|
|
636
|
+
|
|
637
|
+
reverse_rel = ReverseOneToOneRelatedObject(klass, self.name)
|
|
638
|
+
setattr(self.to, self.related_name, reverse_rel)
|
|
639
|
+
self.to._meta.reverse_relations[self.related_name] = klass
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
class ForeignRelatedObject(object):
|
|
643
|
+
def __init__(self, to, name, old_field):
|
|
644
|
+
self.field_name = name
|
|
645
|
+
self.to = to
|
|
646
|
+
self.cache_name = '_cache_%s' % name
|
|
647
|
+
self.old_field = old_field
|
|
648
|
+
|
|
649
|
+
def __get__(self, instance, instance_type=None):
|
|
650
|
+
if not getattr(instance, self.cache_name, None):
|
|
651
|
+
id = getattr(instance, self.field_name, 0)
|
|
652
|
+
related = self.to.get(id, handler=instance.handler)
|
|
653
|
+
setattr(instance, self.cache_name, related)
|
|
654
|
+
return getattr(instance, self.cache_name)
|
|
655
|
+
|
|
656
|
+
def __set__(self, instance, obj):
|
|
657
|
+
assert isinstance(obj, self.to), "Cannot assign %s, invalid type" % obj
|
|
658
|
+
setattr(instance, self.field_name, obj.get_pk())
|
|
659
|
+
setattr(instance, self.cache_name, obj)
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
class ReverseForeignRelatedObject(object):
|
|
663
|
+
def __init__(self, related_model, name):
|
|
664
|
+
self.field_name = name
|
|
665
|
+
self.related_model = related_model
|
|
666
|
+
|
|
667
|
+
def __get__(self, instance, instance_type=None):
|
|
668
|
+
fixed_kwargs = instance.fixed_kwargs()
|
|
669
|
+
return RelatedManager(instance, self.related_model, fixed_kwargs)
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
class RelatedManager(object):
|
|
673
|
+
def __init__(self, instance, related_model, fixed_kwargs=None):
|
|
674
|
+
self.instance = instance
|
|
675
|
+
self.related_model = related_model
|
|
676
|
+
self.fixed_kwargs = fixed_kwargs
|
|
677
|
+
|
|
678
|
+
def get(self, pk, **kwargs):
|
|
679
|
+
kwargs.update(self.fixed_kwargs)
|
|
680
|
+
return self.instance.get(pk, self.instance.handler, self.related_model, **kwargs)
|
|
681
|
+
|
|
682
|
+
def all(self, **kwargs):
|
|
683
|
+
return self.instance.list(self.related_model, **kwargs)
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
class ManyToManyField(ListField):
|
|
687
|
+
def __init__(self, to, related_name=None, *args, **kwargs):
|
|
688
|
+
self.to = to
|
|
689
|
+
self.related_name = related_name
|
|
690
|
+
|
|
691
|
+
super(ManyToManyField, self).__init__(*args, **kwargs)
|
|
692
|
+
|
|
693
|
+
def add_to_class(self, klass, name):
|
|
694
|
+
self.descriptor = name
|
|
695
|
+
self.name = name + '_ids'
|
|
696
|
+
self.model = klass
|
|
697
|
+
|
|
698
|
+
self.api_name = self.api_name or re.sub('_', ' ', name).title()
|
|
699
|
+
|
|
700
|
+
if self.related_name is None:
|
|
701
|
+
self.related_name = klass._meta.verbose_name + '_set'
|
|
702
|
+
|
|
703
|
+
klass._meta.rel_fields[name] = self.name
|
|
704
|
+
setattr(klass, self.descriptor, ManyToManyRelatedObject(self.to, self.name))
|
|
705
|
+
setattr(klass, self.name, None)
|
|
706
|
+
|
|
707
|
+
reverse_rel = ManyToManyRelatedObject(klass, self.name)
|
|
708
|
+
|
|
709
|
+
setattr(self.to, self.related_name, reverse_rel)
|
|
710
|
+
self.to._meta.reverse_relations[self.related_name] = klass
|
|
711
|
+
|
|
712
|
+
def api_value(self, value):
|
|
713
|
+
from .base import BaseApiModel
|
|
714
|
+
|
|
715
|
+
values = super(ManyToManyField, self).api_value(value)
|
|
716
|
+
|
|
717
|
+
for i in range(len(values)):
|
|
718
|
+
if isinstance(value, BaseApiModel):
|
|
719
|
+
value = value.get_pk()
|
|
720
|
+
values[i] = value
|
|
721
|
+
|
|
722
|
+
return values
|
|
723
|
+
|
|
724
|
+
|
|
725
|
+
class ManyToManyRelatedObject(object):
|
|
726
|
+
def __init__(self, related_model, name):
|
|
727
|
+
self.related_model = related_model
|
|
728
|
+
self.field_name = name
|
|
729
|
+
|
|
730
|
+
def __get__(self, instance, instance_type=None):
|
|
731
|
+
return instance.list(self.related_model)
|
|
732
|
+
|
|
733
|
+
def __set__(self, instance, objs):
|
|
734
|
+
setattr(instance, self.field_name, [obj.get_pk() for obj in objs])
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
class ApplepayPaymentDataField(Field):
|
|
738
|
+
def python_value(self, value):
|
|
739
|
+
if value is not None:
|
|
740
|
+
return ApplepayPaymentData(transaction_id=value['TransactionId'], network=value['Network'],
|
|
741
|
+
token_data=value['TokenData'])
|
|
742
|
+
return value
|
|
743
|
+
|
|
744
|
+
def api_value(self, value):
|
|
745
|
+
value = super(ApplepayPaymentDataField, self).api_value(value)
|
|
746
|
+
|
|
747
|
+
if isinstance(value, ApplepayPaymentData):
|
|
748
|
+
value = {
|
|
749
|
+
'TransactionId': value.transaction_id,
|
|
750
|
+
'Network': value.network,
|
|
751
|
+
'TokenData': value.token_data
|
|
752
|
+
}
|
|
753
|
+
return value
|
|
754
|
+
|
|
755
|
+
|
|
756
|
+
class GooglepayPaymentDataField(Field):
|
|
757
|
+
def python_value(self, value):
|
|
758
|
+
if value is not None:
|
|
759
|
+
return GooglepayPaymentData(transaction_id=value['TransactionId'], network=value['Network'],
|
|
760
|
+
token_data=value['TokenData'])
|
|
761
|
+
return value
|
|
762
|
+
|
|
763
|
+
def api_value(self, value):
|
|
764
|
+
value = {
|
|
765
|
+
'TransactionId': value.transaction_id,
|
|
766
|
+
'Network': value.network,
|
|
767
|
+
'TokenData': value.token_data
|
|
768
|
+
}
|
|
769
|
+
return value
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
class BirthplaceField(Field):
|
|
773
|
+
def python_value(self, value):
|
|
774
|
+
if value is not None:
|
|
775
|
+
return Birthplace(city=value['City'], country=value['Country'])
|
|
776
|
+
|
|
777
|
+
return value
|
|
778
|
+
|
|
779
|
+
def api_value(self, value):
|
|
780
|
+
value = super(BirthplaceField, self).api_value(value)
|
|
781
|
+
|
|
782
|
+
if isinstance(value, Birthplace):
|
|
783
|
+
value = {
|
|
784
|
+
'City': value.city,
|
|
785
|
+
'Country': value.country,
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
return value
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
class BrowserInfoField(Field):
|
|
792
|
+
def python_value(self, value):
|
|
793
|
+
if value is not None:
|
|
794
|
+
return BrowserInfo(accept_header=value['AcceptHeader'], java_enabled=value['JavaEnabled'],
|
|
795
|
+
javascript_enabled=value['JavascriptEnabled'], language=value['Language'],
|
|
796
|
+
color_depth=value['ColorDepth'], screen_width=value['ScreenWidth'],
|
|
797
|
+
screen_height=value['ScreenHeight'], timezone_offset=value['TimeZoneOffset'],
|
|
798
|
+
user_agent=value['UserAgent'])
|
|
799
|
+
|
|
800
|
+
return value
|
|
801
|
+
|
|
802
|
+
def api_value(self, value):
|
|
803
|
+
value = super(BrowserInfoField, self).api_value(value)
|
|
804
|
+
|
|
805
|
+
if isinstance(value, BrowserInfo):
|
|
806
|
+
value = {
|
|
807
|
+
"AcceptHeader": value.accept_header,
|
|
808
|
+
"JavaEnabled": value.java_enabled,
|
|
809
|
+
"JavascriptEnabled": value.javascript_enabled,
|
|
810
|
+
"Language": value.language,
|
|
811
|
+
"ColorDepth": value.color_depth,
|
|
812
|
+
"ScreenHeight": value.screen_height,
|
|
813
|
+
"ScreenWidth": value.screen_width,
|
|
814
|
+
"TimeZoneOffset": value.timezone_offset,
|
|
815
|
+
"UserAgent": value.user_agent
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
return value
|
|
819
|
+
|
|
820
|
+
|
|
821
|
+
class ScopeBlockedField(Field):
|
|
822
|
+
def python_value(self, value):
|
|
823
|
+
if value is not None:
|
|
824
|
+
return ScopeBlocked(inflows=value['Inflows'], outflows=value['Outflows'])
|
|
825
|
+
|
|
826
|
+
return value
|
|
827
|
+
|
|
828
|
+
def api_value(self, value):
|
|
829
|
+
value = super(ScopeBlockedField, self).api_value(value)
|
|
830
|
+
|
|
831
|
+
if isinstance(value, ScopeBlocked):
|
|
832
|
+
value = {
|
|
833
|
+
'Inflows': value.inflows,
|
|
834
|
+
'Outflows': value.outflows,
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
return value
|
|
838
|
+
|
|
839
|
+
|
|
840
|
+
class ShippingField(Field):
|
|
841
|
+
def python_value(self, value):
|
|
842
|
+
if value is not None:
|
|
843
|
+
return Shipping(first_name=value['FirstName'], last_name=value['LastName'], address=value['Address'])
|
|
844
|
+
return value
|
|
845
|
+
|
|
846
|
+
def api_value(self, value):
|
|
847
|
+
value = super(ShippingField, self).api_value(value)
|
|
848
|
+
|
|
849
|
+
if isinstance(value, Shipping):
|
|
850
|
+
value = {
|
|
851
|
+
'FirstName': value.first_name,
|
|
852
|
+
'LastName': value.last_name,
|
|
853
|
+
'Address': value.address
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
return value
|
|
857
|
+
|
|
858
|
+
|
|
859
|
+
class CurrentStateField(Field):
|
|
860
|
+
def python_value(self, value):
|
|
861
|
+
if value is not None:
|
|
862
|
+
return CurrentState(payins_linked=value['PayinsLinked'],
|
|
863
|
+
cumulated_debited_amount=value['CumulatedDebitedAmount'],
|
|
864
|
+
cumulated_debited_fees=value['CumulatedFeesAmount'],
|
|
865
|
+
last_payin_id=value['LastPayinId'])
|
|
866
|
+
return value
|
|
867
|
+
|
|
868
|
+
def api_value(self, value):
|
|
869
|
+
value = super(CurrentStateField, self).api_value(value)
|
|
870
|
+
|
|
871
|
+
if isinstance(value, CurrentState):
|
|
872
|
+
value = {
|
|
873
|
+
'PayinsLinked ': value.payins_linked,
|
|
874
|
+
'CumulatedDebitedAmount ': value.cumulated_debited_amount,
|
|
875
|
+
'CumulatedFeesAmount ': value.cumulated_debited_fees,
|
|
876
|
+
'LastPayinId ': value.last_payin_id
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
return value
|
|
880
|
+
|
|
881
|
+
|
|
882
|
+
class CountryAuthorizationDataField(Field):
|
|
883
|
+
def python_value(self, value):
|
|
884
|
+
if value is not None:
|
|
885
|
+
return CountryAuthorizationData(block_user_creation=value['BlockUserCreation'],
|
|
886
|
+
block_bank_account_creation=value['BlockBankAccountCreation'],
|
|
887
|
+
block_payout=value['BlockPayout'])
|
|
888
|
+
|
|
889
|
+
return value
|
|
890
|
+
|
|
891
|
+
def api_value(self, value):
|
|
892
|
+
value = super(CountryAuthorizationDataField, self).api_value(value)
|
|
893
|
+
|
|
894
|
+
if isinstance(value, CountryAuthorizationData):
|
|
895
|
+
value = {
|
|
896
|
+
'BlockUserCreation': value.block_user_creation,
|
|
897
|
+
'BlockBankAccountCreation': value.block_bank_account_creation,
|
|
898
|
+
'BlockPayout': value.block_payout
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
return value
|
|
902
|
+
|
|
903
|
+
|
|
904
|
+
class PayinsLinkedField(Field):
|
|
905
|
+
def python_value(self, value):
|
|
906
|
+
if value is not None:
|
|
907
|
+
return PayinsLinked(payin_capture_id=value['PayinCaptureId'],
|
|
908
|
+
payin_complement_id=value['PayinComplementId'])
|
|
909
|
+
return value
|
|
910
|
+
|
|
911
|
+
def api_value(self, value):
|
|
912
|
+
value = super(PayinsLinkedField, self).api_value(value)
|
|
913
|
+
|
|
914
|
+
if isinstance(value, PayinsLinked):
|
|
915
|
+
value = {
|
|
916
|
+
'PayinCaptureId': value.payin_capture_id,
|
|
917
|
+
'PayinComplementId': value.payin_complement_id
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
return value
|
|
921
|
+
|
|
922
|
+
|
|
923
|
+
class ConversionRateField(Field):
|
|
924
|
+
def python_value(self, value):
|
|
925
|
+
if value is not None:
|
|
926
|
+
return ConversionRate(client_rate=value['ClientRate'], market_rate=value['MarketRate'])
|
|
927
|
+
return value
|
|
928
|
+
|
|
929
|
+
def api_value(self, value):
|
|
930
|
+
value = super(ConversionRateField, self).api_value(value)
|
|
931
|
+
|
|
932
|
+
if isinstance(value, ConversionRate):
|
|
933
|
+
value = {
|
|
934
|
+
'ClientRate': value.client_rate,
|
|
935
|
+
'MarketRate': value.market_rate
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
return value
|
|
939
|
+
|
|
940
|
+
|
|
941
|
+
class CardInfoField(Field):
|
|
942
|
+
def python_value(self, value):
|
|
943
|
+
if value is not None:
|
|
944
|
+
return CardInfo(
|
|
945
|
+
bin=value['BIN'],
|
|
946
|
+
issuing_bank=value['IssuingBank'],
|
|
947
|
+
issuer_country_code=value['IssuerCountryCode'],
|
|
948
|
+
type=value['Type'],
|
|
949
|
+
brand=value['Brand'],
|
|
950
|
+
sub_type=value['SubType'])
|
|
951
|
+
return value
|
|
952
|
+
|
|
953
|
+
def api_value(self, value):
|
|
954
|
+
value = super(CardInfoField, self).api_value(value)
|
|
955
|
+
|
|
956
|
+
if isinstance(value, CardInfo):
|
|
957
|
+
value = {
|
|
958
|
+
'BIN': value.bin,
|
|
959
|
+
'IssuingBank': value.issuing_bank,
|
|
960
|
+
'IssuerCountryCode': value.issuer_country_code,
|
|
961
|
+
'Type': value.type,
|
|
962
|
+
'Brand': value.brand,
|
|
963
|
+
'SubType': value.sub_type,
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
return value
|
|
967
|
+
|
|
968
|
+
|
|
969
|
+
class LocalAccountDetailsField(Field):
|
|
970
|
+
def python_value(self, value):
|
|
971
|
+
if value is not None:
|
|
972
|
+
return LocalAccountDetails(address=value['Address'], account=value['Account'], bank_name=value['BankName'])
|
|
973
|
+
return value
|
|
974
|
+
|
|
975
|
+
def api_value(self, value):
|
|
976
|
+
value = super(LocalAccountDetailsField, self).api_value(value)
|
|
977
|
+
|
|
978
|
+
if isinstance(value, LocalAccountDetails):
|
|
979
|
+
value = {
|
|
980
|
+
'Address': value.address,
|
|
981
|
+
'Account': value.account,
|
|
982
|
+
'BankName': value.bank_name
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
return value
|
|
986
|
+
|
|
987
|
+
|
|
988
|
+
class InternationalAccountDetailsField(Field):
|
|
989
|
+
def python_value(self, value):
|
|
990
|
+
if value is not None:
|
|
991
|
+
return InternationalAccountDetails(address=value['Address'], account=value['Account'],
|
|
992
|
+
bank_name=value['BankName'])
|
|
993
|
+
return value
|
|
994
|
+
|
|
995
|
+
def api_value(self, value):
|
|
996
|
+
value = super(InternationalAccountDetailsField, self).api_value(value)
|
|
997
|
+
|
|
998
|
+
if isinstance(value, InternationalAccountDetails):
|
|
999
|
+
value = {
|
|
1000
|
+
'Address': value.address,
|
|
1001
|
+
'Account': value.account,
|
|
1002
|
+
'BankName': value.bank_name
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
return value
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
class VirtualAccountCapabilitiesField(Field):
|
|
1009
|
+
def python_value(self, value):
|
|
1010
|
+
if value is not None:
|
|
1011
|
+
return VirtualAccountCapabilities(local_pay_in_available=value['LocalPayinAvailable'],
|
|
1012
|
+
international_pay_in_available=value['InternationalPayinAvailable'],
|
|
1013
|
+
currencies=value['Currencies'])
|
|
1014
|
+
return value
|
|
1015
|
+
|
|
1016
|
+
def api_value(self, value):
|
|
1017
|
+
value = super(VirtualAccountCapabilitiesField, self).api_value(value)
|
|
1018
|
+
|
|
1019
|
+
if isinstance(value, VirtualAccountCapabilities):
|
|
1020
|
+
value = {
|
|
1021
|
+
'LocalPayinAvailable': value.local_pay_in_available,
|
|
1022
|
+
'InternationalPayinAvailable': value.international_pay_in_available,
|
|
1023
|
+
'Currencies': value.currencies
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
return value
|
|
1027
|
+
|
|
1028
|
+
|
|
1029
|
+
class PendingUserActionField(Field):
|
|
1030
|
+
def python_value(self, value):
|
|
1031
|
+
if value is not None:
|
|
1032
|
+
return PendingUserAction(redirect_url=value['RedirectUrl'])
|
|
1033
|
+
|
|
1034
|
+
return value
|
|
1035
|
+
|
|
1036
|
+
def api_value(self, value):
|
|
1037
|
+
value = super(PendingUserActionField, self).api_value(value)
|
|
1038
|
+
|
|
1039
|
+
if isinstance(value, PendingUserAction):
|
|
1040
|
+
value = {
|
|
1041
|
+
'RedirectUrl': value.redirect_url
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
return value
|
|
1045
|
+
|
|
1046
|
+
|
|
1047
|
+
class LegalRepresentativeField(Field):
|
|
1048
|
+
def python_value(self, value):
|
|
1049
|
+
if value is not None:
|
|
1050
|
+
return LegalRepresentative(first_name=value['FirstName'], last_name=value['LastName'],
|
|
1051
|
+
birthday=value['Birthday'],
|
|
1052
|
+
nationality=value['Nationality'],
|
|
1053
|
+
country_of_residence=value['CountryOfResidence'],
|
|
1054
|
+
email=value['Email'], phone_number=value['PhoneNumber'],
|
|
1055
|
+
phone_number_country=value['PhoneNumberCountry'])
|
|
1056
|
+
|
|
1057
|
+
return value
|
|
1058
|
+
|
|
1059
|
+
def api_value(self, value):
|
|
1060
|
+
value = super(LegalRepresentativeField, self).api_value(value)
|
|
1061
|
+
|
|
1062
|
+
if isinstance(value, LegalRepresentative):
|
|
1063
|
+
value = {
|
|
1064
|
+
'FirstName': value.first_name,
|
|
1065
|
+
'LastName': value.last_name,
|
|
1066
|
+
'Birthday': value.birthday,
|
|
1067
|
+
'Nationality': value.nationality,
|
|
1068
|
+
'CountryOfResidence': value.country_of_residence,
|
|
1069
|
+
'Email': value.email,
|
|
1070
|
+
'PhoneNumber': value.phone_number,
|
|
1071
|
+
'PhoneNumberCountry': value.phone_number_country
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
return value
|
|
1075
|
+
|
|
1076
|
+
|
|
1077
|
+
class IndividualRecipientField(Field):
|
|
1078
|
+
def python_value(self, value):
|
|
1079
|
+
if value is not None:
|
|
1080
|
+
return IndividualRecipient(first_name=value.get('FirstName', None), last_name=value.get('LastName', None),
|
|
1081
|
+
address=value.get('Address', None))
|
|
1082
|
+
|
|
1083
|
+
return value
|
|
1084
|
+
|
|
1085
|
+
def api_value(self, value):
|
|
1086
|
+
value = super(IndividualRecipientField, self).api_value(value)
|
|
1087
|
+
|
|
1088
|
+
if isinstance(value, IndividualRecipient):
|
|
1089
|
+
value = {
|
|
1090
|
+
'FirstName': value.first_name,
|
|
1091
|
+
'LastName': value.last_name,
|
|
1092
|
+
'Address': value.address
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
return value
|
|
1096
|
+
|
|
1097
|
+
|
|
1098
|
+
class BusinessRecipientField(Field):
|
|
1099
|
+
def python_value(self, value):
|
|
1100
|
+
if value is not None:
|
|
1101
|
+
return BusinessRecipient(business_name=value.get('BusinessName', None), address=value.get('Address', None))
|
|
1102
|
+
|
|
1103
|
+
return value
|
|
1104
|
+
|
|
1105
|
+
def api_value(self, value):
|
|
1106
|
+
value = super(BusinessRecipientField, self).api_value(value)
|
|
1107
|
+
|
|
1108
|
+
if isinstance(value, BusinessRecipient):
|
|
1109
|
+
value = {
|
|
1110
|
+
'BusinessName': value.business_name,
|
|
1111
|
+
'Address': value.address
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
return value
|
|
1115
|
+
|
|
1116
|
+
|
|
1117
|
+
class RecipientPropertySchemaField(Field):
|
|
1118
|
+
def python_value(self, value):
|
|
1119
|
+
if value is not None:
|
|
1120
|
+
return RecipientPropertySchema(required=value.get('Required', None),
|
|
1121
|
+
max_length=value.get('MaxLength', None),
|
|
1122
|
+
min_length=value.get('MinLength', None),
|
|
1123
|
+
pattern=value.get('Pattern', None),
|
|
1124
|
+
allowed_values=value.get('AllowedValues', None),
|
|
1125
|
+
label=value.get('Label', None),
|
|
1126
|
+
end_user_display=value.get('EndUserDisplay', None))
|
|
1127
|
+
|
|
1128
|
+
return value
|
|
1129
|
+
|
|
1130
|
+
def api_value(self, value):
|
|
1131
|
+
value = super(RecipientPropertySchemaField, self).api_value(value)
|
|
1132
|
+
|
|
1133
|
+
if isinstance(value, RecipientPropertySchema):
|
|
1134
|
+
value = {
|
|
1135
|
+
'Required': value.required,
|
|
1136
|
+
'MaxLength': value.max_length,
|
|
1137
|
+
'MinLength': value.min_length,
|
|
1138
|
+
'Pattern': value.pattern,
|
|
1139
|
+
'AllowedValues': value.allowed_values,
|
|
1140
|
+
'Label': value.label,
|
|
1141
|
+
'EndUserDisplay': value.end_user_display
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
return value
|
|
1145
|
+
|
|
1146
|
+
|
|
1147
|
+
class IndividualRecipientPropertySchemaField(Field):
|
|
1148
|
+
def python_value(self, value):
|
|
1149
|
+
if value is not None:
|
|
1150
|
+
return IndividualRecipientPropertySchema(first_name=value.get('FirstName', None),
|
|
1151
|
+
last_name=value.get('LastName', None),
|
|
1152
|
+
address=value.get('Address', None))
|
|
1153
|
+
|
|
1154
|
+
return value
|
|
1155
|
+
|
|
1156
|
+
def api_value(self, value):
|
|
1157
|
+
value = super(IndividualRecipientPropertySchemaField, self).api_value(value)
|
|
1158
|
+
|
|
1159
|
+
if isinstance(value, IndividualRecipientPropertySchema):
|
|
1160
|
+
value = {
|
|
1161
|
+
'FirstName': value.first_name,
|
|
1162
|
+
'LastName': value.last_name,
|
|
1163
|
+
'Address': value.address
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
return value
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
class BusinessRecipientPropertySchemaField(Field):
|
|
1170
|
+
def python_value(self, value):
|
|
1171
|
+
if value is not None:
|
|
1172
|
+
return BusinessRecipientPropertySchema(business_name=value.get('BusinessName', None),
|
|
1173
|
+
address=value.get('Address', None))
|
|
1174
|
+
|
|
1175
|
+
return value
|
|
1176
|
+
|
|
1177
|
+
def api_value(self, value):
|
|
1178
|
+
value = super(BusinessRecipientPropertySchemaField, self).api_value(value)
|
|
1179
|
+
|
|
1180
|
+
if isinstance(value, BusinessRecipientPropertySchema):
|
|
1181
|
+
value = {
|
|
1182
|
+
'BusinessName': value.business_name,
|
|
1183
|
+
'Address': value.address
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
return value
|
|
1187
|
+
|
|
1188
|
+
|
|
1189
|
+
class CompanyNumberValidationField(Field):
|
|
1190
|
+
def python_value(self, value):
|
|
1191
|
+
if value is not None:
|
|
1192
|
+
return CompanyNumberValidation(company_number=value.get('CompanyNumber', None),
|
|
1193
|
+
country_code=value.get('CountryCode', None),
|
|
1194
|
+
is_valid=value.get('IsValid', None),
|
|
1195
|
+
validation_rules=value.get('ValidationRules', None))
|
|
1196
|
+
|
|
1197
|
+
return value
|
|
1198
|
+
|
|
1199
|
+
def api_value(self, value):
|
|
1200
|
+
value = super(CompanyNumberValidationField, self).api_value(value)
|
|
1201
|
+
|
|
1202
|
+
if isinstance(value, CompanyNumberValidation):
|
|
1203
|
+
value = {
|
|
1204
|
+
'CompanyNumber': value.company_number,
|
|
1205
|
+
'CountryCode': value.country_code,
|
|
1206
|
+
'IsValid': value.is_valid,
|
|
1207
|
+
'ValidationRules': value.validation_rules
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
return value
|
|
1211
|
+
|
|
1212
|
+
|
|
1213
|
+
class ReportFilterField(Field):
|
|
1214
|
+
def python_value(self, value):
|
|
1215
|
+
if value is not None:
|
|
1216
|
+
return ReportFilter(currency=value.get('Currency', None), user_id=value.get('UserId', None),
|
|
1217
|
+
wallet_id=value.get('WalletId', None), payment_method=value.get('PaymentMethod', None),
|
|
1218
|
+
status=value.get('Status', None), type=value.get('Type', None),
|
|
1219
|
+
intent_id=value.get('IntentId', None),
|
|
1220
|
+
external_provider_name=value.get('ExternalProviderName', None),
|
|
1221
|
+
scheduled=value.get('Scheduled', None))
|
|
1222
|
+
|
|
1223
|
+
return value
|
|
1224
|
+
|
|
1225
|
+
def api_value(self, value):
|
|
1226
|
+
value = super(ReportFilterField, self).api_value(value)
|
|
1227
|
+
|
|
1228
|
+
if isinstance(value, ReportFilter):
|
|
1229
|
+
result = {}
|
|
1230
|
+
if value.currency is not None:
|
|
1231
|
+
result['Currency'] = value.currency
|
|
1232
|
+
if value.user_id is not None:
|
|
1233
|
+
result['UserId'] = value.user_id
|
|
1234
|
+
if value.wallet_id is not None:
|
|
1235
|
+
result['WalletId'] = value.wallet_id
|
|
1236
|
+
if value.payment_method is not None:
|
|
1237
|
+
result['PaymentMethod'] = value.payment_method
|
|
1238
|
+
if value.status is not None:
|
|
1239
|
+
result['Status'] = value.status
|
|
1240
|
+
if value.type is not None:
|
|
1241
|
+
result['Type'] = value.type
|
|
1242
|
+
if value.intent_id is not None:
|
|
1243
|
+
result['IntentId'] = value.intent_id
|
|
1244
|
+
if value.external_provider_name is not None:
|
|
1245
|
+
result['ExternalProviderName'] = value.external_provider_name
|
|
1246
|
+
if value.scheduled is not None:
|
|
1247
|
+
result['Scheduled'] = value.scheduled
|
|
1248
|
+
return result
|
|
1249
|
+
|
|
1250
|
+
return value
|
|
1251
|
+
|
|
1252
|
+
|
|
1253
|
+
class PayInIntentExternalDataField(Field):
|
|
1254
|
+
def python_value(self, value):
|
|
1255
|
+
if value is not None:
|
|
1256
|
+
return PayInIntentExternalData(external_processing_date=value.get('ExternalProcessingDate', None),
|
|
1257
|
+
external_provider_reference=value.get('ExternalProviderReference', None),
|
|
1258
|
+
external_merchant_reference=value.get('ExternalMerchantReference', None),
|
|
1259
|
+
external_provider_name=value.get('ExternalProviderName', None),
|
|
1260
|
+
external_provider_payment_method=value.get('ExternalProviderPaymentMethod',
|
|
1261
|
+
None))
|
|
1262
|
+
|
|
1263
|
+
return value
|
|
1264
|
+
|
|
1265
|
+
def api_value(self, value):
|
|
1266
|
+
value = super(PayInIntentExternalDataField, self).api_value(value)
|
|
1267
|
+
|
|
1268
|
+
if isinstance(value, PayInIntentExternalData):
|
|
1269
|
+
result = {}
|
|
1270
|
+
if value.external_processing_date is not None:
|
|
1271
|
+
result['ExternalProcessingDate'] = value.external_processing_date
|
|
1272
|
+
if value.external_provider_reference is not None:
|
|
1273
|
+
result['ExternalProviderReference'] = value.external_provider_reference
|
|
1274
|
+
if value.external_merchant_reference is not None:
|
|
1275
|
+
result['ExternalMerchantReference'] = value.external_merchant_reference
|
|
1276
|
+
if value.external_provider_name is not None:
|
|
1277
|
+
result['ExternalProviderName'] = value.external_provider_name
|
|
1278
|
+
if value.external_provider_payment_method is not None:
|
|
1279
|
+
result['ExternalProviderPaymentMethod'] = value.external_provider_payment_method
|
|
1280
|
+
return result
|
|
1281
|
+
|
|
1282
|
+
return value
|
|
1283
|
+
|
|
1284
|
+
|
|
1285
|
+
class PayInIntentBuyerField(Field):
|
|
1286
|
+
def python_value(self, value):
|
|
1287
|
+
if value is not None:
|
|
1288
|
+
return PayInIntentBuyer(id=value.get('Id', None))
|
|
1289
|
+
|
|
1290
|
+
return value
|
|
1291
|
+
|
|
1292
|
+
def api_value(self, value):
|
|
1293
|
+
value = super(PayInIntentBuyerField, self).api_value(value)
|
|
1294
|
+
|
|
1295
|
+
if isinstance(value, PayInIntentBuyer):
|
|
1296
|
+
result = {}
|
|
1297
|
+
if value.id is not None:
|
|
1298
|
+
result['Id'] = value.id
|
|
1299
|
+
return result
|
|
1300
|
+
|
|
1301
|
+
return value
|
|
1302
|
+
|
|
1303
|
+
|
|
1304
|
+
class SupportedBanksField(Field):
|
|
1305
|
+
def python_value(self, value):
|
|
1306
|
+
if value is not None:
|
|
1307
|
+
return SupportedBank(countries=value.get('Countries', None))
|
|
1308
|
+
|
|
1309
|
+
return value
|
|
1310
|
+
|
|
1311
|
+
def api_value(self, value):
|
|
1312
|
+
value = super(SupportedBanksField, self).api_value(value)
|
|
1313
|
+
|
|
1314
|
+
if isinstance(value, SupportedBank):
|
|
1315
|
+
result = {}
|
|
1316
|
+
if value.countries is not None:
|
|
1317
|
+
result['Countries'] = value.countries
|
|
1318
|
+
return result
|
|
1319
|
+
|
|
1320
|
+
return value
|
|
1321
|
+
|
|
1322
|
+
|
|
1323
|
+
class VerificationOfPayeeField(Field):
|
|
1324
|
+
def python_value(self, value):
|
|
1325
|
+
if value is not None:
|
|
1326
|
+
return VerificationOfPayee(recipient_verification_id=value.get('RecipientVerificationId', None),
|
|
1327
|
+
recipient_verification_check=value.get('RecipientVerificationCheck', None),
|
|
1328
|
+
recipient_verification_message=value.get('RecipientVerificationMessage', None))
|
|
1329
|
+
|
|
1330
|
+
return value
|
|
1331
|
+
|
|
1332
|
+
def api_value(self, value):
|
|
1333
|
+
value = super(VerificationOfPayeeField, self).api_value(value)
|
|
1334
|
+
|
|
1335
|
+
if isinstance(value, VerificationOfPayee):
|
|
1336
|
+
result = {}
|
|
1337
|
+
if value.recipient_verification_id is not None:
|
|
1338
|
+
result['RecipientVerificationId'] = value.recipient_verification_id
|
|
1339
|
+
if value.recipient_verification_check is not None:
|
|
1340
|
+
result['RecipientVerificationCheck'] = value.recipient_verification_check
|
|
1341
|
+
if value.recipient_verification_message is not None:
|
|
1342
|
+
result['RecipientVerificationMessage'] = value.recipient_verification_message
|
|
1343
|
+
return result
|
|
1344
|
+
|
|
1345
|
+
return value
|