From eed50186293c3464f2fc19bb9322b711a76eb811 Mon Sep 17 00:00:00 2001 From: Konsta Vesterinen Date: Wed, 27 May 2015 13:53:33 +0300 Subject: [PATCH] Fix CompositeType Fix CompositeType bind parameter processing when of the fields is of TypeDecorator type. --- CHANGES.rst | 6 ++++++ sqlalchemy_utils/__init__.py | 2 +- sqlalchemy_utils/types/pg_composite.py | 15 +++++++++++++++ tests/types/test_composite.py | 14 +++++++++++++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 2cb0fe2..52b1ac6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog Here you can see the full list of changes between each SQLAlchemy-Utils release. +0.30.4 (2015-05-27) +^^^^^^^^^^^^^^^^^^^ + +- Fixed CompositeType bind parameter processing when one of the fields is of TypeDecorator type. + + 0.30.3 (2015-05-27) ^^^^^^^^^^^^^^^^^^^ diff --git a/sqlalchemy_utils/__init__.py b/sqlalchemy_utils/__init__.py index b012ed6..1ab3c2a 100644 --- a/sqlalchemy_utils/__init__.py +++ b/sqlalchemy_utils/__init__.py @@ -90,4 +90,4 @@ from .types import ( # noqa WeekDaysType ) -__version__ = '0.30.3' +__version__ = '0.30.4' diff --git a/sqlalchemy_utils/types/pg_composite.py b/sqlalchemy_utils/types/pg_composite.py index 289c6e1..c475a94 100644 --- a/sqlalchemy_utils/types/pg_composite.py +++ b/sqlalchemy_utils/types/pg_composite.py @@ -173,6 +173,21 @@ class CompositeType(UserDefinedType, SchemaType): def get_col_spec(self): return self.name + def bind_processor(self, dialect): + def process(value): + processed_value = [] + for i, column in enumerate(self.columns): + if isinstance(column.type, TypeDecorator): + processed_value.append( + column.type.process_bind_param( + value[i], dialect + ) + ) + else: + processed_value.append(value[i]) + return tuple(processed_value) + return process + def result_processor(self, dialect, coltype): def process(value): cls = value.__class__ diff --git a/tests/types/test_composite.py b/tests/types/test_composite.py index d59222c..4b39e59 100644 --- a/tests/types/test_composite.py +++ b/tests/types/test_composite.py @@ -73,7 +73,7 @@ class TestCompositeTypeWithTypeDecorators(TestCase): self.Account = Account - def test_parameter_processing(self): + def test_result_set_processing(self): account = self.Account( balance=('USD', 15) ) @@ -85,6 +85,18 @@ class TestCompositeTypeWithTypeDecorators(TestCase): assert account.balance.currency == Currency('USD') assert account.balance.amount == 15 + def test_parameter_processing(self): + account = self.Account( + balance=(Currency('USD'), 15) + ) + + self.session.add(account) + self.session.commit() + + account = self.session.query(self.Account).first() + assert account.balance.currency == Currency('USD') + assert account.balance.amount == 15 + @mark.skipif('babel is None') class TestCompositeTypeInsideArray(TestCase):