mangopay4-python-sdk 3.58.0__tar.gz → 3.60.0__tar.gz

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.
Files changed (96) hide show
  1. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/PKG-INFO +1 -1
  2. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/constants.py +11 -0
  3. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/fields.py +51 -1
  4. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/resources.py +46 -1
  5. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/utils.py +76 -4
  6. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay4_python_sdk.egg-info/PKG-INFO +1 -1
  7. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/setup.py +1 -1
  8. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_base.py +5 -1
  9. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_identity_verification.py +38 -1
  10. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_payins.py +25 -4
  11. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_users.py +9 -0
  12. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/DESCRIPTION.md +0 -0
  13. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/LICENSE +0 -0
  14. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/MANIFEST.in +0 -0
  15. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/Makefile +0 -0
  16. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/README.md +0 -0
  17. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/__init__.py +0 -0
  18. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/api.py +0 -0
  19. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/auth.py +0 -0
  20. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/base.py +0 -0
  21. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/compat.py +0 -0
  22. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/exceptions.py +0 -0
  23. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/page.py +0 -0
  24. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/query.py +0 -0
  25. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/ratelimit.py +0 -0
  26. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay/signals.py +0 -0
  27. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay4_python_sdk.egg-info/SOURCES.txt +0 -0
  28. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay4_python_sdk.egg-info/dependency_links.txt +0 -0
  29. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay4_python_sdk.egg-info/entry_points.txt +0 -0
  30. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay4_python_sdk.egg-info/requires.txt +0 -0
  31. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/mangopay4_python_sdk.egg-info/top_level.txt +0 -0
  32. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/setup.cfg +0 -0
  33. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/__init__.py +0 -0
  34. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/card.json +0 -0
  35. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/cardregistrations.json +0 -0
  36. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/cardregistrations_update.json +0 -0
  37. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/declarative_user.json +0 -0
  38. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/legal_user.json +0 -0
  39. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/legal_user_wallet.json +0 -0
  40. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/legal_user_wallet_89.json +0 -0
  41. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/legal_user_wallet_99.json +0 -0
  42. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/list_ubo_declarations.json +0 -0
  43. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/natural_user.json +0 -0
  44. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/natural_user_wallet.json +0 -0
  45. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/natural_user_wallet_9.json +0 -0
  46. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/ubo.json +0 -0
  47. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/ubo_declaration.json +0 -0
  48. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/ubo_declaration_submit.json +0 -0
  49. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/ubo_update.json +0 -0
  50. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/user_list_2_per_page.json +0 -0
  51. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/user_list_2_per_page_page1.json +0 -0
  52. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/user_list_3_per_page_page2.json +0 -0
  53. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/user_list_full.json +0 -0
  54. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/user_list_page1.json +0 -0
  55. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/fixtures/user_wallet.json +0 -0
  56. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/images/image.jpg +0 -0
  57. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/mocks.py +0 -0
  58. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/resources/TestKycPageFile.png +0 -0
  59. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/resources/settlement_sample.csv +0 -0
  60. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/resources/settlement_sample_bad_footer.csv +0 -0
  61. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/resources/settlement_sample_bad_line.csv +0 -0
  62. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/resources.py +0 -0
  63. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/settings.py +0 -0
  64. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_acquiring.py +0 -0
  65. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_bankaccounts.py +0 -0
  66. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_banking_aliases.py +0 -0
  67. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_cards.py +0 -0
  68. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_client_wallets.py +0 -0
  69. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_clients.py +0 -0
  70. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_conversion.py +0 -0
  71. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_country_authorizations.py +0 -0
  72. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_deposits.py +0 -0
  73. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_disputes.py +0 -0
  74. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_documentconsult.py +0 -0
  75. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_emoney.py +0 -0
  76. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_idempotency.py +0 -0
  77. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_kyc_document.py +0 -0
  78. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_kycs.py +0 -0
  79. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_mandates.py +0 -0
  80. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_notifications.py +0 -0
  81. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_payouts.py +0 -0
  82. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_preauthorizations.py +0 -0
  83. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_rate_limit.py +0 -0
  84. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_recipients.py +0 -0
  85. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_refunds.py +0 -0
  86. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_reports.py +0 -0
  87. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_reports_v2.py +0 -0
  88. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_repudiations.py +0 -0
  89. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_settlements.py +0 -0
  90. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_tokens.py +0 -0
  91. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_transactions.py +0 -0
  92. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_transfers.py +0 -0
  93. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_ubos.py +0 -0
  94. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_utils.py +0 -0
  95. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_virtual_account.py +0 -0
  96. {mangopay4_python_sdk-3.58.0 → mangopay4_python_sdk-3.60.0}/tests/test_wallets.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mangopay4-python-sdk
