diff --git a/addons/website/models/mixins.py b/addons/website/models/mixins.py index 770a5e6d186..4e84a138474 100644 --- a/addons/website/models/mixins.py +++ b/addons/website/models/mixins.py @@ -366,7 +366,6 @@ class WebsiteSearchableMixin(models.AbstractModel): for result, data in zip(self, results_data): for html_field in html_fields: if data[html_field]: - text = text_from_html(data[html_field]) - text = re.sub('\\s+', ' ', text).strip() + text = text_from_html(data[html_field], True) data[html_field] = text return results_data diff --git a/addons/website/tools.py b/addons/website/tools.py index f61530be192..60154f02d7d 100644 --- a/addons/website/tools.py +++ b/addons/website/tools.py @@ -1,5 +1,6 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import contextlib +import re from lxml import etree from unittest.mock import Mock, MagicMock, patch @@ -144,7 +145,7 @@ def similarity_score(s1, s2): score -= len(set1.symmetric_difference(s2)) / (len(s1) + len(s2)) return score -def text_from_html(html_fragment): +def text_from_html(html_fragment, collapse_whitespace=False): """ Returns the plain non-tag text from an html @@ -154,4 +155,7 @@ def text_from_html(html_fragment): """ # lxml requires one single root element tree = etree.fromstring('

%s

' % html_fragment, etree.XMLParser(recover=True)) - return ' '.join(tree.itertext()) + content = ' '.join(tree.itertext()) + if collapse_whitespace: + content = re.sub('\\s+', ' ', content).strip() + return content diff --git a/addons/website_blog/models/website_blog.py b/addons/website_blog/models/website_blog.py index 3ed2c5fa551..b17b80a87c5 100644 --- a/addons/website_blog/models/website_blog.py +++ b/addons/website_blog/models/website_blog.py @@ -6,9 +6,9 @@ import random from odoo import api, models, fields, _ from odoo.addons.http_routing.models.ir_http import slug, unslug +from odoo.addons.website.tools import text_from_html from odoo.tools.json import scriptsafe as json_scriptsafe from odoo.tools.translate import html_translate -from odoo.tools import html2plaintext class Blog(models.Model): @@ -197,7 +197,7 @@ class BlogPost(models.Model): if blog_post.teaser_manual: blog_post.teaser = blog_post.teaser_manual else: - content = html2plaintext(blog_post.content).replace('\n', ' ') + content = text_from_html(blog_post.content, True) blog_post.teaser = content[:200] + '...' def _set_teaser(self): diff --git a/addons/website_blog/tests/test_website_blog_flow.py b/addons/website_blog/tests/test_website_blog_flow.py index 2b6eae51596..29276e935cd 100644 --- a/addons/website_blog/tests/test_website_blog_flow.py +++ b/addons/website_blog/tests/test_website_blog_flow.py @@ -108,3 +108,11 @@ class TestWebsiteBlogFlow(TestWebsiteBlogCommon): self.assertFalse(self.env['mail.message'].sudo().search( [('model', '=', 'blog.post'), ('attachment_ids', 'in', second_attachment.ids)])) + + def test_website_blog_teaser_content(self): + """ Make sure that the content of the post is correctly rendered in + proper plain text. """ + + self.test_blog_post.content = "

Test Content

" + + self.assertEqual(self.test_blog_post.teaser, "Test Content...")