diff options
| author | Christophe Simonis <chs@odoo.com> | 2018-06-12 16:49:11 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2018-06-12 16:49:11 +0200 |
| commit | af1853775fe9b95e5b0f927c0894abab1be683d7 (patch) | |
| tree | d2ed115233bd4f74fa0ac6a550c5241fb98f8f9b /odoo/addons/base | |
| parent | 9a6ef3c99c775901f70e3704f7c94d3db38c1fa6 (diff) | |
| parent | e3658d6f56801d7037f11d4c61bb89c037a1bc98 (diff) | |
[MERGE] forward port branch 11.0 up to e3658d6f568
Diffstat (limited to 'odoo/addons/base')
| -rw-r--r-- | odoo/addons/base/data/res.country.state.csv | 2 | ||||
| -rw-r--r-- | odoo/addons/base/data/res_country_data.xml | 5 | ||||
| -rw-r--r-- | odoo/addons/base/models/ir_mail_server.py | 6 | ||||
| -rw-r--r-- | odoo/addons/base/models/qweb.py | 7 | ||||
| -rw-r--r-- | odoo/addons/base/models/res_users.py | 5 | ||||
| -rw-r--r-- | odoo/addons/base/rng/tree_view.rng | 2 | ||||
| -rw-r--r-- | odoo/addons/base/security/base_security.xml | 2 | ||||
| -rw-r--r-- | odoo/addons/base/tests/test_qweb.py | 21 |
8 files changed, 42 insertions, 8 deletions
diff --git a/odoo/addons/base/data/res.country.state.csv b/odoo/addons/base/data/res.country.state.csv index 4b445f52cf9..b64c8f78f12 100644 --- a/odoo/addons/base/data/res.country.state.csv +++ b/odoo/addons/base/data/res.country.state.csv @@ -450,7 +450,7 @@ state_es_m,es,"Madrid","M" state_es_ma,es,"Málaga","MA" state_es_ml,es,"Melilla","ME" state_es_mu,es,"Murcia","MU" -state_es_na,es,"Nafarroa (Navarra)","NA" +state_es_na,es,"Navarra (Nafarroa)","NA" state_es_or,es,"Ourense (Orense)","OR" state_es_p,es,"Palencia","P" state_es_po,es,"Pontevedra","PO" diff --git a/odoo/addons/base/data/res_country_data.xml b/odoo/addons/base/data/res_country_data.xml index 0e865be0fdf..1648d24430c 100644 --- a/odoo/addons/base/data/res_country_data.xml +++ b/odoo/addons/base/data/res_country_data.xml @@ -271,6 +271,7 @@ <field eval="'%(street)s\n%(street2)s\n%(city)s %(state_code)s %(zip)s\n%(country_name)s'" name="address_format" /> <field name="currency_id" ref="CAD" /> <field eval="1" name="phone_code" /> + <field name="vat_label">HST</field> </record> <record id="cc" model="res.country"> <field name="name">Cocos (Keeling) Islands</field> @@ -440,8 +441,10 @@ <field name="name">Dominican Republic</field> <field name="code">do</field> <field file="base/static/img/country_flags/do.png" name="image" type="base64" /> + <field eval="'%(street)s\n%(street2)s\n%(city)s %(state_name)s %(zip)s\n%(country_name)s'" name="address_format" /> <field name="currency_id" ref="DOP" /> - <field eval="0" name="phone_code" /> + <field eval="1" name="phone_code" /> + <field name="vat_label">RNC</field> </record> <record id="dz" model="res.country"> <field name="name">Algeria</field> diff --git a/odoo/addons/base/models/ir_mail_server.py b/odoo/addons/base/models/ir_mail_server.py index 96edff27263..454e2dc0780 100644 --- a/odoo/addons/base/models/ir_mail_server.py +++ b/odoo/addons/base/models/ir_mail_server.py @@ -22,6 +22,8 @@ from odoo.tools import ustr, pycompat _logger = logging.getLogger(__name__) _test_logger = logging.getLogger('odoo.tests') +SMTP_TIMEOUT = 60 + class MailDeliveryException(except_orm): """Specific exception subclass for mail delivery errors""" @@ -225,9 +227,9 @@ class IrMailServer(models.Model): "You could use STARTTLS instead. " "If SSL is needed, an upgrade to Python 2.6 on the server-side " "should do the trick.")) - connection = smtplib.SMTP_SSL(smtp_server, smtp_port) + connection = smtplib.SMTP_SSL(smtp_server, smtp_port, timeout=SMTP_TIMEOUT) else: - connection = smtplib.SMTP(smtp_server, smtp_port) + connection = smtplib.SMTP(smtp_server, smtp_port, timeout=SMTP_TIMEOUT) connection.set_debuglevel(smtp_debug) if smtp_encryption == 'starttls': # starttls() will perform ehlo() if needed first diff --git a/odoo/addons/base/models/qweb.py b/odoo/addons/base/models/qweb.py index 98697b87738..692db1bf0f3 100644 --- a/odoo/addons/base/models/qweb.py +++ b/odoo/addons/base/models/qweb.py @@ -308,8 +308,9 @@ class QWeb(object): raise e except Exception as e: path = _options['last_path_node'] - node = element.getroottree().xpath(path) - raise QWebException("Error when compiling AST", e, path, etree.tostring(node[0], encoding='unicode'), name) + element, document = self.get_template(template, options) + node = element.getroottree().xpath(path) if ':' not in path else None + raise QWebException("Error when compiling AST", e, path, node and etree.tostring(node[0], encoding='unicode'), name) astmod.body.extend(_options['ast_calls']) if 'profile' in options: @@ -344,7 +345,7 @@ class QWeb(object): except Exception as e: path = log['last_path_node'] element, document = self.get_template(template, options) - node = element.getroottree().xpath(path) + node = element.getroottree().xpath(path) if ':' not in path else None raise QWebException("Error to render compiling AST", e, path, node and etree.tostring(node[0], encoding='unicode'), name) return _compiled_fn diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py index 02f9d90562c..204d4751eb6 100644 --- a/odoo/addons/base/models/res_users.py +++ b/odoo/addons/base/models/res_users.py @@ -789,6 +789,11 @@ class GroupsView(models.Model): xml = E.field(E.group(*(xml1), col="2"), E.group(*(xml2), col="4"), name="groups_id", position="replace") xml.addprevious(etree.Comment("GENERATED AUTOMATICALLY BY GROUPS")) xml_content = etree.tostring(xml, pretty_print=True, encoding="unicode") + if not view.check_access_rights('write', raise_exception=False): + # erp manager has the rights to update groups/users but not + # to modify ir.ui.view + if self.env.user.has_group('base.group_erp_manager'): + view = view.sudo() new_context = dict(view._context) new_context.pop('install_mode_data', None) # don't set arch_fs for this computed view diff --git a/odoo/addons/base/rng/tree_view.rng b/odoo/addons/base/rng/tree_view.rng index 1dec8e9ab11..dc41ee5005c 100644 --- a/odoo/addons/base/rng/tree_view.rng +++ b/odoo/addons/base/rng/tree_view.rng @@ -17,6 +17,8 @@ <rng:optional><rng:attribute name="duplicate"/></rng:optional> <rng:optional><rng:attribute name="import"/></rng:optional> <rng:optional><rng:attribute name="class"/></rng:optional> + <!-- Allows to take a custom View widget for handling. Defined in view_manager. --> + <rng:optional><rng:attribute name="js_class"/></rng:optional> <rng:optional><rng:attribute name="colors"/></rng:optional> <rng:optional><rng:attribute name="fonts"/></rng:optional> <rng:optional><rng:attribute name="default_order"/></rng:optional> diff --git a/odoo/addons/base/security/base_security.xml b/odoo/addons/base/security/base_security.xml index f3bf2f908dd..21401d88b47 100644 --- a/odoo/addons/base/security/base_security.xml +++ b/odoo/addons/base/security/base_security.xml @@ -78,7 +78,7 @@ <field name="name">res.partner.rule.private.employee</field> <field name="model_id" ref="base.model_res_partner"/> <field name="domain_force"> - [('type', '!=', 'private')] + ['|', ('type', '!=', 'private'), ('type', '=', False)] </field> <field name="groups" eval="[ (4, ref('base.group_user')), diff --git a/odoo/addons/base/tests/test_qweb.py b/odoo/addons/base/tests/test_qweb.py index bea0c74cabe..310c5220897 100644 --- a/odoo/addons/base/tests/test_qweb.py +++ b/odoo/addons/base/tests/test_qweb.py @@ -5,6 +5,7 @@ import collections import json import os.path import re +import sys from lxml import etree @@ -465,6 +466,26 @@ class TestQWebNS(TransactionCase): expected_result ) + def test_render_dynamic_xml_with_code_error(self): + """ Test that, when rendering a template containing a namespaced node + that evaluates code with errors, the proper exception is raised + """ + view1 = self.env['ir.ui.view'].create({ + 'name': "dummy", + 'type': 'qweb', + 'arch': u""" + <t t-name="base.dummy"> + <Invoice xmlns:od="http://odoo.com/od"> + <od:name t-att-test="'a' + 1"/> + </Invoice> + </t> + """ + }) + error_msg = "Can't convert 'int' object to str implicitly" + if sys.version_info >= (3, 6): + error_msg = "must be str, not int" + with self.assertRaisesRegexp(QWebException, error_msg): + view1.render() from copy import deepcopy class FileSystemLoader(object): |