3
- Version: 3.58.0
3
+ Version: 3.60.0
4
4
  Summary: A client library written in python to work with mangopay v2 api
5
5
  Home-page: https://github.com/Mangopay/mangopay2-python-sdk
6
6
  Author: Mangopay (www.mangopay.com)
@@ -223,6 +223,17 @@ EVENT_TYPE_CHOICES = Choices(
223
223
  ('IDENTITY_VERIFICATION_OUTDATED', 'identity_verification_outdated', 'Identity Verification Outdated'),
224
224
  ('IDENTITY_VERIFICATION_TIMEOUT', 'identity_verification_timeout', 'Identity Verification Timeout'),
225
225
  ('IDENTITY_VERIFICATION_PENDING', 'identity_verification_pending', 'Identity Verification Pending'),
226
+ ('IDENTITY_VERIFICATION_EXPIRED', 'identity_verification_expired', 'Identity Verification Expired'),
227
+ ('IDENTITY_VERIFICATION_PENDING_PSC_ACTION', 'identity_verification_pending_psc_action',
228
+ 'Identity Verification Pending PSC Action'),
229
+ ('IDENTITY_VERIFICATION_PSC_PENDING', 'identity_verification_psc_pending',
230
+ 'Identity Verification PSC Pending'),
231
+ ('IDENTITY_VERIFICATION_PSC_VALIDATED', 'identity_verification_psc_validated',
232
+ 'Identity Verification PSC Validated'),
233
+ ('IDENTITY_VERIFICATION_PSC_REJECTED', 'identity_verification_psc_rejected',
234
+ 'Identity Verification PSC Rejected'),
235
+ ('IDENTITY_VERIFICATION_PSC_ABANDONED', 'identity_verification_psc_abandoned',
236
+ 'Identity Verification PSC Abandoned'),
226
237
 
227
238
  ('RECIPIENT_ACTIVE', 'recipient_active', 'Recipient Active'),
228
239
  ('RECIPIENT_CANCELED', 'recipient_canceled', 'Recipient Canceled'),
@@ -16,7 +16,7 @@ from .utils import timestamp_from_datetime, timestamp_from_date, Money, DebitedB
16
16
  CompanyNumberValidation, ReportFilter, PayInIntentExternalData, PayInIntentBuyer, SupportedBank, \
17
17
  VerificationOfPayee, PayInIntentRefund, PayInIntentCapture, PayInIntentDispute, CustomFees, MarginsResponse, \
18
18
  UserMargin, ConsentScope, AuthenticationResult, FlowDescriptor, SettlementFooterError, SettlementLineError, \
19
- SettlementLineErrorDetail
19
+ SettlementLineErrorDetail, AccountFunding, AccountFundingSender, KycInformation
20
20
 
21
21
 
22
22
  class FieldDescriptor(object):
@@ -840,6 +840,26 @@ class ScopeBlockedField(Field):
840
840
  return value
841
841
 
842
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
+
843
863
  class ShippingField(Field):
844
864
  def python_value(self, value):
845
865
  if value is not None:
@@ -1599,4 +1619,34 @@ class SettlementLinesErrorsField(Field):
1599
1619
 
1600
1620
  return value
1601
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
+
1602
1652
  return value
@@ -22,7 +22,8 @@ from .fields import (PrimaryKeyField, EmailField, CharField,
22
22
  PayInIntentExternalDataField, PayInIntentBuyerField, SupportedBanksField, VerificationOfPayeeField,
23
23
  PayInIntentRefundField, PayInIntentCaptureField, PayInIntentDisputeField, CustomFeesField,
24
24
  UserMarginField, MarginsResponseField, ConsentScopeField, AuthenticationResultField,
25
- FlowDescriptorField, SettlementFooterErrorsField, SettlementLinesErrorsField)
25
+ FlowDescriptorField, SettlementFooterErrorsField, SettlementLinesErrorsField,
26
+ AccountFundingField, KycInformationField)
26
27
  from .query import InsertQuery, UpdateQuery, SelectQuery, ActionQuery, DeleteQuery
