From de373a683bdb2e0917d763671ea11867b5f7d56e Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Fri, 1 Sep 2023 11:20:30 -0500 Subject: [PATCH] Add grid filter type for BigInteger columns so we can filter by larger values --- tailbone/grids/core.py | 2 ++ tailbone/grids/filters.py | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) 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.