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/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