27
28
 
28
29
 
@@ -1341,6 +1342,7 @@ class DirectPayIn(PayIn):
1341
1342
  preferred_card_network = CharField(api_name='PreferredCardNetwork')
1342
1343
  card_info = CardInfoField(api_name='CardInfo')
1343
1344
  payment_category = CharField(api_name='PaymentCategory')
1345
+ account_funding = AccountFundingField(api_name='AccountFunding')
1344
1346
 
1345
1347
  class Meta:
1346
1348
  verbose_name = 'payin'
@@ -3036,6 +3038,7 @@ class Ubo(BaseModel):
3036
3038
  class UserBlockStatus(BaseModel):
3037
3039
  scope_blocked = ScopeBlockedField(api_name='ScopeBlocked', required=True)
3038
3040
  action_code = CharField(api_name='ActionCode', required=True)
3041
+ kyc_information = KycInformationField(api_name='KycInformation')
3039
3042
 
3040
3043
  class Meta:
3041
3044
  verbose_name = 'userblockstatus'
@@ -3302,6 +3305,7 @@ class IdentityVerification(BaseModel):
3302
3305
  last_update = DateTimeField(api_name='UpdateDate')
3303
3306
  user_id = CharField(api_name='UserId')
3304
3307
  checks = ListField(api_name='Checks')
3308
+ pscs = ListField(api_name='PSCs')
3305
3309
 
3306
3310
  class Meta:
3307
3311
  verbose_name = 'identity_verification'
@@ -3327,6 +3331,40 @@ class IdentityVerification(BaseModel):
3327
3331
  return select.all(*args, **kwargs)
3328
3332
 
3329
3333
 
3334
+ class Psc(BaseModel):
3335
+ first_name = CharField(api_name='FirstName')
3336
+ last_name = CharField(api_name='LastName')
3337
+ email = CharField(api_name='Email')
3338
+ date_of_birth = DateField(api_name='DateOfBirth')
3339
+ country = CharField(api_name='Country')
3340
+ nationality = CharField(api_name='Nationality')
3341
+ psc_type = CharField(api_name='PscType')
3342
+ status = CharField(api_name='Status')
3343
+ validation_date = DateTimeField(api_name='ValidationDate')
3344
+ hosted_url = CharField(api_name='HostedUrl')
3345
+ data = ListField(api_name='Data')
3346
+ last_update = DateTimeField(api_name='LastUpdate')
3347
+
3348
+ class Meta:
3349
+ verbose_name = 'psc'
3350
+ verbose_name_plural = 'pscs'
3351
+
3352
+ url = {
3353
+ 'RETRY': '/identity-verifications/%(identity_verification_id)s/pscs/%(psc_id)s/retry'
3354
+ }
3355
+
3356
+ @classmethod
3357
+ def retry(cls, identity_verification_id, psc_id, **kwargs):
3358
+ """Request the retry of a PSC session.
3359
+
3360
+ The keyword arguments can be empty or contain the values to be updated.
3361
+ """
3362
+ path_params = {'identity_verification_id': identity_verification_id, 'psc_id': psc_id}
3363
+ update = UpdateQuery(Psc, None, path_params, **kwargs)
3364
+ update.identifier = 'RETRY'
3365
+ return update.execute()
3366
+
3367
+
3330
3368
  class RecipientSchema(BaseModel):
3331
3369
  display_name = RecipientPropertySchemaField(api_name='DisplayName')
3332
3370
  payout_method_type = RecipientPropertySchemaField(api_name='PayoutMethodType')
@@ -3425,6 +3463,7 @@ class PayInIntent(BaseModel):
3425
3463
  'REVERSE_REFUND': '/payins/intents/%(intent_id)s/refunds/%(refund_id)s/reverse',
