diff --git a/addons/mail/models/mail_render_mixin.py b/addons/mail/models/mail_render_mixin.py index 7476becde46..27b7613669f 100644 --- a/addons/mail/models/mail_render_mixin.py +++ b/addons/mail/models/mail_render_mixin.py @@ -14,7 +14,7 @@ from werkzeug import urls from odoo import _, api, fields, models, tools from odoo.exceptions import UserError -from odoo.tools import safe_eval +from odoo.tools import is_html_empty, safe_eval _logger = logging.getLogger(__name__) @@ -279,6 +279,7 @@ class MailRenderMixin(models.AbstractModel): 'format_duration': lambda value: tools.format_duration(value), 'user': self.env.user, 'ctx': self._context, + 'is_html_empty': is_html_empty, } @api.model diff --git a/addons/portal/models/ir_ui_view.py b/addons/portal/models/ir_ui_view.py index ca4051755f7..64a63bfee0d 100644 --- a/addons/portal/models/ir_ui_view.py +++ b/addons/portal/models/ir_ui_view.py @@ -4,6 +4,7 @@ from odoo import api, models, fields from odoo.http import request from odoo.addons.http_routing.models.ir_http import url_for +from odoo.tools import is_html_empty class View(models.Model): @@ -24,5 +25,6 @@ class View(models.Model): self._context.copy(), languages=[lang for lang in Lang.get_available() if lang[0] in portal_lang_code], url_for=url_for, + is_html_empty=is_html_empty, )) return qcontext diff --git a/odoo/addons/base/models/ir_actions_report.py b/odoo/addons/base/models/ir_actions_report.py index 9eaeb72bfb9..c00b41e6b72 100644 --- a/odoo/addons/base/models/ir_actions_report.py +++ b/odoo/addons/base/models/ir_actions_report.py @@ -6,7 +6,7 @@ from odoo import api, fields, models, tools, SUPERUSER_ID, _ from odoo.exceptions import UserError, AccessError from odoo.tools.safe_eval import safe_eval, time from odoo.tools.misc import find_in_path -from odoo.tools import config +from odoo.tools import config, is_html_empty from odoo.sql_db import TestCursor from odoo.http import request from odoo.osv.expression import NEGATIVE_TERM_OPERATORS, FALSE_DOMAIN @@ -886,6 +886,7 @@ class IrActionsReport(models.Model): 'doc_model': self_sudo.model, 'docs': docs, }) + data['is_html_empty'] = is_html_empty return data def _render(self, res_ids, data=None): diff --git a/odoo/addons/base/tests/test_mail.py b/odoo/addons/base/tests/test_mail.py index ff92a840a2b..755b959f573 100644 --- a/odoo/addons/base/tests/test_mail.py +++ b/odoo/addons/base/tests/test_mail.py @@ -329,7 +329,7 @@ class TestHtmlTools(BaseCase): self.assertTrue(is_html_empty(content)) void_html_samples = ['


', '


', '


', '

', - '
'] + '
', '


'] for content in void_html_samples: self.assertTrue(is_html_empty(content), 'Failed with %s' % content) diff --git a/odoo/tools/mail.py b/odoo/tools/mail.py index bfbfddea275..0dc0bf658e5 100644 --- a/odoo/tools/mail.py +++ b/odoo/tools/mail.py @@ -279,7 +279,7 @@ def is_html_empty(html_content): """ if not html_content: return True - tag_re = re.compile(r'\<\s*\/?(?:p|div|span|br|b|i)\s*(?:style=\".+\")?/?\s*\>') + tag_re = re.compile(r'\<\s*\/?(?:p|div|span|br|b|i)(?:(?=\s+\w*)[^/>]*|\s*)/?\s*\>') return not bool(re.sub(tag_re, '', html_content).strip())