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