From 2cc091601d9f7ea749b6cd1b0ea143e1e3dd95c6 Mon Sep 17 00:00:00 2001 From: rogelioLpz Date: Mon, 4 Apr 2022 11:03:59 -0500 Subject: [PATCH 01/12] limited wallets --- cuenca/cuenca_validations.py | 12 +++++++++ cuenca/resources/limited_wallets.py | 38 +++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 cuenca/cuenca_validations.py create mode 100644 cuenca/resources/limited_wallets.py diff --git a/cuenca/cuenca_validations.py b/cuenca/cuenca_validations.py new file mode 100644 index 00000000..3517d14b --- /dev/null +++ b/cuenca/cuenca_validations.py @@ -0,0 +1,12 @@ +from typing import Optional + +from cuenca_validations.types.identities import CurpField, Rfc +from cuenca_validations.types.requests import BaseRequest + + +# TODO: move to cuenca_validations +class LimitedWalletRequest(BaseRequest): + allowed_curp: CurpField + allowed_rfc: Optional[Rfc] + + diff --git a/cuenca/resources/limited_wallets.py b/cuenca/resources/limited_wallets.py new file mode 100644 index 00000000..7d674beb --- /dev/null +++ b/cuenca/resources/limited_wallets.py @@ -0,0 +1,38 @@ +from dataclasses import dataclass +from typing import ClassVar, Optional, cast + +from clabe import Clabe +from cuenca_validations.types import AccountQuery +from cuenca_validations.types.identities import CurpField, Rfc + +from ..cuenca_validations import LimitedWalletRequest +from .base import Wallet + + +@dataclass +class LimitedWallet(Wallet): + _resource: ClassVar = 'limited_wallets' + _query_params: ClassVar = AccountQuery + account_number: Clabe + allowed_rfc: Rfc + allowed_curp = CurpField + + @classmethod + def create( + cls, + allowed_curp: Optional[CurpField] = None, + allowed_rfc: Optional[Rfc] = None, + ) -> 'LimitedWallet': + """ + Limited wallet is a special sub-account that allow receive + spei deposits only from accounts with specific CURP or RFC + + Args: + allowed_curp: Valid CURP in accounts to acept deposits. + allowed_rfc: Valid RFC in acounts to acept deposits + """ + request = LimitedWalletRequest( + allowed_curp=allowed_curp, + allowed_rfc=allowed_rfc, + ) + return cast('LimitedWallet', cls._create(**request.dict())) From c0e3dca85600b8d878c205f372884c4698e37f42 Mon Sep 17 00:00:00 2001 From: rogelioLpz Date: Mon, 4 Apr 2022 11:06:11 -0500 Subject: [PATCH 02/12] lint --- cuenca/cuenca_validations.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cuenca/cuenca_validations.py b/cuenca/cuenca_validations.py index 3517d14b..98517464 100644 --- a/cuenca/cuenca_validations.py +++ b/cuenca/cuenca_validations.py @@ -8,5 +8,3 @@ class LimitedWalletRequest(BaseRequest): allowed_curp: CurpField allowed_rfc: Optional[Rfc] - - From e5ca21f2f3a4b71084c3fd2ac539be359dcbe7bb Mon Sep 17 00:00:00 2001 From: rogelioLpz Date: Mon, 4 Apr 2022 15:30:50 -0500 Subject: [PATCH 03/12] cuenca validations --- cuenca/cuenca_validations.py | 10 ---------- cuenca/resources/limited_wallets.py | 18 +++++++++++------- requirements.txt | 2 +- 3 files changed, 12 insertions(+), 18 deletions(-) delete mode 100644 cuenca/cuenca_validations.py diff --git a/cuenca/cuenca_validations.py b/cuenca/cuenca_validations.py deleted file mode 100644 index 98517464..00000000 --- a/cuenca/cuenca_validations.py +++ /dev/null @@ -1,10 +0,0 @@ -from typing import Optional - -from cuenca_validations.types.identities import CurpField, Rfc -from cuenca_validations.types.requests import BaseRequest - - -# TODO: move to cuenca_validations -class LimitedWalletRequest(BaseRequest): - allowed_curp: CurpField - allowed_rfc: Optional[Rfc] diff --git a/cuenca/resources/limited_wallets.py b/cuenca/resources/limited_wallets.py index 7d674beb..3f0a0d6c 100644 --- a/cuenca/resources/limited_wallets.py +++ b/cuenca/resources/limited_wallets.py @@ -2,10 +2,13 @@ from typing import ClassVar, Optional, cast from clabe import Clabe -from cuenca_validations.types import AccountQuery -from cuenca_validations.types.identities import CurpField, Rfc +from cuenca_validations.types import ( + AccountQuery, + CurpField, + LimitedWalletRequest, + Rfc, +) -from ..cuenca_validations import LimitedWalletRequest from .base import Wallet @@ -24,12 +27,13 @@ def create( allowed_rfc: Optional[Rfc] = None, ) -> 'LimitedWallet': """ - Limited wallet is a special sub-account that allow receive - spei deposits only from accounts with specific CURP or RFC + Limited wallet is a special sub-account to receive money only from + specific person, SPEI Deposits will be accepted only if the sender + account curp/rfc match with registered data Args: - allowed_curp: Valid CURP in accounts to acept deposits. - allowed_rfc: Valid RFC in acounts to acept deposits + allowed_curp: Valid CURP + allowed_rfc: Valid RFC """ request = LimitedWalletRequest( allowed_curp=allowed_curp, diff --git a/requirements.txt b/requirements.txt index a1f07bb8..9eb1182c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ requests==2.27.1 -cuenca-validations==0.10.0 +cuenca-validations==0.10.1.dev2 dataclasses>=0.7;python_version<"3.7" From 530811f0ca89410d566cd6589a205f93b07369f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20L=C3=B3pez?= Date: Tue, 5 Apr 2022 11:13:32 -0500 Subject: [PATCH 04/12] add LimitedWallet model to resources package --- cuenca/__init__.py | 2 ++ cuenca/resources/__init__.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/cuenca/__init__.py b/cuenca/__init__.py index b3216216..7da97f5d 100644 --- a/cuenca/__init__.py +++ b/cuenca/__init__.py @@ -17,6 +17,7 @@ 'FileBatch', 'Identity', 'IdentityEvent', + 'LimitedWallet', 'LoginToken', 'Saving', 'ServiceProvider', @@ -56,6 +57,7 @@ FileBatch, Identity, IdentityEvent, + LimitedWallet, LoginToken, Saving, ServiceProvider, diff --git a/cuenca/resources/__init__.py b/cuenca/resources/__init__.py index 221d7c80..5330ed1d 100644 --- a/cuenca/resources/__init__.py +++ b/cuenca/resources/__init__.py @@ -16,6 +16,7 @@ 'FileBatch', 'Identity', 'IdentityEvent', + 'LimitedWallet', 'LoginToken', 'Saving', 'ServiceProvider', @@ -48,6 +49,7 @@ from .files import File from .identities import Identity from .identity_events import IdentityEvent +from .limited_wallets import LimitedWallet from .login_tokens import LoginToken from .resources import RESOURCES from .savings import Saving @@ -83,6 +85,7 @@ FileBatch, Identity, IdentityEvent, + LimitedWallet, LoginToken, Saving, Session, From 3e63984f7337ac2ef14d3fa310f6880a5a23652f Mon Sep 17 00:00:00 2001 From: rogelioLpz Date: Tue, 5 Apr 2022 16:57:01 -0500 Subject: [PATCH 05/12] resource --- cuenca/__init__.py | 2 ++ cuenca/resources/__init__.py | 3 +++ cuenca/version.py | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cuenca/__init__.py b/cuenca/__init__.py index b3216216..7da97f5d 100644 --- a/cuenca/__init__.py +++ b/cuenca/__init__.py @@ -17,6 +17,7 @@ 'FileBatch', 'Identity', 'IdentityEvent', + 'LimitedWallet', 'LoginToken', 'Saving', 'ServiceProvider', @@ -56,6 +57,7 @@ FileBatch, Identity, IdentityEvent, + LimitedWallet, LoginToken, Saving, ServiceProvider, diff --git a/cuenca/resources/__init__.py b/cuenca/resources/__init__.py index 221d7c80..5330ed1d 100644 --- a/cuenca/resources/__init__.py +++ b/cuenca/resources/__init__.py @@ -16,6 +16,7 @@ 'FileBatch', 'Identity', 'IdentityEvent', + 'LimitedWallet', 'LoginToken', 'Saving', 'ServiceProvider', @@ -48,6 +49,7 @@ from .files import File from .identities import Identity from .identity_events import IdentityEvent +from .limited_wallets import LimitedWallet from .login_tokens import LoginToken from .resources import RESOURCES from .savings import Saving @@ -83,6 +85,7 @@ FileBatch, Identity, IdentityEvent, + LimitedWallet, LoginToken, Saving, Session, diff --git a/cuenca/version.py b/cuenca/version.py index 71c1849a..2519a44d 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.8.0' +__version__ = '0.8.1.dev0' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' From 20e335361480ac26d25d3f2465ae79410057adcd Mon Sep 17 00:00:00 2001 From: rogelioLpz Date: Tue, 5 Apr 2022 18:04:39 -0500 Subject: [PATCH 06/12] tests and cassets --- cuenca/resources/limited_wallets.py | 2 +- .../cassettes/test_limited_wallet_create.yaml | 56 +++++++++++++++++++ .../test_limited_wallet_retrieve.yaml | 52 +++++++++++++++++ tests/resources/test_limited_wallets.py | 21 +++++++ 4 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 tests/resources/cassettes/test_limited_wallet_create.yaml create mode 100644 tests/resources/cassettes/test_limited_wallet_retrieve.yaml create mode 100644 tests/resources/test_limited_wallets.py diff --git a/cuenca/resources/limited_wallets.py b/cuenca/resources/limited_wallets.py index 3f0a0d6c..955506ea 100644 --- a/cuenca/resources/limited_wallets.py +++ b/cuenca/resources/limited_wallets.py @@ -18,7 +18,7 @@ class LimitedWallet(Wallet): _query_params: ClassVar = AccountQuery account_number: Clabe allowed_rfc: Rfc - allowed_curp = CurpField + allowed_curp: CurpField @classmethod def create( diff --git a/tests/resources/cassettes/test_limited_wallet_create.yaml b/tests/resources/cassettes/test_limited_wallet_create.yaml new file mode 100644 index 00000000..abfd545a --- /dev/null +++ b/tests/resources/cassettes/test_limited_wallet_create.yaml @@ -0,0 +1,56 @@ +interactions: +- request: + body: '{"allowed_curp": "TAXM840916HNEMXT02", "allowed_rfc": "TAXM840916123"}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - DUMMY + Connection: + - keep-alive + Content-Length: + - '70' + Content-Type: + - application/json + User-Agent: + - cuenca-python/0.8.1.dev0 + X-Cuenca-Api-Version: + - '2020-03-19' + method: POST + uri: https://sandbox.cuenca.com/limited_wallets + response: + body: + string: '{"id":"LA3vx08KlQCXsaP9qyWfb680","created_at":"2022-04-05T23:00:29.446957","updated_at":"2022-04-05T23:00:29.446965","user_id":"US1le53HEq05OMrFTIlzqGJK","balance":0,"deactivated_at":null,"account_number":"646180157057065610","allowed_rfc":"TAXM840916123","allowed_curp":"TAXM840916HNEMXT02"}' + headers: + Connection: + - keep-alive + Content-Length: + - '292' + Content-Type: + - application/json + Date: + - Tue, 05 Apr 2022 23:00:30 GMT + X-Amzn-Trace-Id: + - Root=1-624cca0d-777e789766cb37857cf62965;Sampled=0 + X-Request-Time: + - 'value: 1.039' + x-amz-apigw-id: + - QISCFHDBiYcFVNQ= + x-amzn-Remapped-Connection: + - keep-alive + x-amzn-Remapped-Content-Length: + - '292' + x-amzn-Remapped-Date: + - Tue, 05 Apr 2022 23:00:30 GMT + x-amzn-Remapped-Server: + - nginx/1.20.2 + x-amzn-Remapped-x-amzn-RequestId: + - ffeee6be-a037-422d-ab2b-d739866c6ade + x-amzn-RequestId: + - d106e615-825d-4412-bf58-1ab8d9aaba02 + status: + code: 201 + message: Created +version: 1 diff --git a/tests/resources/cassettes/test_limited_wallet_retrieve.yaml b/tests/resources/cassettes/test_limited_wallet_retrieve.yaml new file mode 100644 index 00000000..026bf72b --- /dev/null +++ b/tests/resources/cassettes/test_limited_wallet_retrieve.yaml @@ -0,0 +1,52 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Authorization: + - DUMMY + Connection: + - keep-alive + User-Agent: + - cuenca-python/0.8.1.dev0 + X-Cuenca-Api-Version: + - '2020-03-19' + method: GET + uri: https://sandbox.cuenca.com/limited_wallets/LA3vx08KlQCXsaP9qyWfb680 + response: + body: + string: '{"id":"LA3vx08KlQCXsaP9qyWfb680","created_at":"2022-04-05T23:00:29.446000","updated_at":"2022-04-05T23:00:29.446000","user_id":"US1le53HEq05OMrFTIlzqGJK","balance":0,"deactivated_at":null,"account_number":"646180157057065610","allowed_rfc":"TAXM840916123","allowed_curp":"TAXM840916HNEMXT02"}' + headers: + Connection: + - keep-alive + Content-Length: + - '292' + Content-Type: + - application/json + Date: + - Tue, 05 Apr 2022 23:01:40 GMT + X-Amzn-Trace-Id: + - Root=1-624cca54-3540a54414ac35972cb3c426;Sampled=0 + X-Request-Time: + - 'value: 0.292' + x-amz-apigw-id: + - QISNPE83iYcF2MQ= + x-amzn-Remapped-Connection: + - keep-alive + x-amzn-Remapped-Content-Length: + - '292' + x-amzn-Remapped-Date: + - Tue, 05 Apr 2022 23:01:40 GMT + x-amzn-Remapped-Server: + - nginx/1.20.2 + x-amzn-Remapped-x-amzn-RequestId: + - 3fbb3706-abb5-4e66-a702-8be94a85d572 + x-amzn-RequestId: + - 9149cc06-3370-4718-9f2b-61a8178be034 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/resources/test_limited_wallets.py b/tests/resources/test_limited_wallets.py new file mode 100644 index 00000000..8d81ce1a --- /dev/null +++ b/tests/resources/test_limited_wallets.py @@ -0,0 +1,21 @@ +import pytest + +from cuenca import LimitedWallet + + +@pytest.mark.vcr +def test_limited_wallet_create(): + curp = 'TAXM840916HNEMXT02' + rfc = 'TAXM840916123' + wallet = LimitedWallet.create(allowed_curp=curp, allowed_rfc=rfc) + assert wallet.id is not None + assert wallet.balance == 0 + assert wallet.allowed_curp == curp + assert wallet.allowed_rfc == rfc + + +@pytest.mark.vcr +def test_limited_wallet_retrieve(): + id = 'LA3vx08KlQCXsaP9qyWfb680' + wallet = LimitedWallet.retrieve(id) + assert wallet.id == id From e3aaa88765e344b2c9f88c2e299c8f6128f35d7b Mon Sep 17 00:00:00 2001 From: rogelioLpz Date: Tue, 5 Apr 2022 18:12:24 -0500 Subject: [PATCH 07/12] version --- cuenca/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuenca/version.py b/cuenca/version.py index 2519a44d..6ab2065f 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.8.1.dev0' +__version__ = '0.8.1.dev1' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' From 99610ab80bd025c0522a7a851c2ac343f9c5e2aa Mon Sep 17 00:00:00 2001 From: rogelioLpz Date: Tue, 5 Apr 2022 19:03:42 -0500 Subject: [PATCH 08/12] types arteria by Manu --- cuenca/resources/users.py | 18 +++++++++++------- cuenca/version.py | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/cuenca/resources/users.py b/cuenca/resources/users.py index 3b488980..7044e24f 100644 --- a/cuenca/resources/users.py +++ b/cuenca/resources/users.py @@ -33,9 +33,9 @@ class User(Creatable, Retrievable, Updateable, Queryable): identity_uri: str level: int created_at: dt.datetime - phone_number: PhoneNumber - email_address: EmailStr - profession: str + phone_number: Optional[PhoneNumber] + email_address: Optional[EmailStr] + profession: Optional[str] terms_of_service: Optional[TOSAgreement] status: Optional[UserStatus] address: Optional[Address] @@ -49,10 +49,10 @@ class User(Creatable, Retrievable, Updateable, Queryable): def create( cls, curp: CurpField, - phone_number: PhoneNumber, - email_address: EmailStr, - profession: str, - address: Address, + phone_number: Optional[PhoneNumber] = None, + email_address: Optional[EmailStr] = None, + profession: Optional[str] = None, + address: Optional[Address] = None, *, session: Session = global_session, ) -> 'User': @@ -78,6 +78,8 @@ def update( proof_of_address: Optional[KYCFileUpdateRequest] = None, proof_of_life: Optional[KYCFileUpdateRequest] = None, terms_of_service: Optional[TOSUpdateRequest] = None, + email_verification_id: Optional[str] = None, + phone_verification_id: Optional[str] = None, *, session: Session = global_session, ): @@ -91,6 +93,8 @@ def update( proof_of_address=proof_of_address, proof_of_life=proof_of_life, terms_of_service=terms_of_service, + email_verification_id=email_verification_id, + phone_verification_id=phone_verification_id, ) return cast( 'User', diff --git a/cuenca/version.py b/cuenca/version.py index 6ab2065f..6e70678c 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.8.1.dev1' +__version__ = '0.8.1.dev2' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' From c6ccae2ff9f7d45940283d5e66daf29e7bf5577e Mon Sep 17 00:00:00 2001 From: Manuel Avalos Date: Thu, 7 Apr 2022 18:03:36 -0500 Subject: [PATCH 09/12] Moving verifications to create --- cuenca/resources/users.py | 8 ++++---- cuenca/version.py | 2 +- requirements.txt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cuenca/resources/users.py b/cuenca/resources/users.py index 7044e24f..64458828 100644 --- a/cuenca/resources/users.py +++ b/cuenca/resources/users.py @@ -53,6 +53,8 @@ def create( email_address: Optional[EmailStr] = None, profession: Optional[str] = None, address: Optional[Address] = None, + email_verification_id: Optional[str] = None, + phone_verification_id: Optional[str] = None, *, session: Session = global_session, ) -> 'User': @@ -62,6 +64,8 @@ def create( email_address=email_address, profession=profession, address=address, + email_verification_id=email_verification_id, + phone_verification_id=phone_verification_id, ) return cast('User', cls._create(session=session, **req.dict())) @@ -78,8 +82,6 @@ def update( proof_of_address: Optional[KYCFileUpdateRequest] = None, proof_of_life: Optional[KYCFileUpdateRequest] = None, terms_of_service: Optional[TOSUpdateRequest] = None, - email_verification_id: Optional[str] = None, - phone_verification_id: Optional[str] = None, *, session: Session = global_session, ): @@ -93,8 +95,6 @@ def update( proof_of_address=proof_of_address, proof_of_life=proof_of_life, terms_of_service=terms_of_service, - email_verification_id=email_verification_id, - phone_verification_id=phone_verification_id, ) return cast( 'User', diff --git a/cuenca/version.py b/cuenca/version.py index 6e70678c..4580ddaf 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.8.1.dev2' +__version__ = '0.8.1.dev3' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' diff --git a/requirements.txt b/requirements.txt index 9eb1182c..ec036aaf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ requests==2.27.1 -cuenca-validations==0.10.1.dev2 +cuenca-validations==0.10.1.dev6 dataclasses>=0.7;python_version<"3.7" From d79c9710234abadd6c20fc006b48d2a034aea08a Mon Sep 17 00:00:00 2001 From: Pach Date: Mon, 18 Apr 2022 16:51:56 -0500 Subject: [PATCH 10/12] Update version.py --- cuenca/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuenca/version.py b/cuenca/version.py index 4580ddaf..8c540a35 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.8.1.dev3' +__version__ = '0.8.1' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19' From b4ad0138ba3ba471c50ee04aecde03ec4f2a240b Mon Sep 17 00:00:00 2001 From: Pach Date: Mon, 18 Apr 2022 16:52:32 -0500 Subject: [PATCH 11/12] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ec036aaf..bd0836ad 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ requests==2.27.1 -cuenca-validations==0.10.1.dev6 +cuenca-validations==0.10.1 dataclasses>=0.7;python_version<"3.7" From 783e81b24296a490b4582ccd0fa4aa06138954fa Mon Sep 17 00:00:00 2001 From: Pach Date: Mon, 18 Apr 2022 16:55:50 -0500 Subject: [PATCH 12/12] Update version.py --- cuenca/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuenca/version.py b/cuenca/version.py index 8c540a35..d4a736cd 100644 --- a/cuenca/version.py +++ b/cuenca/version.py @@ -1,3 +1,3 @@ -__version__ = '0.8.1' +__version__ = '0.9.0' CLIENT_VERSION = __version__ API_VERSION = '2020-03-19'