summaryrefslogtreecommitdiff
path: root/odoo
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-01-08 17:08:48 +0100
committerChristophe Simonis <chs@odoo.com>2019-01-08 17:08:48 +0100
commit3e4138deaa23b3631dc3fce33cd6d1b3be28ffbd (patch)
tree8f8b5557363374af71baeeea97d4565a7ca1cce1 /odoo
parent232675c49b8cabdedce98b9b9c2ccc6d963b4d9a (diff)
parent2d824a5b7ad9e2d834bb39feb79c986eba28d6cc (diff)
[MERGE] forward port branch saas-11.3 up to 2d824a5b7ad
Diffstat (limited to 'odoo')
-rw-r--r--odoo/addons/base/data/res.country.state.csv2
-rw-r--r--odoo/addons/base/tests/test_api.py25
-rw-r--r--odoo/addons/base/tests/test_translate.py14
-rw-r--r--odoo/models.py22
-rw-r--r--odoo/tools/translate.py15
5 files changed, 57 insertions, 21 deletions
diff --git a/odoo/addons/base/data/res.country.state.csv b/odoo/addons/base/data/res.country.state.csv
index 1f2c8f1cbb8..32d84c78980 100644
--- a/odoo/addons/base/data/res.country.state.csv
+++ b/odoo/addons/base/data/res.country.state.csv
@@ -558,7 +558,7 @@ state_ar_h,ar,"Chaco","H"
state_ar_u,ar,"Chobut","U"
state_ar_x,ar,"Córdoba","X"
state_ar_w,ar,"Corrientes","W"
-state_ar_e,ar,"Ente Ríos","E"
+state_ar_e,ar,"Entre Ríos","E"
state_ar_p,ar,"Formosa","P"
state_ar_y,ar,"Jujuy","Y"
state_ar_l,ar,"La Pampa","L"
diff --git a/odoo/addons/base/tests/test_api.py b/odoo/addons/base/tests/test_api.py
index 270a8d75df4..dd003711f32 100644
--- a/odoo/addons/base/tests/test_api.py
+++ b/odoo/addons/base/tests/test_api.py
@@ -368,6 +368,31 @@ class TestAPI(common.TransactionCase):
same_prefetch(empty, empty.category_id)
@mute_logger('odoo.models')
+ def test_60_prefetch_read(self):
+ """ Check that reading a field computes it on self only. """
+ Partner = self.env['res.partner']
+ field = type(Partner).company_type
+ self.assertTrue(field.compute and not field.store)
+
+ partner1 = Partner.create({'name': 'Foo'})
+ partner2 = Partner.create({'name': 'Bar', 'parent_id': partner1.id})
+ self.assertEqual(partner1.child_ids, partner2)
+
+ # reading partner1 should not prefetch 'company_type' on partner2
+ self.env.clear()
+ partner1 = partner1.with_prefetch()
+ partner1.read(['company_type'])
+ self.assertIn('company_type', partner1._cache)
+ self.assertNotIn('company_type', partner2._cache)
+
+ # reading partner1 should not prefetch 'company_type' on partner2
+ self.env.clear()
+ partner1 = partner1.with_prefetch()
+ partner1.read(['child_ids', 'company_type'])
+ self.assertIn('company_type', partner1._cache)
+ self.assertNotIn('company_type', partner2._cache)
+
+ @mute_logger('odoo.models')
def test_70_one(self):
""" Check method one(). """
# check with many records
diff --git a/odoo/addons/base/tests/test_translate.py b/odoo/addons/base/tests/test_translate.py
index c9d7f35ec4c..a6cbcc2d52a 100644
--- a/odoo/addons/base/tests/test_translate.py
+++ b/odoo/addons/base/tests/test_translate.py
@@ -117,6 +117,20 @@ class TranslationToolsTestCase(unittest.TestCase):
self.assertItemsEqual(terms,
['Form stuff', 'Blah blah blah'])
+ def test_translate_xml_inline4(self):
+ """ Test xml_translate() with inline elements with translated attrs only. """
+ terms = []
+ source = """<form string="Form stuff">
+ <div>
+ <label for="stuff"/>
+ <span class="fa fa-globe" title="Title stuff"/>
+ </div>
+ </form>"""
+ result = xml_translate(terms.append, source)
+ self.assertEquals(result, source)
+ self.assertItemsEqual(terms,
+ ['Form stuff', '<span class="fa fa-globe" title="Title stuff"/>'])
+
def test_translate_xml_t(self):
""" Test xml_translate() with t-* attributes. """
terms = []
diff --git a/odoo/models.py b/odoo/models.py
index 8e2ad831875..d426789c757 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -2766,17 +2766,19 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
# retrieve results from records; this takes values from the cache and
# computes remaining fields
- result = []
- name_fields = [(name, self._fields[name]) for name in (stored + inherited + computed)]
+ data = {record: {'id': record.id} for record in self}
+ missing = set()
use_name_get = (load == '_classic_read')
- for record in self:
- try:
- values = {'id': record.id}
- for name, field in name_fields:
- values[name] = field.convert_to_read(record[name], record, use_name_get)
- result.append(values)
- except MissingError:
- pass
+ for name in (stored + inherited + computed):
+ convert = self._fields[name].convert_to_read
+ # read every field with prefetching limited to self; this avoids
+ # computing fields on a larger recordset than self
+ for record in self.with_prefetch():
+ try:
+ data[record][name] = convert(record[name], record, use_name_get)
+ except MissingError:
+ missing.add(record)
+ result = [data[record] for record in self if record not in missing]
return result
diff --git a/odoo/tools/translate.py b/odoo/tools/translate.py
index 28ded26eb79..ae552b6535e 100644
--- a/odoo/tools/translate.py
+++ b/odoo/tools/translate.py
@@ -163,7 +163,7 @@ def translate_xml_node(node, callback, parse, serialize):
"""
def nonspace(text):
- return bool(text) and not text.isspace()
+ return bool(text) and len(re.sub(r'\W+', '', text)) > 1
def concat(text1, text2):
return text2 if text1 is None else text1 + (text2 or "")
@@ -255,7 +255,10 @@ def translate_xml_node(node, callback, parse, serialize):
# complete result and return it
append_content(result, todo)
result.tail = node.tail
- has_text = todo_has_text or nonspace(result.text) or nonspace(result.tail)
+ has_text = (
+ todo_has_text or nonspace(result.text) or nonspace(result.tail)
+ or any(name in TRANSLATED_ATTRS for name in result.attrib)
+ )
return (has_text, result)
# translate the content of todo and append it to result
@@ -815,14 +818,6 @@ def trans_generate(lang, modules, cr):
# empty and one-letter terms are ignored, they probably are not meant to be
# translated, and would be very hard to translate anyway.
sanitized_term = (source or '').strip()
- try:
- # verify the minimal size without eventual xml tags
- # wrap to make sure html content like '<a>b</a><c>d</c>' is accepted by lxml
- wrapped = u"<div>%s</div>" % sanitized_term
- node = etree.fromstring(wrapped)
- sanitized_term = etree.tostring(node, encoding='unicode', method='text')
- except etree.ParseError:
- pass
# remove non-alphanumeric chars
sanitized_term = re.sub(r'\W+', '', sanitized_term)
if not sanitized_term or len(sanitized_term) <= 1: