details:   https://code.tryton.org/tryton/commit/33139eb55d00
branch:    default
user:      Cédric Krier <[email protected]>
date:      Tue Jun 30 16:49:13 2026 +0200
description:
        Add mixin to Database and TableHandler from configuration
diffstat:

 trytond-gis/CHANGELOG                       |   1 +
 trytond-gis/trytond_gis/postgis/__init__.py |   6 ++++--
 trytond-gis/trytond_gis/postgis/database.py |   6 +++++-
 trytond-gis/trytond_gis/postgis/table.py    |   6 +++++-
 trytond/CHANGELOG                           |   1 +
 trytond/doc/topics/configuration.rst        |  17 +++++++++++++++++
 trytond/trytond/backend/__init__.py         |  22 ++++++++++++++++++++--
 7 files changed, 53 insertions(+), 6 deletions(-)

diffs (159 lines):

diff -r 42e700f7f2e6 -r 33139eb55d00 trytond-gis/CHANGELOG
--- a/trytond-gis/CHANGELOG     Tue Aug 04 15:56:21 2026 +0200
+++ b/trytond-gis/CHANGELOG     Tue Jun 30 16:49:13 2026 +0200
@@ -1,3 +1,4 @@
+* Add mixin for Database and TableHandler
 
 Version 8.0.0 - 2026-04-20
 --------------------------
diff -r 42e700f7f2e6 -r 33139eb55d00 trytond-gis/trytond_gis/postgis/__init__.py
--- a/trytond-gis/trytond_gis/postgis/__init__.py       Tue Aug 04 15:56:21 
2026 +0200
+++ b/trytond-gis/trytond_gis/postgis/__init__.py       Tue Jun 30 16:49:13 
2026 +0200
@@ -5,13 +5,14 @@
     DatabaseOperationalError, DatabaseTimeoutError, dict_row, namedtuple_row,
     scalar_row)
 
-from .database import Database
-from .table import TableHandler
+from .database import Database, DatabaseMixin
+from .table import TableHandler, TableHandlerMixin
 
 __all__ = [
     Database,
     DatabaseDataError,
     DatabaseIntegrityError,
+    DatabaseMixin,
     DatabaseOperationalError,
     DatabaseTimeoutError,
     dict_row,
@@ -19,4 +20,5 @@
     scalar_row,
     MAX_QUERY_PARAMS,
     TableHandler,
+    TableHandlerMixin,
     ]
diff -r 42e700f7f2e6 -r 33139eb55d00 trytond-gis/trytond_gis/postgis/database.py
--- a/trytond-gis/trytond_gis/postgis/database.py       Tue Aug 04 15:56:21 
2026 +0200
+++ b/trytond-gis/trytond_gis/postgis/database.py       Tue Jun 30 16:49:13 
2026 +0200
@@ -38,7 +38,7 @@
         return wkb.dumps(obj).encode()
 
 
-class Database(PGDatabase):
+class DatabaseMixin:
 
     _GIS_OIDS = None
 
@@ -87,6 +87,10 @@
         return conn
 
 
+class Database(DatabaseMixin, PGDatabase):
+    pass
+
+
 @cache
 def _make_dumper(oid_in):
     class GeometryDumper(BaseGeometryDumper):
diff -r 42e700f7f2e6 -r 33139eb55d00 trytond-gis/trytond_gis/postgis/table.py
--- a/trytond-gis/trytond_gis/postgis/table.py  Tue Aug 04 15:56:21 2026 +0200
+++ b/trytond-gis/trytond_gis/postgis/table.py  Tue Jun 30 16:49:13 2026 +0200
@@ -10,7 +10,7 @@
 logger = logging.getLogger(__name__)
 
 
-class TableHandler(PGTableHandler):
+class TableHandlerMixin:
 
     def add_column(self, column_name, abstract_type, default=None):
         if abstract_type.startswith('GIS_'):
