changeset 2d28681653c5 in trytond:5.6 details: https://hg.tryton.org/trytond?cmd=changeset&node=2d28681653c5 description: Translate LazyString of ir.model and ir.model.field
issue10326 review321041002 (grafted from ecbcef79165c036261789c1caf0c10edf2efea6b) diffstat: trytond/ir/translation.py | 22 ++++++++++++++++++++- trytond/model/fields/field.py | 45 +++++++++++++++++++++++++++++++++++++++++++ trytond/tests/test_ir.py | 13 ++++++++++++ 3 files changed, 79 insertions(+), 1 deletions(-) diffs (117 lines): diff -r 506360117958 -r 2d28681653c5 trytond/ir/translation.py --- a/trytond/ir/translation.py Sun Apr 25 17:56:39 2021 +0200 +++ b/trytond/ir/translation.py Sun Apr 25 18:19:29 2021 +0200 @@ -19,7 +19,7 @@ from trytond.exceptions import UserError from trytond.i18n import gettext -from trytond.tools.string_ import LazyString +from trytond.tools.string_ import LazyString, StringPartitioned from ..model import ModelView, ModelSQL, fields from ..wizard import Wizard, StateView, StateTransition, StateAction, \ Button @@ -327,6 +327,26 @@ else: name = record.model + ',' + field_name translations[record.id] = cls.get_source(name, ttype, lang) + if translations[record.id] is None: + with Transaction().set_context(language=lang): + if ttype in {'field', 'help'}: + field = getattr( + pool.get(record.model.model), record.name) + translations[record.id] = '' + if ttype == 'field': + value = field.string + else: + value = field.help + else: + model = pool.get(record.model) + if not model.__doc__: + continue + value = model._get_name() + if isinstance(value, StringPartitioned): + for source in value: + translations[record.id] += source + else: + translations[record.id] = value return translations # Don't use cache for fuzzy translation diff -r 506360117958 -r 2d28681653c5 trytond/model/fields/field.py --- a/trytond/model/fields/field.py Sun Apr 25 17:56:39 2021 +0200 +++ b/trytond/model/fields/field.py Sun Apr 25 18:19:29 2021 +0200 @@ -496,6 +496,51 @@ def _get_translation_join(self, Model, name, translation, model, table, from_, language): + if Model.__name__ == 'ir.model.field': + pool = Pool() + IrModel = pool.get('ir.model') + ModelData = pool.get('ir.model.data') + ModelField = pool.get('ir.model.field') + Translation = pool.get('ir.translation') + model = IrModel.__table__() + model_data = ModelData.__table__() + model_field = ModelField.__table__() + msg_trans = Translation.__table__() + if name == 'field_description': + type_ = 'field' + else: + type_ = 'help' + translation = translation.select( + translation.id.as_('id'), + translation.res_id.as_('res_id'), + translation.value.as_('value'), + translation.name.as_('name'), + translation.lang.as_('lang'), + translation.type.as_('type'), + translation.fuzzy.as_('fuzzy'), + ) + translation |= (msg_trans + .join(model_data, + condition=(msg_trans.res_id == model_data.db_id) + & (model_data.model == 'ir.message') + & (msg_trans.name == 'ir.message,text')) + .join(model_field, + condition=Concat( + Concat(model_data.module, '.'), + model_data.fs_id) == getattr(model_field, name)) + .join(model, + condition=model_field.model == model.id) + .select( + msg_trans.id.as_('id'), + Literal(-1).as_('res_id'), + msg_trans.value.as_('value'), + Concat( + Concat(model.model, ','), + model_field.name).as_('name'), + msg_trans.lang.as_('lang'), + Literal(type_).as_('type'), + msg_trans.fuzzy.as_('fuzzy'), + )) if backend.name == 'postgresql' and _sql_version >= (1, 1, 0): query = translation.select( translation.res_id.as_('res_id'), diff -r 506360117958 -r 2d28681653c5 trytond/tests/test_ir.py --- a/trytond/tests/test_ir.py Sun Apr 25 17:56:39 2021 +0200 +++ b/trytond/tests/test_ir.py Sun Apr 25 18:19:29 2021 +0200 @@ -66,6 +66,19 @@ [f.field_description for f in fields], ["Code", "Name"]) @with_transaction() + def test_model_field_lazy(self): + "Test searching on lazy string of model field" + pool = Pool() + ModelField = pool.get('ir.model.field') + + field, = ModelField.search([ + ('field_description', '=', "ID"), + ('model.model', '=', 'ir.lang'), + ('module', '=', 'ir'), + ]) + self.assertEqual(field.field_description, "ID") + + @with_transaction() def test_sequence_substitutions(self): 'Test Sequence Substitutions' pool = Pool()