diff options
| author | Christophe Simonis <chs@odoo.com> | 2019-01-08 17:08:48 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2019-01-08 17:08:48 +0100 |
| commit | 3e4138deaa23b3631dc3fce33cd6d1b3be28ffbd (patch) | |
| tree | 8f8b5557363374af71baeeea97d4565a7ca1cce1 /odoo | |
| parent | 232675c49b8cabdedce98b9b9c2ccc6d963b4d9a (diff) | |
| parent | 2d824a5b7ad9e2d834bb39feb79c986eba28d6cc (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.csv | 2 | ||||
| -rw-r--r-- | odoo/addons/base/tests/test_api.py | 25 | ||||
| -rw-r--r-- | odoo/addons/base/tests/test_translate.py | 14 | ||||
| -rw-r--r-- | odoo/models.py | 22 | ||||
| -rw-r--r-- | odoo/tools/translate.py | 15 |
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: |
