diff --git a/tailbone/grids/core.py b/tailbone/grids/core.py index abbac793..a6ba34d1 100644 --- a/tailbone/grids/core.py +++ b/tailbone/grids/core.py @@ -689,6 +689,8 @@ class Grid(object): factory = gridfilters.AlchemyStringFilter elif isinstance(column.type, sa.Numeric): factory = gridfilters.AlchemyNumericFilter + elif isinstance(column.type, sa.BigInteger): + factory = gridfilters.AlchemyBigIntegerFilter elif isinstance(column.type, sa.Integer): factory = gridfilters.AlchemyIntegerFilter elif isinstance(column.type, sa.Boolean): diff --git a/tailbone/grids/filters.py b/tailbone/grids/filters.py index 59e20d78..c8815f9f 100644 --- a/tailbone/grids/filters.py +++ b/tailbone/grids/filters.py @@ -659,6 +659,7 @@ class AlchemyIntegerFilter(AlchemyNumericFilter): """ Integer filter for SQLAlchemy. """ + bigint = False def value_invalid(self, value): if value: @@ -666,9 +667,10 @@ class AlchemyIntegerFilter(AlchemyNumericFilter): return True if not value.isdigit(): return True - # TODO: this one is to avoid DataError from PG, but perhaps that - # isn't a good enough reason to make this global logic? - if int(value) > 2147483647: + # normal Integer columns have a max value, beyond which PG + # will throw an error if we try to query for larger values + # TODO: this seems hacky, how to better handle it? + if not self.bigint and int(value) > 2147483647: return True return False @@ -678,6 +680,13 @@ class AlchemyIntegerFilter(AlchemyNumericFilter): return int(value) +class AlchemyBigIntegerFilter(AlchemyIntegerFilter): + """ + BigInteger filter for SQLAlchemy. + """ + bigint = True + + class AlchemyBooleanFilter(AlchemyGridFilter): """ Boolean filter for SQLAlchemy.