changeset c4afc44694c3 in trytond:5.0
details: https://hg.tryton.org/trytond?cmd=changeset&node=c4afc44694c3
description:
Set name clause on join condition instead of subquery
The name is a column from a table that is not available in the subquery.
issue10257
review346001004
(grafted from 661c377d1869f9d63e0f997d2a40b26f6fd0e738)
diffstat:
trytond/model/fields/field.py | 34 ++++++++++++++++-----------
trytond/tests/test_ir.py | 52 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 72 insertions(+), 14 deletions(-)
diffs (124 lines):
diff -r 2a74b7c51d93 -r c4afc44694c3 trytond/model/fields/field.py
--- a/trytond/model/fields/field.py Wed Apr 21 23:54:43 2021 +0200
+++ b/trytond/model/fields/field.py Sat Apr 24 19:27:07 2021 +0200
@@ -396,11 +396,30 @@
def _get_translation_join(self, Model, name,
translation, model, table, from_, language):
+ if backend.name() == 'postgresql' and _sql_version >= (1, 1, 0):
+ query = translation.select(
+ translation.res_id.as_('res_id'),
+ translation.value.as_('value'),
+ translation.name.as_('name'),
+ distinct=True,
+ distinct_on=[translation.res_id, translation.name],
+ order_by=[
+ translation.res_id,
+ translation.name,
+ translation.id.desc])
+ else:
+ query = translation.select(
+ translation.res_id.as_('res_id'),
+ Min(translation.value).as_('value'),
+ translation.name.as_('name'),
+ group_by=[translation.res_id, translation.name])
if Model.__name__ == 'ir.model':
name_ = Concat(Concat(table.model, ','), name)
type_ = 'model'
res_id = -1
elif Model.__name__ == 'ir.model.field':
+ from_ = from_.join(model, 'LEFT',
+ condition=model.id == table.model)
name_ = Concat(Concat(model.model, ','), table.name)
if name == 'field_description':
type_ = 'field'
@@ -411,26 +430,13 @@
name_ = '%s,%s' % (Model.__name__, name)
type_ = 'model'
res_id = table.id
- if backend.name() == 'postgresql' and _sql_version >= (1, 1, 0):
- query = translation.select(
- translation.res_id.as_('res_id'),
- translation.value.as_('value'),
- distinct=True,
- distinct_on=[translation.res_id],
- order_by=[translation.res_id, translation.id.desc])
- else:
- query = translation.select(
- translation.res_id.as_('res_id'),
- Min(translation.value).as_('value'),
- group_by=[translation.res_id])
query.where = (
(translation.lang == language)
& (translation.type == type_)
- & (translation.name == name_)
& (translation.fuzzy == Literal(False))
)
return query, from_.join(query, 'LEFT',
- condition=(query.res_id == res_id))
+ condition=(query.res_id == res_id) & (query.name == name_))
def convert_domain(self, domain, tables, Model):
from trytond.ir.lang import get_parent_language
diff -r 2a74b7c51d93 -r c4afc44694c3 trytond/tests/test_ir.py
--- a/trytond/tests/test_ir.py Wed Apr 21 23:54:43 2021 +0200
+++ b/trytond/tests/test_ir.py Sat Apr 24 19:27:07 2021 +0200
@@ -14,6 +14,58 @@
module = 'ir'
@with_transaction()
+ def test_model_search_name(self):
+ "Test searching on name of model"
+ pool = Pool()
+ Model = pool.get('ir.model')
+
+ record, = Model.search([
+ ('name', '=', "Language"),
+ ('module', '=', 'ir'),
+ ])
+ self.assertEqual(record.name, "Language")
+
+ @with_transaction()
+ def test_model_search_order(self):
+ "Test searching and ordering on name of model"
+ pool = Pool()
+ Model = pool.get('ir.model')
+
+ records = Model.search([
+ ('name', 'in', ["Language", "Module"]),
+ ('module', '=', 'ir'),
+ ],
+ order=[('name', 'ASC')])
+ self.assertEqual([r.name for r in records], ["Language", "Module"])
+
+ @with_transaction()
+ def test_model_field_search_description(self):
+ "Test searching on description of model field"
+ pool = Pool()
+ ModelField = pool.get('ir.model.field')
+
+ field, = ModelField.search([
+ ('field_description', '=', "Name"),
+ ('model.model', '=', 'ir.lang'),
+ ('module', '=', 'ir'),
+ ])
+ self.assertEqual(field.field_description, "Name")
+
+ @with_transaction()
+ def test_model_field_search_order_description(self):
+ "Test searching and ordering on description of model field"
+ pool = Pool()
+ ModelField = pool.get('ir.model.field')
+
+ fields = ModelField.search([
+ ('field_description', 'in', ["Name", "Code"]),
+ ('model.model', '=', 'ir.lang'),
+ ('module', '=', 'ir'),
+ ])
+ self.assertEqual(
+ [f.field_description for f in fields], ["Code", "Name"])
+
+ @with_transaction()
def test_sequence_substitutions(self):
'Test Sequence Substitutions'
pool = Pool()