summaryrefslogtreecommitdiff
path: root/odoo
diff options
context:
space:
mode:
Diffstat (limited to 'odoo')
-rw-r--r--odoo/addons/base/tests/test_mail.py24
-rw-r--r--odoo/tools/mail.py14
2 files changed, 33 insertions, 5 deletions
diff --git a/odoo/addons/base/tests/test_mail.py b/odoo/addons/base/tests/test_mail.py
index e1b80c52c28..c2e9899fca1 100644
--- a/odoo/addons/base/tests/test_mail.py
+++ b/odoo/addons/base/tests/test_mail.py
@@ -9,7 +9,8 @@ import threading
from odoo.tests.common import BaseCase, SavepointCase, TransactionCase
from odoo.tools import (
- html_sanitize, append_content_to_html, plaintext2html, email_split,
+ is_html_empty, html_sanitize, append_content_to_html, plaintext2html,
+ email_split,
misc, formataddr,
)
@@ -103,10 +104,10 @@ class TestSanitizer(BaseCase):
not_emails = [
'<blockquote cite="mid:CAEJSRZvWvud8c6Qp=wfNG6O1+wK3i_jb33qVrF7XyrgPNjnyUA@mail.gmail.com" type="cite">cat</blockquote>',
'<img alt="@github-login" class="avatar" src="/web/image/pi" height="36" width="36">']
- for email in not_emails:
- sanitized = html_sanitize(email)
- left_part = email.split('>')[0] # take only left part, as the sanitizer could add data information on node
- self.assertNotIn(misc.html_escape(email), sanitized, 'html_sanitize stripped emails of original html')
+ for not_email in not_emails:
+ sanitized = html_sanitize(not_email)
+ left_part = not_email.split('>')[0] # take only left part, as the sanitizer could add data information on node
+ self.assertNotIn(misc.html_escape(not_email), sanitized, 'html_sanitize stripped emails of original html')
self.assertIn(left_part, sanitized)
def test_style_parsing(self):
@@ -318,6 +319,19 @@ class TestHtmlTools(BaseCase):
for html, content, plaintext_flag, preserve_flag, container_tag, expected in test_samples:
self.assertEqual(append_content_to_html(html, content, plaintext_flag, preserve_flag, container_tag), expected, 'append_content_to_html is broken')
+ def test_is_html_empty(self):
+ void_strings_samples = ['', False, ' ']
+ for content in void_strings_samples:
+ self.assertTrue(is_html_empty(content))
+
+ void_html_samples = ['<p><br></p>', '<p><br> </p>']
+ for content in void_html_samples:
+ self.assertTrue(is_html_empty(content), 'Failed with %s' % content)
+
+ valid_html_samples = ['<p><br>1</p>', '<p>1<br > </p>']
+ for content in valid_html_samples:
+ self.assertFalse(is_html_empty(content))
+
class TestEmailTools(BaseCase):
""" Test some of our generic utility functions for emails """
diff --git a/odoo/tools/mail.py b/odoo/tools/mail.py
index 50467df606e..b6640da1240 100644
--- a/odoo/tools/mail.py
+++ b/odoo/tools/mail.py
@@ -254,6 +254,20 @@ def html_sanitize(src, silent=True, sanitize_tags=True, sanitize_attributes=Fals
# HTML/Text management
#----------------------------------------------------------
+def is_html_empty(html_content):
+ """Check if a html content is empty. If there are only formatting tags or
+ a void content return True. Famous use case if a '<p><br></p>' added by
+ some web editor.
+
+ :param str html_content: html content, coming from example from an HTML field
+ :returns: bool, True if no content found or if containing only void formatting tags
+ """
+ if not html_content:
+ return True
+ tag_re = re.compile(r'\<\s*\/?(?:p|div|span|br|b|i)\s*\>')
+ return not bool(re.sub(tag_re, '', html_content).strip())
+
+
def html_keep_url(text):
""" Transform the url into clickable link with <a/> tag """
idx = 0