3426
3464
  'CREATE_DISPUTE': '/payins/intents/%(intent_id)s/captures/%(capture_id)s/disputes',
3427
3465
  'UPDATE_DISPUTE_OUTCOME': '/payins/intents/%(intent_id)s/captures/%(capture_id)s/disputes/%(dispute_id)s/decision',
3466
+ 'GET_EXTERNAL_PROVIDERS_LIST': '/payins/intents/external-providers',
3428
3467
  }
3429
3468
 
3430
3469
  def create_authorization(self, idempotency_key=None, **kwargs):
@@ -3481,6 +3520,12 @@ class PayInIntent(BaseModel):
3481
3520
  update.identifier = 'UPDATE_DISPUTE_OUTCOME'
3482
3521
  return update.execute(is_v3=True)
3483
3522
 
3523
+ @classmethod
3524
+ def get_external_providers_list(cls, *args, **kwargs):
3525
+ select = SelectQuery(PayInIntent, *args, **kwargs)
3526
+ select.identifier = 'GET_EXTERNAL_PROVIDERS_LIST'
3527
+ return select.get("", is_v3=True, strict_dict_parsing=False, *args, **kwargs)
3528
+
3484
3529
 
3485
3530
  class Settlement(BaseModel):
3486
3531
  settlement_id = CharField(api_name='SettlementId')
@@ -570,6 +570,53 @@ class Shipping(object):
570
570
  (self.first_name, self.last_name, self.address)
571
571
 
572
572
 
573
+ @add_camelcase_aliases
574
+ class AccountFundingSender(object):
575
+ def __init__(self, first_name=None, last_name=None, address=None, email=None, birthday=None,
576
+ nationality=None, occupation=None, birth_country=None):
577
+ self.first_name = first_name
578
+ self.last_name = last_name
579
+ self.address = address
580
+ self.email = email
581
+ self.birthday = birthday
582
+ self.nationality = nationality
583
+ self.occupation = occupation
584
+ self.birth_country = birth_country
585
+
586
+ def __str__(self):
587
+ return 'AccountFundingSender: %s %s' % (self.first_name, self.last_name)
588
+
589
+ def to_api_json(self):
590
+ return {
591
+ 'FirstName': self.first_name,
592
+ 'LastName': self.last_name,
593
+ 'Address': self.address,
594
+ 'Email': self.email,
595
+ 'Birthday': self.birthday,
596
+ 'Nationality': self.nationality,
597
+ 'Occupation': self.occupation,
598
+ 'BirthCountry': self.birth_country
599
+ }
600
+
601
+
602
+ @add_camelcase_aliases
603
+ class AccountFunding(object):
604
+ def __init__(self, sender=None, purpose=None, type=None):
605
+ self.sender = sender
606
+ self.purpose = purpose
607
+ self.type = type
608
+
609
+ def __str__(self):
610
+ return 'AccountFunding: %s, %s' % (self.purpose, self.type)
611
+
612
+ def to_api_json(self):
613
+ return {
614
+ 'Sender': self.sender,
615
+ 'Purpose': self.purpose,
616
+ 'Type': self.type
617
+ }
618
+
619
+
573
620
  @add_camelcase_aliases
574
621
  class CurrentState(object):
575
622
  def __init__(self, payins_linked=None, cumulated_debited_amount=None, cumulated_debited_fees=None,
@@ -607,6 +654,29 @@ class ScopeBlocked(object):
607
654
  }
608
655
 
609
656
 
657
+ @add_camelcase_aliases
658
+ class KycInformation(object):
659
+ def __init__(self, last_kyc_date=None, kyc_renewal_deadline=None):
660
+ self.last_kyc_date = last_kyc_date
661
+ self.kyc_renewal_deadline = kyc_renewal_deadline
662
+
663
+ def __str__(self):
664
+ return 'KycInformation: %s, %s' % (self.last_kyc_date, self.kyc_renewal_deadline)
665
+
666
+ def __eq__(self, other):
667
+ if isinstance(other, KycInformation):
668
+ stat = ((self.last_kyc_date == other.last_kyc_date) and
669
+ (self.kyc_renewal_deadline == other.kyc_renewal_deadline))
670
+ return stat
671
+ return False
672
+
673
+ def to_api_json(self):
674
+ return {
675
+ "LastKycDate": self.last_kyc_date,
676
+ "KycRenewalDeadline": self.kyc_renewal_deadline,
677
+ }
678
+
679
+
610
680
  # This code belongs to https://github.com/carljm/django-model-utils
