From 744d9604ae168c847c043c560579c3724df7e868 Mon Sep 17 00:00:00 2001 From: Miguel Acosta Date: Tue, 11 Feb 2025 10:19:09 -0600 Subject: [PATCH 1/5] signature --- cuenca/__init__.py | 2 ++ cuenca/resources/__init__.py | 3 +++ cuenca/resources/signatures.py | 32 +++++++++++++++++++++++++++++++ tests/resources/test_signature.py | 10 ++++++++++ 4 files changed, 47 insertions(+) create mode 100644 cuenca/resources/signatures.py create mode 100644 tests/resources/test_signature.py diff --git a/cuenca/__init__.py b/cuenca/__init__.py index 32950045..e90f44b8 100644 --- a/cuenca/__init__.py +++ b/cuenca/__init__.py @@ -29,6 +29,7 @@ 'Saving', 'ServiceProvider', 'Session', + 'Signature', 'Statement', 'Transfer', 'User', @@ -77,6 +78,7 @@ Saving, ServiceProvider, Session, + Signature, Statement, Transfer, User, diff --git a/cuenca/resources/__init__.py b/cuenca/resources/__init__.py index 8daf3c7d..2ca87cdf 100644 --- a/cuenca/resources/__init__.py +++ b/cuenca/resources/__init__.py @@ -28,6 +28,7 @@ 'Saving', 'ServiceProvider', 'Session', + 'Signature', 'Statement', 'Transfer', 'User', @@ -72,6 +73,7 @@ from .savings import Saving from .service_providers import ServiceProvider from .sessions import Session +from .signatures import Signature from .statements import Statement from .transfers import Transfer from .user_credentials import UserCredential @@ -113,6 +115,7 @@ Saving, Session, ServiceProvider, + Signature, Statement, Transfer, User, diff --git a/cuenca/resources/signatures.py b/cuenca/resources/signatures.py new file mode 100644 index 00000000..05384a2f --- /dev/null +++ b/cuenca/resources/signatures.py @@ -0,0 +1,32 @@ +from typing import ClassVar + +from cuenca_validations.types import Signature, SignatureRequest +from pydantic import ConfigDict + +from ..http import Session, session as global_session +from .base import Creatable, Retrievable + + +class Signature(Creatable, Retrievable): + _resource: ClassVar = 'signatures' + signature_id: Signature + + model_config = ConfigDict( + json_schema_extra={ + 'example': { + 'id': 'string', + 'signature_id': Signature.schema().get('example'), + 'created_at': '2020-05-24T14:15:22Z', + } + } + ) + + @classmethod + def create( + cls, + signature: Signature, + user_id: str, + session: Session = global_session, + ) -> 'Signature': + req = SignatureRequest(signature=signature, user_id=user_id) + return cls._create(**req.model_dump(), session=session) diff --git a/tests/resources/test_signature.py b/tests/resources/test_signature.py new file mode 100644 index 00000000..c526529c --- /dev/null +++ b/tests/resources/test_signature.py @@ -0,0 +1,10 @@ +import pytest + +from cuenca import Signature + + +@pytest.mark.vcr +def test_signature_create(): + signature: Signature = Signature.create(user_id="USFOOBAR") + assert signature.id + assert signature.signature_id From 37951c08a77c3fb4585119a79be34b85d820fc1b Mon Sep 17 00:00:00 2001 From: Miguel Acosta Date: Thu, 13 Feb 2025 15:06:37 -0600 Subject: [PATCH 2/5] signature test --- cuenca/resources/signatures.py | 14 +++--- requirements.txt | 2 +- .../cassettes/test_signature_create.yaml | 47 +++++++++++++++++++ tests/resources/test_signature.py | 12 ++++- 4 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 tests/resources/cassettes/test_signature_create.yaml diff --git a/cuenca/resources/signatures.py b/cuenca/resources/signatures.py index 05384a2f..dd994d6b 100644 --- a/cuenca/resources/signatures.py +++ b/cuenca/resources/signatures.py @@ -1,6 +1,7 @@ +from ipaddress import IPv4Address, IPv6Address from typing import ClassVar -from cuenca_validations.types import Signature, SignatureRequest +from cuenca_validations.types import SignatureFile, SignatureRequest from pydantic import ConfigDict from ..http import Session, session as global_session @@ -9,24 +10,25 @@ class Signature(Creatable, Retrievable): _resource: ClassVar = 'signatures' - signature_id: Signature + signature_id: SignatureFile model_config = ConfigDict( json_schema_extra={ 'example': { 'id': 'string', - 'signature_id': Signature.schema().get('example'), + 'signature_id': SignatureFile.schema().get('example'), 'created_at': '2020-05-24T14:15:22Z', } - } + }, + json_encoders={IPv4Address: str, IPv6Address: str}, ) @classmethod def create( cls, - signature: Signature, + signature: SignatureFile, user_id: str, session: Session = global_session, ) -> 'Signature': req = SignatureRequest(signature=signature, user_id=user_id) - return cls._create(**req.model_dump(), session=session) + return cls._create(**req.model_dump(mode='json'), session=session) diff --git a/requirements.txt b/requirements.txt index 190cc68d..7166fdca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ requests==2.32.3 -cuenca-validations==2.1.0 +cuenca-validations==2.1.1.dev5 pydantic-extra-types==2.10.2 diff --git a/tests/resources/cassettes/test_signature_create.yaml b/tests/resources/cassettes/test_signature_create.yaml new file mode 100644 index 00000000..7c924b1a --- /dev/null +++ b/tests/resources/cassettes/test_signature_create.yaml @@ -0,0 +1,47 @@ +interactions: + - request: + body: + '{"signature": {"uri": "https://www.google.com/image.png", "location": "19.432608, + -99.133209", "ip": "192.168.1.100", "hash": "1234567890"}, "user_id": "USFOOBAR"}' + headers: + Content-Length: + - "163" + Content-Type: + - application/json + User-Agent: + - cuenca-python/2.1.0 + X-Cuenca-Api-Version: + - "2020-03-19" + method: POST + uri: https://sandbox.cuenca.com/signatures + response: + body: + string: + '{"id": "sig_123456789", "signature_id": {"uri": "https://www.google.com/image.png", + "location": "19.432608, -99.133209", "ip": "192.168.1.100", "hash": "1234567890"}, + "created_at": "2025-02-13T20:58:46Z"}' + headers: + Connection: + - keep-alive + Content-Length: + - "228" + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 20:58:46 GMT + x-amz-apigw-id: + - F8N5CHhBoAMEJmQ= + x-amzn-Remapped-Connection: + - keep-alive + x-amzn-Remapped-Content-Length: + - "228" + x-amzn-Remapped-Date: + - Thu, 13 Feb 2025 20:58:46 GMT + x-amzn-Remapped-Server: + - nginx/1.26.2 + x-amzn-RequestId: + - e36ae661-84ae-41db-98df-5e6e45df96ef + status: + code: 201 + message: Created +version: 1 diff --git a/tests/resources/test_signature.py b/tests/resources/test_signature.py index c526529c..3e309816 100644 --- a/tests/resources/test_signature.py +++ b/tests/resources/test_signature.py @@ -1,10 +1,20 @@ import pytest +from cuenca_validations.types import SignatureFile from cuenca import Signature @pytest.mark.vcr def test_signature_create(): - signature: Signature = Signature.create(user_id="USFOOBAR") + signature_file = SignatureFile( + uri="https://www.google.com/image.png", + ip="192.168.1.100", + location="19.432608, -99.133209", + hash="1234567890", + ) + signature: Signature = Signature.create( + user_id="USFOOBAR", + signature=signature_file, + ) assert signature.id assert signature.signature_id From 9a12045a3f2bfff66810b083619098a93b7c8454 Mon Sep 17 00:00:00 2001 From: Miguel Acosta Date: Fri, 14 Feb 2025 14:11:49 -0600 Subject: [PATCH 3/5] signature in kyc --- cuenca/__init__.py | 2 - cuenca/resources/__init__.py | 3 -- cuenca/resources/identities.py | 2 +- cuenca/resources/signatures.py | 34 -------------- cuenca/resources/users.py | 8 ++++ requirements.txt | 2 +- .../cassettes/test_signature_create.yaml | 47 ------------------- tests/resources/test_signature.py | 20 -------- 8 files changed, 10 insertions(+), 108 deletions(-) delete mode 100644 cuenca/resources/signatures.py delete mode 100644 tests/resources/cassettes/test_signature_create.yaml delete mode 100644 tests/resources/test_signature.py diff --git a/cuenca/__init__.py b/cuenca/__init__.py index e90f44b8..32950045 100644 --- a/cuenca/__init__.py +++ b/cuenca/__init__.py @@ -29,7 +29,6 @@ 'Saving', 'ServiceProvider', 'Session', - 'Signature', 'Statement', 'Transfer', 'User', @@ -78,7 +77,6 @@ Saving, ServiceProvider, Session, - Signature, Statement, Transfer, User, diff --git a/cuenca/resources/__init__.py b/cuenca/resources/__init__.py index 2ca87cdf..8daf3c7d 100644 --- a/cuenca/resources/__init__.py +++ b/cuenca/resources/__init__.py @@ -28,7 +28,6 @@ 'Saving', 'ServiceProvider', 'Session', - 'Signature', 'Statement', 'Transfer', 'User', @@ -73,7 +72,6 @@ from .savings import Saving from .service_providers import ServiceProvider from .sessions import Session -from .signatures import Signature from .statements import Statement from .transfers import Transfer from .user_credentials import UserCredential @@ -115,7 +113,6 @@ Saving, Session, ServiceProvider, - Signature, Statement, Transfer, User, diff --git a/cuenca/resources/identities.py b/cuenca/resources/identities.py index fa9d1294..bce90e53 100644 --- a/cuenca/resources/identities.py +++ b/cuenca/resources/identities.py @@ -19,7 +19,6 @@ class Identity(Retrievable, Queryable): _resource: ClassVar = 'identities' _query_params: ClassVar = IdentityQuery - created_at: dt.datetime names: str first_surname: str @@ -37,3 +36,4 @@ class Identity(Retrievable, Queryable): govt_id: Optional[KYCFile] = None proof_of_address: Optional[KYCFile] = None proof_of_life: Optional[KYCFile] = None + signature: Optional[KYCFile] = None diff --git a/cuenca/resources/signatures.py b/cuenca/resources/signatures.py deleted file mode 100644 index dd994d6b..00000000 --- a/cuenca/resources/signatures.py +++ /dev/null @@ -1,34 +0,0 @@ -from ipaddress import IPv4Address, IPv6Address -from typing import ClassVar - -from cuenca_validations.types import SignatureFile, SignatureRequest -from pydantic import ConfigDict - -from ..http import Session, session as global_session -from .base import Creatable, Retrievable - - -class Signature(Creatable, Retrievable): - _resource: ClassVar = 'signatures' - signature_id: SignatureFile - - model_config = ConfigDict( - json_schema_extra={ - 'example': { - 'id': 'string', - 'signature_id': SignatureFile.schema().get('example'), - 'created_at': '2020-05-24T14:15:22Z', - } - }, - json_encoders={IPv4Address: str, IPv6Address: str}, - ) - - @classmethod - def create( - cls, - signature: SignatureFile, - user_id: str, - session: Session = global_session, - ) -> 'Signature': - req = SignatureRequest(signature=signature, user_id=user_id) - return cls._create(**req.model_dump(mode='json'), session=session) diff --git a/cuenca/resources/users.py b/cuenca/resources/users.py index e6efbe68..ebbb1755 100644 --- a/cuenca/resources/users.py +++ b/cuenca/resources/users.py @@ -56,6 +56,9 @@ class User(Creatable, Retrievable, Updateable, Queryable): beneficiaries: Optional[list[Beneficiary]] = Field( None, description='Beneficiaries of account in case of death' ) + signature: Optional[KYCFile] = Field( + None, description='Detail of signature validation' + ) platform_id: Optional[str] = None clabe: Optional[Clabe] = None # These fields are added by identify when retrieving a User: @@ -96,6 +99,7 @@ def balance(self) -> int: 'beneficiaries': [ Beneficiary.schema().get('example'), ], + 'signature': KYCFile.schema().get('example'), 'platform_id': 'PT8UEv02zBTcymd4Kd3MO6pg', } } @@ -114,6 +118,7 @@ def create( status: Optional[UserStatus] = None, required_level: Optional[int] = None, terms_of_service: Optional[TOSRequest] = None, + signature: Optional[KYCFile] = None, *, session: Session = global_session, ) -> 'User': @@ -128,6 +133,7 @@ def create( required_level=required_level, status=status, terms_of_service=terms_of_service, + signature=signature, ) return cls._create(session=session, **req.model_dump()) @@ -143,6 +149,7 @@ def update( govt_id: Optional[KYCFile] = None, proof_of_address: Optional[KYCFile] = None, proof_of_life: Optional[KYCFile] = None, + signature: Optional[KYCFile] = None, terms_of_service: Optional[TOSRequest] = None, verification_id: Optional[str] = None, status: Optional[UserStatus] = None, @@ -161,6 +168,7 @@ def update( govt_id=govt_id, proof_of_address=proof_of_address, proof_of_life=proof_of_life, + signature=signature, terms_of_service=terms_of_service, verification_id=verification_id, email_verification_id=email_verification_id, diff --git a/requirements.txt b/requirements.txt index 7166fdca..e41f17df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ requests==2.32.3 -cuenca-validations==2.1.1.dev5 +cuenca-validations==2.1.1.dev8 pydantic-extra-types==2.10.2 diff --git a/tests/resources/cassettes/test_signature_create.yaml b/tests/resources/cassettes/test_signature_create.yaml deleted file mode 100644 index 7c924b1a..00000000 --- a/tests/resources/cassettes/test_signature_create.yaml +++ /dev/null @@ -1,47 +0,0 @@ -interactions: - - request: - body: - '{"signature": {"uri": "https://www.google.com/image.png", "location": "19.432608, - -99.133209", "ip": "192.168.1.100", "hash": "1234567890"}, "user_id": "USFOOBAR"}' - headers: - Content-Length: - - "163" - Content-Type: - - application/json - User-Agent: - - cuenca-python/2.1.0 - X-Cuenca-Api-Version: - - "2020-03-19" - method: POST - uri: https://sandbox.cuenca.com/signatures - response: - body: - string: - '{"id": "sig_123456789", "signature_id": {"uri": "https://www.google.com/image.png", - "location": "19.432608, -99.133209", "ip": "192.168.1.100", "hash": "1234567890"}, - "created_at": "2025-02-13T20:58:46Z"}' - headers: - Connection: - - keep-alive - Content-Length: - - "228" - Content-Type: - - application/json - Date: - - Thu, 13 Feb 2025 20:58:46 GMT - x-amz-apigw-id: - - F8N5CHhBoAMEJmQ= - x-amzn-Remapped-Connection: - - keep-alive - x-amzn-Remapped-Content-Length: - - "228" - x-amzn-Remapped-Date: - - Thu, 13 Feb 2025 20:58:46 GMT - x-amzn-Remapped-Server: - - nginx/1.26.2 - x-amzn-RequestId: - - e36ae661-84ae-41db-98df-5e6e45df96ef - status: - code: 201 - message: Created -version: 1 diff --git a/tests/resources/test_signature.py b/tests/resources/test_signature.py deleted file mode 100644 index 3e309816..00000000 --- a/tests/resources/test_signature.py +++ /dev/null @@ -1,20 +0,0 @@ -import pytest -from cuenca_validations.types import SignatureFile - -from cuenca import Signature - - -@pytest.mark.vcr -def test_signature_create(): - signature_file = SignatureFile( - uri="https://www.google.com/image.png", - ip="192.168.1.100", - location="19.432608, -99.133209", - hash="1234567890", - ) - signature: Signature = Signature.create( - user_id="USFOOBAR", - signature=signature_file, - ) - assert signature.id - assert signature.signature_id From 0e7d0f9e69d36977c8fd507a466cbeb28f343888 Mon Sep 17 00:00:00 2001 From: Miguel Acosta Date: Fri, 14 Feb 2025 14:14:50 -0600 Subject: [PATCH 4/5] revision --- cuenca/resources/identities.py | 1 + requirements.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cuenca/resources/identities.py b/cuenca/resources/identities.py index bce90e53..e11e3317 100644 --- a/cuenca/resources/identities.py +++ b/cuenca/resources/identities.py @@ -19,6 +19,7 @@ class Identity(Retrievable, Queryable): _resource: ClassVar = 'identities' _query_params: ClassVar = IdentityQuery + created_at: dt.datetime names: str first_surname: str diff --git a/requirements.txt b/requirements.txt index e41f17df..5c275916 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ requests==2.32.3 -cuenca-validations==2.1.1.dev8 +cuenca-validations==2.1.1 pydantic-extra-types==2.10.2 From f5dedde65e592f2c247b68b52548f18a3b9e14a4 Mon Sep 17 00:00:00 2001 From: Miguel Acosta Date: Fri, 14 Feb 2025 14:20:43 -0600 Subject: [PATCH 5/5] requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5c275916..e41f17df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ requests==2.32.3 -cuenca-validations==2.1.1 +cuenca-validations==2.1.1.dev8 pydantic-extra-types==2.10.2