@@ -69,3 +69,7 @@
         cursor.execute('SELECT AddGeometryColumn(%s, %s, %s, %s, %s)',
             (self.table_name, column_name, srid, type_, dimension))
         self._update_definitions(columns=True)
+
+
+class TableHandler(TableHandlerMixin, PGTableHandler):
+    pass
diff -r 42e700f7f2e6 -r 33139eb55d00 trytond/CHANGELOG
--- a/trytond/CHANGELOG Tue Aug 04 15:56:21 2026 +0200
+++ b/trytond/CHANGELOG Tue Jun 30 16:49:13 2026 +0200
@@ -1,3 +1,4 @@
+* Apply mixin to Database and TableHandler from configuration
 * Restrict protocols allowed for weasyprint to http(s) (issue14947)
 * Add search attribute to XML record tag
 * Enforce access right on the email template record (issue14907)
diff -r 42e700f7f2e6 -r 33139eb55d00 trytond/doc/topics/configuration.rst
--- a/trytond/doc/topics/configuration.rst      Tue Aug 04 15:56:21 2026 +0200
+++ b/trytond/doc/topics/configuration.rst      Tue Jun 30 16:49:13 2026 +0200
@@ -296,6 +296,22 @@
 The maximum number of simultaneous connections to the database per process.
 Default: ``64``
 
+.. _config-database.database_mixins:
+
+database_mixins
+~~~~~~~~~~~~~~~
+
+The qualified names of mixin_ as a one per line list to apply to the
+:class:`~trytond.backend.Database`
+
+.. _config-database.table_handler_mixins:
+
+table_handler_mixins
+~~~~~~~~~~~~~~~~~~~~
+
+The qualified names of mixin_ as a one per line list to apply to the
+:class:`~trytond.backend.TableHandler`
+
 .. _config-database.unaccent_function:
 
 unaccent_function
@@ -976,3 +992,4 @@
 .. _WSGI middleware: 
https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface#Specification_overview
 .. _`multi-factor authentication`: 
https://en.wikipedia.org/wiki/Multi-factor_authentication
 .. _`Domain attribute`: 
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie#domaindomain-value
+.. _mixin: https://en.wikipedia.org/wiki/Mixin
diff -r 42e700f7f2e6 -r 33139eb55d00 trytond/trytond/backend/__init__.py
--- a/trytond/trytond/backend/__init__.py       Tue Aug 04 15:56:21 2026 +0200
+++ b/trytond/trytond/backend/__init__.py       Tue Jun 30 16:49:13 2026 +0200
@@ -5,6 +5,7 @@
 from importlib.metadata import entry_points
 
 import trytond.config as config
+from trytond.tools import resolve
 
 __all__ = [
     'name', 'Database', 'TableHandler',
@@ -28,12 +29,29 @@
     else:
         raise
 
-Database = _module.Database
+
+_database_mixins = []
+for mixin in config.get(
+        'database', 'database_mixins', default='').strip().splitlines():
+    _database_mixins.append(resolve(mixin))
+_table_handler_mixins = []
+for mixin in config.get(
+        'database', 'table_handler_mixins', default='').strip().splitlines():
+    _table_handler_mixins.append(resolve(mixin))
+
+
+class Database(*_database_mixins, _module.Database):
+    pass
+
+
+class TableHandler(*_table_handler_mixins, _module.TableHandler):
+    pass
+
+
 DatabaseIntegrityError = _module.DatabaseIntegrityError
 DatabaseDataError = _module.DatabaseDataError
 DatabaseOperationalError = _module.DatabaseOperationalError
 DatabaseTimeoutError = _module.DatabaseTimeoutError
-TableHandler = _module.TableHandler
 MAX_QUERY_PARAMS = _module.MAX_QUERY_PARAMS
 dict_row = _module.dict_row
 namedtuple_row = _module.namedtuple_row

Reply via email to