611
681
  class Choices(object):
612
682
  """
@@ -1521,7 +1591,7 @@ class PayInIntentSeller(object):
1521
1591
  @add_camelcase_aliases
1522
1592
  class IntentSplit(object):
1523
1593
  def __init__(self, line_item_id=None, wallet_id=None, seller_id=None, split_amount=None, fees_amount=None,
1524
- transfer_date=None, description=None, status=None):
1594
+ transfer_date=None, description=None, status=None, tag=None):
1525
1595
  self.line_item_id = line_item_id
1526
1596
  self.wallet_id = wallet_id
1527
1597
  self.seller_id = seller_id
@@ -1530,11 +1600,12 @@ class IntentSplit(object):
1530
1600
  self.description = description
1531
1601
  self.status = status
1532
1602
  self.transfer_date = transfer_date
1603
+ self.tag = tag
1533
1604
 
1534
1605
  def __str__(self):
1535
- return 'PayInIntentSplit: %s %s %s %s %s %s %s %s' % \
1606
+ return 'PayInIntentSplit: %s %s %s %s %s %s %s %s %s' % \
1536
1607
  (self.line_item_id, self.wallet_id, self.seller_id, self.split_amount, self.fees_amount, self.description,
1537
- self.status, self.transfer_date)
1608
+ self.status, self.transfer_date, self.tag)
1538
1609
 
1539
1610
  def to_api_json(self):
1540
1611
  return {
@@ -1545,7 +1616,8 @@ class IntentSplit(object):
1545
1616
  "FeesAmount": self.fees_amount,
1546
1617
  "Description": self.description,
1547
1618
  "Status": self.status,
1548
- "TransferDate": self.transfer_date
1619
+ "TransferDate": self.transfer_date,
1620
+ "Tag": self.tag
1549
1621
  }
1550
1622
 
1551
1623
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mangopay4-python-sdk
3
- Version: 3.58.0
3
+ Version: 3.60.0
4
4
  Summary: A client library written in python to work with mangopay v2 api
5
5
  Home-page: https://github.com/Mangopay/mangopay2-python-sdk
6
6
  Author: Mangopay (www.mangopay.com)
@@ -10,7 +10,7 @@ with open(path.join(here, 'DESCRIPTION.md'), encoding='utf-8') as f:
10
10
 
11
11
  setup(
12
12
  name='mangopay4-python-sdk',
13
- version='3.58.0',
13
+ version='3.60.0',
14
14
  description='A client library written in python to work with mangopay v2 api',
15
15
  long_description='This SDK is a client library for interacting with the Mangopay API.',
16
16
  url='https://github.com/Mangopay/mangopay2-python-sdk',
@@ -873,6 +873,7 @@ class BaseTestLive(unittest.TestCase):
873
873
  intent_authorization.external_data = external_data
874
874
  intent_authorization.line_items = line_items
875
875
  intent_authorization.buyer = buyer
876
+ intent_authorization.tag = 'Intent tag'
876
877
  return PayInIntent(**intent_authorization.create_authorization())
877
878
 
878
879
  @staticmethod
@@ -908,11 +909,13 @@ class BaseTestLive(unittest.TestCase):
908
909
  intent_authorization.external_data = external_data
909
910
  intent_authorization.line_items = line_items
910
911
  intent_authorization.buyer = buyer
912
+ intent_authorization.tag = 'Intent tag'
911
913
 
912
914
  intent = PayInIntent(**intent_authorization.create_authorization())
913
915
 
914
916
  full_capture = PayInIntent()
915
917
  full_capture.external_data = external_data
918
+ full_capture.tag = 'Intent tag'
916
919
 
917
920
  return PayInIntent(**full_capture.create_capture(intent.id))
918
921
 
@@ -928,7 +931,8 @@ class BaseTestLive(unittest.TestCase):
928
931
  external_data.external_provider_payment_method = 'PAYPAL'
929
932
 
930
933
  refund_dto = {
931
- 'external_data': external_data
934
+ 'external_data': external_data,
935
+ 'tag': 'Intent tag'
932
936
  }
933
937
  return PayInIntent(**PayInIntent.create_refund(full_capture.id, **refund_dto))
934
938
 
@@ -1,9 +1,14 @@
1
- from mangopay.resources import IdentityVerification
1
+ import unittest
2
+ import uuid
3
+
4
+ from mangopay.resources import IdentityVerification, Psc
2
5
  from tests.test_base import BaseTestLive
3
6
 
4
7
 
5
8
  class IdentityVerificationTest(BaseTestLive):
6
9
  _identity_verification = None
10
+ _idv_id_with_pscs = 'idnver_01KZXBHDH1DWC887PW6T46NVTV'
11
+ _psc_id = 'psc_x_01KZXBT5F8FGGSK9JXGCYMNWRP'
7
12
 
8
13
  def test_create_identity_verification(self):
9
14
  self.create_new_identity_verification()
@@ -30,6 +35,38 @@ class IdentityVerificationTest(BaseTestLive):
30
35
  self.assertIsInstance(fetched.data, list)
31
36
  self.assertTrue(len(fetched.data) > 0)
32
37
 
38
+ def test_get_identity_verification_with_pscs(self):
39
+ fetched = IdentityVerification.get(IdentityVerificationTest._idv_id_with_pscs)
40
+
41
+ self.assertIsNotNone(fetched)
42
+ self.assertIsNotNone(fetched.pscs)
43
+ self.assertTrue(len(fetched.pscs) > 0)
44
+ self.assertTrue(len(fetched.pscs[0]['Data']) > 0)
45
+
46
+ @unittest.skip("PSC must be manually invalidated before testing")
47
+ def test_retry_psc_without_update_params(self):
48
+ psc = Psc(**Psc.retry(IdentityVerificationTest._idv_id_with_pscs, IdentityVerificationTest._psc_id))
49
+
50
+ self.assertIsNotNone(psc)
51
+ self.assertIsNotNone(psc.hosted_url)
52
+ self.assertEqual('PENDING_VALIDATION', psc.status)
53
+
54
+ @unittest.skip("PSC must be manually invalidated before testing")
55
+ def test_retry_psc_with_update_params(self):
56
+ first_name = str(uuid.uuid4())
57
+ last_name = str(uuid.uuid4())
58
+
59
+ psc = Psc(**Psc.retry(IdentityVerificationTest._idv_id_with_pscs,
60
+ IdentityVerificationTest._psc_id,
61
+ first_name=first_name,
62
+ last_name=last_name))
63
+
64
+ self.assertIsNotNone(psc)
65
+ self.assertIsNotNone(psc.hosted_url)
66
+ self.assertEqual('PENDING_VALIDATION', psc.status)
67
+ self.assertEqual(first_name, psc.first_name)
68
+ self.assertEqual(last_name, psc.last_name)
69
+
33
70
  @staticmethod
34
71
  def create_new_identity_verification():
35
72
  if IdentityVerificationTest._identity_verification is None:
@@ -738,6 +738,7 @@ def create_new_splits(intent):
738
738
  split = IntentSplit()
739
739
  split.line_item_id = intent.line_items[0]['Id']
740
740
  split.split_amount = 10
741
+ split.tag = 'custom tag'
741
742
 
742
743
  intent_splits = PayInIntentSplits()
743
744
  intent_splits.splits = [split]
@@ -2343,16 +2344,19 @@ class PayInsTestLive(BaseTestLive):
2343
2344
  self.assertEqual('AUTHORIZED', created.status)
2344
2345
  self.assertIsNotNone(created.unfunded_amount)
2345
2346
  self.assertIsNotNone(created.line_items[0]['UnfundedSellerAmount'])
2347
+ self.assertEqual('Intent tag', created.tag)
2346
2348
 
2347
2349
  def test_create_pay_in_intent_full_capture(self):
2348
2350
  created = BaseTestLive.create_new_pay_in_intent_full_capture()
2349
2351
 
2350
2352
  self.assertIsNotNone(created)
2351
2353
  self.assertEqual('CAPTURED', created.status)
2354
+ self.assertEqual('Intent tag', created.tag)
2352
2355
 
2353
2356
  def test_create_full_pay_in_intent_refund(self):
2354
2357
  refund = BaseTestLive.create_new_full_pay_in_intent_refund()
2355
2358
  self.assertEqual('REFUNDED', refund.status)
2359
+ self.assertEqual('Intent tag', refund.tag)
2356
2360
 
2357
2361
  def test_create_partial_pay_in_intent_refund(self):
2358
2362
  full_capture = BaseTestLive.create_new_pay_in_intent_full_capture()
@@ -2367,6 +2371,7 @@ class PayInsTestLive(BaseTestLive):
2367
2371
  refund_dto = {
2368
2372
  'external_data': external_data,
2369
2373
  'amount': 1000,
2374
+ 'tag': 'Intent tag',
2370
2375
  'line_items': [
2371
2376
  {
2372
2377
  'id': full_capture.line_items[0]['Id'],
@@ -2376,6 +2381,7 @@ class PayInsTestLive(BaseTestLive):
2376
2381
  }
2377
2382
  refund = PayInIntent(**PayInIntent.create_refund(full_capture.id, **refund_dto))
2378
2383
  self.assertEqual('REFUNDED', refund.status)
2384
+ self.assertEqual('Intent tag', refund.tag)
2379
2385
 
2380
2386
  def test_fully_reverse_pay_in_intent_refund(self):
2381
2387
  refund = BaseTestLive.create_new_full_pay_in_intent_refund()
@@ -2426,9 +2432,9 @@ class PayInsTestLive(BaseTestLive):
2426
2432
  external_data = PayInIntentExternalData()
2427
2433
  external_data.external_processing_date = '01-10-2026'
2428
2434
  external_data.external_provider_reference = ''.join(random.choices(string.ascii_letters + string.digits, k=10))
2429
- external_data.external_merchant_reference = 'Order-xyz-35e8490e-2ec9-4c82-978e-c712a3f5ba16'
2435
+ # external_data.external_merchant_reference = 'Order-xyz-35e8490e-2ec9-4c82-978e-c712a3f5ba16'
2430
2436
  external_data.external_provider_name = 'Stripe'
2431
- external_data.external_provider_payment_method = 'PAYPAL'
2437
+ # external_data.external_provider_payment_method = 'PAYPAL'
2432
2438
 
2433
2439
  line_item = PayInIntentLineItem()
2434
2440
  line_item.id = intent.line_items[0]['Id']
@@ -2452,6 +2458,7 @@ class PayInsTestLive(BaseTestLive):
2452
2458
  fetched = PayInIntent.get(intent.id)
2453
2459
  self.assertIsNotNone(fetched)
2454
2460
  self.assertEqual(fetched.status, intent.status)
2461
+ self.assertEqual(intent.tag, fetched.tag)
2455
2462
 
2456
2463
  def test_cancel_pay_in_intent(self):
2457
2464
  intent = BaseTestLive.create_new_pay_in_intent_authorization()
@@ -2464,12 +2471,19 @@ class PayInsTestLive(BaseTestLive):
2464
2471
  cancelled = PayInIntent(**PayInIntent.cancel(intent.id, **cancel_details))
2465
2472
  self.assertEqual(cancelled.status, 'CANCELLED')
2466
2473
 
2474
+ def test_get_external_providers_list(self):
2475
+ providers = PayInIntent.get_external_providers_list()
2476
+ self.assertIsNotNone(providers)
2477
+ self.assertTrue(len(providers) > 0)
2478
+ self.assertIn('Mangopay', providers)
2479
+
2467
2480
  def test_create_pay_in_intent_splits(self):
2468
2481
  intent = BaseTestLive.create_new_pay_in_intent_authorization()
2469
2482
  created_splits = create_new_splits(intent)
2470
2483
 
2471
2484
  self.assertIsNotNone(created_splits)
2472
2485
  self.assertEqual('CREATED', created_splits.splits[0]['Status'])
2486
+ self.assertIsNotNone(created_splits.splits[0]['Tag'])
2473
2487
 
2474
2488
  def test_execute_split(self):
2475
2489
  intent = BaseTestLive.create_new_pay_in_intent_authorization()
@@ -2494,6 +2508,7 @@ class PayInsTestLive(BaseTestLive):
2494
2508
  created_splits = create_new_splits(intent)
2495
2509
  fetched = PayInIntentSplit.get(intent.id, created_splits.splits[0]['Id'])
2496
2510
  self.assertEqual('CREATED', fetched.status)
2511
+ self.assertIsNotNone(fetched.tag)
2497
2512
 
2498
2513
  def test_update_split(self):
2499
2514
  intent = BaseTestLive.create_new_pay_in_intent_authorization()
@@ -2503,10 +2518,12 @@ class PayInsTestLive(BaseTestLive):
2503
2518
  created_splits.splits[0]['Id'],
2504
2519
  **{
2505
2520
  'description': 'updated description',
2506
- 'line_item_id': created_splits.splits[0]['LineItemId']
2521
+ 'line_item_id': created_splits.splits[0]['LineItemId'],
2522
+ 'tag': 'updated tag'
2507
2523
  }
2508
2524
  )
2509
2525
  self.assertEqual('updated description', updated['description'])
2526
+ self.assertEqual('updated tag', updated['tag'])
2510
2527
 
2511
2528
  def test_create_client_bank_wire_direct_payin(self):
2512
2529
  pay_in = ClientBankWireDirectPayIn()
@@ -2575,10 +2592,12 @@ class PayInsTestLive(BaseTestLive):
2575
2592
  external_data.external_provider_payment_method = 'PAYPAL'
2576
2593
 
2577
2594
  create_dto = {
2578
- 'external_data': external_data
2595
+ 'external_data': external_data,
2596
+ 'tag': 'Intent tag'
2579
2597
  }
2580
2598
  dispute = PayInIntent(**PayInIntent.create_dispute(full_capture.id, full_capture.capture.id, **create_dto))
2581
2599
  self.assertEqual('DISPUTED', dispute.status)
2600
+ self.assertEqual('Intent tag', dispute.tag)
2582
2601
 
2583
2602
  def test_create_partial_pay_in_intent_dispute(self):
2584
2603
  full_capture = BaseTestLive.create_new_pay_in_intent_full_capture()
@@ -2593,6 +2612,7 @@ class PayInsTestLive(BaseTestLive):
2593
2612
  create_dto = {
2594
2613
  'external_data': external_data,
2595
2614
  'amount': 1000,
2615
+ 'tag': 'Intent tag',
2596
2616
  'line_items': [
2597
2617
  {
2598
2618
  'id': full_capture.line_items[0]['Id'],
@@ -2602,6 +2622,7 @@ class PayInsTestLive(BaseTestLive):
2602
2622
  }
2603
2623
  dispute = PayInIntent(**PayInIntent.create_dispute(full_capture.id, full_capture.capture.id, **create_dto))
2604
2624
  self.assertEqual('DISPUTED', dispute.status)
2625
+ self.assertEqual('Intent tag', dispute.tag)
2605
2626
 
2606
2627
  def test_update_intent_dispute_outcome(self):
2607
2628
  full_capture = BaseTestLive.create_new_pay_in_intent_full_capture()
@@ -918,6 +918,15 @@ class PayInsTestLive(BaseTestLive):
918
918
 
919
919
  self.assertIsNotNone(regulatory)
920
920
 
921
+ def test_User_get_regulatory_with_kyc_information(self):
922
+ user = NaturalUser.get('user_m_01M114G394FJCE0QZJP97QADYZ')
923
+ regulatory = user.get_regulatory()
924
+
925
+ self.assertIsNotNone(regulatory)
926
+ self.assertIsNotNone(regulatory.kyc_information)
927
+ self.assertIsNotNone(regulatory.kyc_information.last_kyc_date)
928
+ self.assertIsNotNone(regulatory.kyc_information.kyc_renewal_deadline)
929
+
921
930
  def test_Users_CloseNatural(self):
922
931
  user = BaseTestLive.get_john_instance()
923
932
  NaturalUser(**user.save())