From f786ca040cb8a12b270d8e6ae45f102713a54572 Mon Sep 17 00:00:00 2001 From: Konsta Vesterinen Date: Mon, 8 Apr 2013 13:24:18 +0300 Subject: [PATCH] Added sort by aliased and joined entity --- CHANGES.rst | 6 ++++++ setup.py | 2 +- sqlalchemy_utils/functions.py | 29 ++++++++++++++++++++--------- sqlalchemy_utils/types.py | 2 +- tests/test_utility_functions.py | 10 ++++++++++ 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b99643e..fe2f416 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.8.4 (2013-04-08) +^^^^^^^^^^^^^^^^^^ + +- Added sort by aliased and joined entity + + 0.8.3 (2013-04-03) ^^^^^^^^^^^^^^^^^^ diff --git a/setup.py b/setup.py index aa79fdc..002a1e3 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ class PyTest(Command): setup( name='SQLAlchemy-Utils', - version='0.8.3', + version='0.8.4', url='https://github.com/kvesteri/sqlalchemy-utils', license='BSD', author='Konsta Vesterinen', diff --git a/sqlalchemy_utils/functions.py b/sqlalchemy_utils/functions.py index bf3d373..62b73f5 100644 --- a/sqlalchemy_utils/functions.py +++ b/sqlalchemy_utils/functions.py @@ -2,6 +2,7 @@ from sqlalchemy.orm import defer from sqlalchemy.orm.mapper import Mapper from sqlalchemy.orm.query import _ColumnEntity from sqlalchemy.orm.properties import ColumnProperty +from sqlalchemy.orm.util import AliasedInsp from sqlalchemy.sql.expression import desc, asc @@ -107,16 +108,26 @@ def sort_query(query, sort): return query.order_by(func(sort)) for entity in entities: - table = entity.__table__ - if component and table.name != component: - continue - if sort in table.columns: - try: - attr = getattr(entity, sort) + if isinstance(entity, AliasedInsp): + if component and entity.name != component: + continue + + selectable = entity.selectable + + if sort in selectable.c: + attr = selectable.c[sort] query = query.order_by(func(attr)) - except AttributeError: - pass - break + else: + table = entity.__table__ + if component and table.name != component: + continue + if sort in table.columns: + try: + attr = getattr(entity, sort) + query = query.order_by(func(attr)) + except AttributeError: + pass + break return query diff --git a/sqlalchemy_utils/types.py b/sqlalchemy_utils/types.py index 9b282cb..6816f47 100644 --- a/sqlalchemy_utils/types.py +++ b/sqlalchemy_utils/types.py @@ -130,7 +130,7 @@ class NumberRangeType(types.TypeDecorator): impl = NumberRangeRawType def process_bind_param(self, value, dialect): - if value: + if value is not None: return value.normalized return value diff --git a/tests/test_utility_functions.py b/tests/test_utility_functions.py index 330c49d..1d2ac52 100644 --- a/tests/test_utility_functions.py +++ b/tests/test_utility_functions.py @@ -64,6 +64,16 @@ class TestSortQuery(TestCase): query = sort_query(query, '-articles') assert 'ORDER BY articles DESC' in str(query) + def test_sort_by_aliased_joined_entity(self): + alias = sa.orm.aliased(self.Category, name='categories') + query = self.session.query( + self.Article + ).join( + alias, self.Article.category + ) + query = sort_query(query, '-categories-name') + assert 'ORDER BY categories.name DESC' in str(query) + def test_sort_by_joined_table_column(self): query = self.session.query(self.Article).join(self.Article.category) sorted_query = sort_query(query, 'category-name')