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()

Reply via email to