From 0b67a61607eb94bff9f88864b3ef2cbdcc5e35a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 17 Jan 2023 22:54:01 +0100 Subject: [PATCH] Test if count is callable before using it ModelStorage.count has been added in 6.2 but there are existing Model that has field with this name. Closes #12016 --- trytond/trytond/model/fields/many2one.py | 2 +- trytond/trytond/model/fields/one2many.py | 3 ++- trytond/trytond/model/modelsql.py | 6 ++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/trytond/trytond/model/fields/many2one.py b/trytond/trytond/model/fields/many2one.py index 39dea38174..79a38cebb7 100644 --- a/trytond/trytond/model/fields/many2one.py +++ b/trytond/trytond/model/fields/many2one.py @@ -259,7 +259,7 @@ class Many2One(Field): else: _, target_name = name.split('.', 1) target_domain = [(target_name,) + tuple(domain[1:])] - if Target.count() < _subquery_threshold: + if callable(Target.count) and Target.count() < _subquery_threshold: query = Target.search(target_domain, order=[], query=True) return column.in_(query) else: diff --git a/trytond/trytond/model/fields/one2many.py b/trytond/trytond/model/fields/one2many.py index d71ba49d7b..4a09777f17 100644 --- a/trytond/trytond/model/fields/one2many.py +++ b/trytond/trytond/model/fields/one2many.py @@ -337,7 +337,8 @@ class One2Many(Field): origin_where = origin.like(Model.__name__ + ',%') origin = origin_field.sql_id(origin, Target) - use_in = Target.count() < _subquery_threshold + use_in = ( + callable(Target.count) and Target.count() < _subquery_threshold) if '.' not in name: if value is None: if use_in: diff --git a/trytond/trytond/model/modelsql.py b/trytond/trytond/model/modelsql.py index 5ca0d316bb..236af56bb7 100644 --- a/trytond/trytond/model/modelsql.py +++ b/trytond/trytond/model/modelsql.py @@ -1647,7 +1647,9 @@ class ModelSQL(ModelStorage): main_table, _ = tables[None] if count: table = convert_from(None, tables) - if (limit is not None and limit < cls.count()) or offset: + if (limit is not None + and callable(cls.count) + and limit < cls.count()) or offset: select = table.select( Literal(1), where=expression, limit=limit, offset=offset ).select(Count(Literal('*'))) @@ -1878,7 +1880,7 @@ class ModelSQL(ModelStorage): 'You can not update fields: "%s", "%s"' % (field.left, field.right)) - if len(ids) < max(cls.count() / 4, 4): + if callable(cls.count) and len(ids) < max(cls.count() / 4, 4): for id_ in ids: cls._update_tree(id_, field_name, field.left, field.right)