changeset 10e16de6a494 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=10e16de6a494
description:
        Apply domain on translation value of the left join

        issue11781
        review413711003
diffstat:

 trytond/model/fields/char.py   |   1 +
 trytond/model/fields/field.py  |  35 ++++++++++++++++++++++++++---------
 trytond/tests/test_modelsql.py |  30 ------------------------------
 3 files changed, 27 insertions(+), 39 deletions(-)

diffs (134 lines):

diff -r b634739721c9 -r 10e16de6a494 trytond/model/fields/char.py
--- a/trytond/model/fields/char.py      Sun Oct 09 19:58:51 2022 +0200
+++ b/trytond/model/fields/char.py      Mon Oct 10 19:39:21 2022 +0200
@@ -137,6 +137,7 @@
             table, _ = tables[None]
             if self.translate:
                 language = transaction.language
+                # Without domain because a different operator is applied
                 model, join, column = self._get_translation_column(
                     Model, name)
                 column = Coalesce(NullIf(column, ''), self.sql_column(model))
diff -r b634739721c9 -r 10e16de6a494 trytond/model/fields/field.py
--- a/trytond/model/fields/field.py     Sun Oct 09 19:58:51 2022 +0200
+++ b/trytond/model/fields/field.py     Mon Oct 10 19:39:21 2022 +0200
@@ -217,6 +217,14 @@
     }
 
 
+def sanitize_sql_expression(expression):
+    if isinstance(expression, operators.In) and not expression.right:
+        expression = Literal(False)
+    elif isinstance(expression, operators.NotIn) and not expression.right:
+        expression = Literal(True)
+    return expression
+
+
 class Field(object):
     _type = None
     _sql_type = None
@@ -429,10 +437,7 @@
         column = self.sql_column(table)
         column = self._domain_column(operator, column)
         expression = Operator(column, self._domain_value(operator, value))
-        if isinstance(expression, operators.In) and not expression.right:
-            expression = Literal(False)
-        elif isinstance(expression, operators.NotIn) and not expression.right:
-            expression = Literal(True)
+        expression = sanitize_sql_expression(expression)
         expression = self._domain_add_null(column, operator, value, expression)
         return expression
 
@@ -531,8 +536,9 @@
 
 class FieldTranslate(Field):
 
-    def _get_translation_join(self, Model, name,
-            translation, model, table, from_, language):
+    def _get_translation_join(
+            self, Model, name, translation, model, table, from_, language,
+            domain=None):
         if Model.__name__ == 'ir.model.field':
             pool = Pool()
             IrModel = pool.get('ir.model')
@@ -617,10 +623,19 @@
             & (translation.type == type_)
             & (translation.fuzzy == Literal(False))
             )
+        if domain:
+            _, operator, value = domain
+            Operator = SQL_OPERATORS[operator]
+            column = self._domain_column(operator, translation.value)
+            expression = Operator(column, self._domain_value(operator, value))
+            expression = sanitize_sql_expression(expression)
+            expression = self._domain_add_null(
+                column, operator, value, expression)
+            query.where &= expression
         return query, from_.join(query, 'LEFT',
             condition=(query.res_id == res_id) & (query.name == name_))
 
-    def _get_translation_column(self, Model, name):
+    def _get_translation_column(self, Model, name, domain=None):
         from trytond.ir.lang import get_parent_language
         pool = Pool()
         Translation = pool.get('ir.translation')
@@ -633,7 +648,8 @@
         while language:
             translation = Translation.__table__()
             translation, join = self._get_translation_join(
-                Model, name, translation, model, table, join, language)
+                Model, name, translation, model, table, join, language,
+                domain=domain)
             column = Coalesce(NullIf(column, ''), translation.value)
             language = get_parent_language(language)
         return table, join, column
@@ -644,7 +660,8 @@
                 domain, tables, Model)
         table, _ = tables[None]
         name, operator, value = domain
-        model, join, column = self._get_translation_column(Model, name)
+        model, join, column = self._get_translation_column(
+            Model, name, domain=domain)
         column = Coalesce(NullIf(column, ''), self.sql_column(model))
         column = self._domain_column(operator, column)
         Operator = SQL_OPERATORS[operator]
diff -r b634739721c9 -r 10e16de6a494 trytond/tests/test_modelsql.py
--- a/trytond/tests/test_modelsql.py    Sun Oct 09 19:58:51 2022 +0200
+++ b/trytond/tests/test_modelsql.py    Mon Oct 10 19:39:21 2022 +0200
@@ -1339,36 +1339,6 @@
                 Model.search([], order=[('name', 'DESC')]),
                 [record])
 
-    @unittest.skipIf(backend.name != 'postgresql',
-        "Only PostgreSQL support DISTINCT ON")
-    @with_transaction()
-    def test_search_last_translation(self):
-        "Test unique result on search"
-        pool = Pool()
-        Model = pool.get('test.modelsql.translation')
-        Translation = pool.get('ir.translation')
-
-        with Transaction().set_context(language=self.default_language):
-            record, = Model.create([{'name': "Foo"}])
-        with Transaction().set_context(language=self.other_language):
-            Model.write([record], {'name': "Bar"})
-
-        translation, = Translation.search([
-                ('lang', '=', self.other_language),
-                ('name', '=', 'test.modelsql.translation,name'),
-                ('type', '=', 'model'),
-                ('res_id', '=', record.id),
-                ])
-        Translation.copy([translation], default={'value': "Baz"})
-
-        with Transaction().set_context(language=self.other_language):
-            self.assertEqual(
-                Model.search([('name', '=', 'Baz')]),
-                [record])
-            self.assertEqual(
-                Model.search([('name', '=', 'Bar')]),
-                [])
-
     @with_transaction()
     def test_search_fill_transaction_cache(self):
         "Test search fill the transaction cache"

Reply via email to