From 52326c4b08c13b09adc239e64e6cfdd6671b9a97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 29 Jan 2026 15:24:10 +0100 Subject: [PATCH] Allow customizing SQL expression of field --- trytond/CHANGELOG | 1 + trytond/doc/ref/fields.rst | 11 +++++++++++ trytond/trytond/model/fields/field.py | 11 +++++++++++ trytond/trytond/tests/test_tryton.py | 2 +- 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/trytond/CHANGELOG b/trytond/CHANGELOG index 2463d4bff2..0150482eca 100644 --- a/trytond/CHANGELOG +++ b/trytond/CHANGELOG @@ -1,3 +1,4 @@ +* Add support for column_ method * Use tables and Model as arguments for sql_column of the Field * Add support for basic authentication for user application * Support the conversion of MJML reports to HTML diff --git a/trytond/doc/ref/fields.rst b/trytond/doc/ref/fields.rst index 556153f580..675b34b8e0 100644 --- a/trytond/doc/ref/fields.rst +++ b/trytond/doc/ref/fields.rst @@ -222,6 +222,17 @@ Default value See :ref:`default value ` +Reading +======= + +A class method could be defined for each field which must return a SQL +expression as column instead of the default one. +The method signature is:: + + column_(tables) + +Where ``tables`` is a nested dictionary, see :ref:`tables `. + Searching ========= diff --git a/trytond/trytond/model/fields/field.py b/trytond/trytond/model/fields/field.py index 1eb4f6e1fe..107099ed73 100644 --- a/trytond/trytond/model/fields/field.py +++ b/trytond/trytond/model/fields/field.py @@ -206,6 +206,16 @@ def on_change_with_result(fieldname): return decorator +def column_method(func): + @wraps(func) + def wrapper(self, tables, Model): + method = getattr(Model, f'column_{self.name}', None) + if method: + return method(tables) + return func(self, tables, Model) + return wrapper + + def domain_method(func): @wraps(func) def wrapper(self, domain, tables, Model): @@ -421,6 +431,7 @@ class Field(object): def sql_cast(self, expression): return Cast(expression, self.sql_type().base) + @column_method def sql_column(self, tables, Model): table, _ = tables[None] return Column(table, self.name) diff --git a/trytond/trytond/tests/test_tryton.py b/trytond/trytond/tests/test_tryton.py index 09d7e25fb5..445033fc21 100644 --- a/trytond/trytond/tests/test_tryton.py +++ b/trytond/trytond/tests/test_tryton.py @@ -655,7 +655,7 @@ class ModuleTestCase(_DBTestCase): def test_methods(mname, model, attr): for prefixes in [['default_'], ['on_change_', 'on_change_with_'], - ['order_'], ['domain_'], ['autocomplete_']]: + ['column_'], ['order_'], ['domain_'], ['autocomplete_']]: if attr in {'on_change_with', 'on_change_notify'}: continue # TODO those method should be renamed