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"