diff --git a/addons/website_blog/controllers/main.py b/addons/website_blog/controllers/main.py
index f6ee1a1debe..4fa76d217e2 100644
--- a/addons/website_blog/controllers/main.py
+++ b/addons/website_blog/controllers/main.py
@@ -16,9 +16,18 @@ from odoo.tools import html2plaintext
class WebsiteBlog(http.Controller):
- _blog_post_per_page = 20
+ _blog_post_per_page = 12 # multiple of 2,3,4
_post_comment_per_page = 10
+ def tags_list(self, tag_ids, current_tag):
+ tag_ids = list(tag_ids) # required to avoid using the same list
+ if current_tag in tag_ids:
+ tag_ids.remove(current_tag)
+ else:
+ tag_ids.append(current_tag)
+ tag_ids = request.env['blog.tag'].browse(tag_ids).exists()
+ return ','.join(slug(tag) for tag in tag_ids)
+
def nav_list(self, blog=None):
dom = blog and [('blog_id', '=', blog.id)] or []
if not request.env.user.has_group('website.group_website_designer'):
@@ -43,112 +52,25 @@ class WebsiteBlog(http.Controller):
return OrderedDict((year, [m for m in months]) for year, months in itertools.groupby(groups, lambda g: g['year']))
- @http.route([
- '/blog',
- '/blog/page/',
- ], type='http', auth="public", website=True)
- def blogs(self, page=1, tag=None, **post):
- domain = request.website.website_domain()
+ def _prepare_blog_values(self, blogs=False, date_begin=False, date_end=False, tags=False, state=False, page=False):
+ """ Prepare all values to display the blogs index page or one specific blog"""
Blog = request.env['blog.blog']
- blogs = Blog.search(domain, order="create_date, id asc")
+ BlogPost = request.env['blog.post']
+
+ # prepare domain
+ domain = request.website.website_domain()
+
if len(blogs) == 1:
- return werkzeug.utils.redirect('/blog%s' % slug(blogs[0]), code=302)
+ domain += [('blog_id', '=', blogs.id)]
- BlogPost = request.env['blog.post']
- total = BlogPost.search_count(domain)
-
- pager = request.website.pager(
- url='/blog',
- total=total,
- page=page,
- step=self._blog_post_per_page,
- )
- date_begin, date_end = post.get('date_begin'), post.get('date_end')
if date_begin and date_end:
domain += [("post_date", ">=", date_begin), ("post_date", "<=", date_end)]
- # retrocompatibility to accept tag as slug
- active_tag_ids = tag and [int(unslug(t)[1]) for t in tag.split(',')] or []
+ active_tag_ids = tags and [unslug(tag)[1] for tag in tags.split(',')] or []
if active_tag_ids:
domain += [('tag_ids', 'in', active_tag_ids)]
- # function to create the string list of tag ids.
- def tags_list(tag_ids, current_tag):
- tag_ids = list(tag_ids) # required to avoid using the same list
- if current_tag in tag_ids:
- tag_ids.remove(current_tag)
- else:
- tag_ids.append(current_tag)
- tag_ids = request.env['blog.tag'].browse(tag_ids).exists()
- return ','.join(slug(tag) for tag in tag_ids)
-
- posts = BlogPost.search(domain, offset=(page - 1) * self._blog_post_per_page, limit=self._blog_post_per_page)
-
- first_post = next((p for p in posts if p.website_published), None)
- first_cover = first_post and json.loads(first_post.cover_properties)
-
- blog_url = QueryURL('', ['blog', 'tag'])
- return request.render("website_blog.blog_post_short", {
- 'posts': posts,
- 'pager': pager,
- 'blogs': blogs,
- 'blog_url': blog_url,
- 'nav_list': self.nav_list(),
- 'date_begin': date_begin,
- 'date_end': date_end,
- 'tags_list' : tags_list,
- 'active_tag_ids': active_tag_ids,
- 'first_post': first_post,
- 'first_cover': first_cover,
- 'blog_posts_cover_properties': [json.loads(b.cover_properties) for b in posts],
- })
-
- @http.route([
- '''/blog/''',
- '''/blog//page/''',
- '''/blog//tag/''',
- '''/blog//tag//page/''',
- ], type='http', auth="public", website=True)
- def blog(self, blog=None, tag=None, page=1, **opt):
- """ Prepare all values to display the blog.
-
- :return dict values: values for the templates, containing
-
- - 'blog': current blog
- - 'blogs': all blogs for navigation
- - 'pager': pager of posts
- - 'active_tag_ids' : list of active tag ids,
- - 'tag': current tag, if tag_id in parameters
- - 'tags_list' : function to built the comma-separated tag list ids (for the url),
- - 'tags': all tags, for navigation
- - 'state_info': state of published/unpublished filter
- - 'nav_list': a dict [year][month] for archives navigation
- - 'date': date_begin optional parameter, used in archives navigation
- - 'blog_url': help object to create URLs
- """
- if not blog.can_access_from_current_website():
- raise werkzeug.exceptions.NotFound()
-
- date_begin, date_end, state = opt.get('date_begin'), opt.get('date_end'), opt.get('state')
- published_count, unpublished_count = 0, 0
-
- domain = request.website.website_domain()
-
- BlogPost = request.env['blog.post']
-
- Blog = request.env['blog.blog']
- blogs = Blog.search(domain, order="create_date asc")
-
- # retrocompatibility to accept tag as slug
- active_tag_ids = tag and [int(unslug(t)[1]) for t in tag.split(',')] or []
- if active_tag_ids:
- domain += [('tag_ids', 'in', active_tag_ids)]
- if blog:
- domain += [('blog_id', '=', blog.id)]
- if date_begin and date_end:
- domain += [("post_date", ">=", date_begin), ("post_date", "<=", date_end)]
-
if request.env.user.has_group('website.group_website_designer'):
count_domain = domain + [("website_published", "=", True), ("post_date", "<=", fields.Datetime.now())]
published_count = BlogPost.search_count(count_domain)
@@ -161,77 +83,94 @@ class WebsiteBlog(http.Controller):
else:
domain += [("post_date", "<=", fields.Datetime.now())]
- blog_url = QueryURL('', ['blog', 'tag'], blog=blog, tag=tag, date_begin=date_begin, date_end=date_end)
-
- posts = BlogPost.search(domain, order="post_date, id asc")
+ total = BlogPost.search_count(domain)
+ posts = BlogPost.search(domain, offset=(page - 1) * self._blog_post_per_page, limit=self._blog_post_per_page, order="post_date, id asc")
+ pager = request.website.pager(
+ url=request.httprequest.path.partition('/page/')[0],
+ total=total,
+ page=page,
+ step=self._blog_post_per_page,
+ )
first_post = next((p for p in posts if p.website_published), None)
first_cover = first_post and json.loads(first_post.cover_properties)
+ covers = [json.loads(b.cover_properties) for b in posts]
- pager = request.website.pager(
- url=request.httprequest.path.partition('/page/')[0],
- total=len(posts),
- page=page,
- step=self._blog_post_per_page,
- url_args=opt,
- )
- pager_begin = (page - 1) * self._blog_post_per_page
- pager_end = page * self._blog_post_per_page
- posts = posts[pager_begin:pager_end]
-
- all_tags = blog.all_tags()[blog.id]
-
- # function to create the string list of tag ids, and toggle a given one.
- # used in the 'Tags Cloud' template.
- def tags_list(tag_ids, current_tag):
- tag_ids = list(tag_ids) # required to avoid using the same list
- if current_tag in tag_ids:
- tag_ids.remove(current_tag)
- else:
- tag_ids.append(current_tag)
- tag_ids = request.env['blog.tag'].browse(tag_ids).exists()
- return ','.join(slug(tag) for tag in tag_ids)
-
+ all_tags = len(blogs) == 1 and blogs.all_tags()[blogs.id] or blogs.all_tags(join=True)
tag_category = sorted(all_tags.mapped('category_id'), key=lambda category: category.name.upper())
- other_tags = sorted(all_tags.filtered(lambda x: not x.category_id), key=lambda tag: tag.name.upper())
+ other_tags = sorted(all_tags.filtered(lambda x: not x.category_id), key=lambda tag: tag.name.upper())
- values = {
- 'blog': blog,
- 'blogs': blogs,
- 'main_object': blog,
- 'other_tags': other_tags,
- 'state_info': {"state": state, "published": published_count, "unpublished": unpublished_count},
- 'active_tag_ids': active_tag_ids,
- 'tag': tag,
- 'tags_list' : tags_list,
- 'posts': posts,
- 'first_post': first_post,
- 'first_cover': first_cover,
- 'blog_posts_cover_properties': [json.loads(b.cover_properties) for b in posts],
- 'pager': pager,
- 'nav_list': self.nav_list(blog),
- 'blog_url': blog_url,
+ return {
'date_begin': date_begin,
'date_end': date_end,
+ 'first_post': first_post,
+ 'first_cover': first_cover,
+ 'blog_posts_cover_properties': covers,
+ 'other_tags': other_tags,
'tag_category': tag_category,
+ 'nav_list': self.nav_list(),
+ 'tags_list': self.tags_list,
+ 'pager': pager,
+ 'posts': posts,
+ 'tag': tags,
+ 'active_tag_ids': active_tag_ids,
+ 'domain': domain,
+ 'state_info': state and {"state": state, "published": published_count, "unpublished": unpublished_count},
+ 'blogs': Blog.search(request.website.website_domain(), order="create_date asc, id asc"),
}
- response = request.render("website_blog.blog_post_short", values)
- return response
+
+ @http.route([
+ '/blog',
+ '/blog/page/',
+ '/blog/tag/',
+ '/blog/tag//page/',
+ ], type='http', auth="public", website=True)
+ def blogs(self, page=1, tag=None, **post):
+ Blog = request.env['blog.blog']
+ blogs = Blog.search(request.website.website_domain(), order="create_date asc, id asc")
+
+ if len(blogs) == 1:
+ return werkzeug.utils.redirect('/blog/%s' % slug(blogs[0]), code=302)
+
+ date_begin, date_end = post.get('date_begin'), post.get('date_end')
+
+ values = self._prepare_blog_values(blogs=blogs, date_begin=date_begin, date_end=date_end, tags=tag, page=page)
+ values.update({
+ 'blog_url': QueryURL('/blog', ['tag'], date_begin=date_begin, date_end=date_end),
+ })
+ return request.render("website_blog.blog_post_short", values)
+
+ @http.route([
+ '''/blog/''',
+ '''/blog//page/''',
+ '''/blog//tag/''',
+ '''/blog//tag//page/''',
+ ], type='http', auth="public", website=True)
+ def blog(self, blog=None, tag=None, page=1, **opt):
+ if not blog.can_access_from_current_website():
+ raise werkzeug.exceptions.NotFound()
+
+ date_begin, date_end, state = opt.get('date_begin'), opt.get('date_end'), opt.get('state')
+
+ values = self._prepare_blog_values(blogs=blog, date_begin=date_begin, date_end=date_end, tags=tag, state=state, page=page)
+ values.update({
+ 'blog_url': QueryURL('', ['blog', 'tag'], blog=blog, tag=tag, date_begin=date_begin, date_end=date_end),
+ 'blog': blog,
+ })
+ return request.render("website_blog.blog_post_short", values)
@http.route(['''/blog//feed'''], type='http', auth="public")
def blog_feed(self, blog, limit='15', **kwargs):
v = {}
v['blog'] = blog
v['base_url'] = request.env['ir.config_parameter'].sudo().get_param('web.base.url')
- v['posts'] = request.env['blog.post'].search([('blog_id','=', blog.id)],
- limit=min(int(limit), 50),
- order="post_date DESC")
+ v['posts'] = request.env['blog.post'].search([('blog_id', '=', blog.id)], limit=min(int(limit), 50), order="post_date DESC")
v['html2plaintext'] = html2plaintext
r = request.render("website_blog.blog_feed", v, headers=[('Content-Type', 'application/atom+xml')])
return r
@http.route([
- '''/blog//post/''',
+ '''/blog//post/''',
], type='http', auth="public", website=True)
def blog_post(self, blog, blog_post, tag_id=None, page=1, enable_editor=None, **post):
""" Prepare all values to display the blog.
@@ -318,7 +257,7 @@ class WebsiteBlog(http.Controller):
request.session[request.session.sid].append(blog_post.id)
# Increase counter
blog_post.sudo().write({
- 'visits': blog_post.visits+1,
+ 'visits': blog_post.visits + 1,
})
return response
diff --git a/addons/website_blog/data/website_blog_demo.xml b/addons/website_blog/data/website_blog_demo.xml
index 32ecc8b9d68..a3d925b39c2 100644
--- a/addons/website_blog/data/website_blog_demo.xml
+++ b/addons/website_blog/data/website_blog_demo.xml
@@ -35,14 +35,14 @@
- {"background-image": "url('https://source.unsplash.com/JgOeRuGD_Y4/1000x665')", "resize_class": "o_wblog_has_cover cover_full", "text_size_class": "o_wblog_cover_font_big", "background-color": "oe_black", "opacity": "0"}
+ {"background-image": "url('/website_blog/static/src/img/cover_1.png')", "resize_class": "o_wblog_has_cover cover_full", "text_size_class": "o_wblog_cover_font_big", "background-color": "oe_black", "opacity": "0"}Sierra Tarahumara, popularly known as Copper Canyon is situated in Mexico. The area is a favorite destination among those seeking an adventurous vacation.
Copper Canyon is one of the six gorges in the area. Although the name suggests that the gorge might have some relevance to copper mining, this is not the case. The name is derived from the copper and green lichen covering the canyon. Copper Canyon has two climatic zones. The region features an alpine climate at the top and a subtropical climate at the lower levels. Winters are cold with frequent snowstorms at the higher altitudes. Summers are dry and hot. The capital city, Chihuahua, is a high altitude desert where weather ranges from cold winters to hot summers. The region is unique because of the various ecosystems that exist within it.
Another unique feature of Copper Canyon is the presence of the Tarahumara Indian culture. These semi-nomadic people live in cave dwellings. Their livelihood chiefly depends on farming and cattle ranching.
Several migratory and native birds, mammals and reptiles call Copper Canyon their home. The exquisite fauna in this near-pristine land is also worth checking out.
-
+ Photo by Anton Repponen, @repponen
@@ -99,7 +99,7 @@
Molokai Maui
-
+ Photo by Denys Nevozhai, @dnevozhai
Molokai Maui helicopter tours will take you to a different island but one that is only nine miles away and easily accessible by air. This island has a very small population with a different culture and scenery. The entire coast of the northeast is lined with cliffs and remote beaches. They are completely inaccessible by any other means of transportation than air.
@@ -117,7 +117,7 @@ People who live on the island have never even seen this remarkable scenery unles
- {"background-image": "url('https://source.unsplash.com/yB6WFHbkX40/1000x666')", "resize_class": "o_wblog_has_cover cover_mid", "background-color": "oe_black", "opacity": "0.4"}
+ {"background-image": "url('/website_blog/static/src/img/cover_3.png')", "resize_class": "o_wblog_has_cover cover_mid", "background-color": "oe_black", "opacity": "0.4"}So you’re going abroad, you’ve chosen your destination and now you have to choose a hotel.
Ten years ago, you’d have probably visited your local travel agent and trusted the face-to-face advice you were given by the so called ‘experts’. The 21st Century way to select and book your hotel is of course on the Internet, by using travel websites.
@@ -130,7 +130,7 @@ People who live on the island have never even seen this remarkable scenery unles
-
+ Photo by Jason Briscoe, @jbriscoe
@@ -161,14 +161,14 @@ People who live on the island have never even seen this remarkable scenery unles
-
+ How To Look UpBe aware of this thing called “astronomy”
- {"background-image": "url('https://source.unsplash.com/zepnJQycr4U/1000x400')", "resize_class": "o_wblog_has_cover cover_mid", "text_size_class": "o_wblog_cover_font_big", "text_align_class": "text-center", "background-color": "oe_black", "opacity": "0.2"}
+ {"background-image": "url('/website_blog/static/src/img/cover_4.png')", "resize_class": "o_wblog_has_cover cover_mid", "text_size_class": "o_wblog_cover_font_big", "text_align_class": "text-center", "background-color": "oe_black", "opacity": "0.2"}It is safe to say that at some point on our lives, each and every one of us has that moment when we are suddenly stunned when we come face to face with the enormity of the universe that we see in the night sky.
@@ -182,7 +182,7 @@ People who live on the island have never even seen this remarkable scenery unles
So it might be that once a year vacation to a camping spot or a trip to a relative’s house out in the country that we find ourselves outside when the spender of the night sky suddenly decides to put on it’s spectacular show. If you have had that kind of moment when you were literally struck breathless by the spender the night sky can show to us, you can probably remember that exact moment when you could say little else but “wow” at what you saw.
-
+ Photo by Arto Marttinen, @wandervisions
@@ -201,14 +201,14 @@ People who live on the island have never even seen this remarkable scenery unles
-
+ What If They Let You Run The HubbleThe beauty of astronomy is that anybody can do it.
- {"background-image": "url('https://source.unsplash.com/yZygONrUBe8/1000x400')", "resize_class": "o_wblog_has_cover cover_mid", "text_align_class": "text-center", "background-color": "oe_black", "opacity": "0.2"}
+ {"background-image": "url('/website_blog/static/src/img/cover_5.png')", "resize_class": "o_wblog_has_cover cover_mid", "text_align_class": "text-center", "background-color": "oe_black", "opacity": "0.2"}From the tiniest baby to the most advanced astrophysicist, there is something for anyone who wants to enjoy astronomy. In fact, it is a science that is so accessible that virtually anybody can do it virtually anywhere they are. All they have to know how to do is to look up.
It really is amazing when you think about it that just by looking up on any given night, you could see virtually hundreds of thousands of stars, star systems, planets, moons, asteroids, comets and maybe a even an occasional space shuttle might wander by. It is even more breathtaking when you realize that the sky you are looking up at is for all intents and purposes the exact same sky that our ancestors hundreds and thousands of years ago enjoyed when they just looked up.
@@ -221,7 +221,7 @@ People who live on the island have never even seen this remarkable scenery unles
There is something timeless about the cosmos. The fact that the planets and the moon and the stars beyond them have been there for ages does something to our sense of our place in the universe. In fact, many of the stars we “see” with our naked eye are actually light that came from that star hundreds of thousands of years ago. That light is just now reaching the earth. So in a very real way, looking up is like time travel.
-
+ Photo by SpaceX, @spacex
@@ -244,14 +244,14 @@ People who live on the island have never even seen this remarkable scenery unles
-
+ Buying A TelescopeBefore you make your first purchase…
- {"background-image": "url('https://source.unsplash.com/iPbwEiWkVMQ/1100x740')", "resize_class": "o_wblog_has_cover cover_full", "text_size_class": "o_wblog_cover_font_huge", "text_align_class": "text-center", "background-color": "oe_black", "opacity": "0.2"}
+ {"background-image": "url('/website_blog/static/src/img/cover_6.png')", "resize_class": "o_wblog_has_cover cover_full", "text_size_class": "o_wblog_cover_font_huge", "text_align_class": "text-center", "background-color": "oe_black", "opacity": "0.2"}Buying the right telescope to take your love of astronomy to the next level is a big next step in the development of your passion for the stars.
In many ways, it is a big step from someone who is just fooling around with astronomy to a serious student of the science. But you and I both know that there is still another big step after buying a telescope before you really know how to use it.
@@ -271,7 +271,7 @@ People who live on the island have never even seen this remarkable scenery unles
-
+ Photo by Teddy Kelley, @teddykelley
@@ -285,14 +285,14 @@ People who live on the island have never even seen this remarkable scenery unles
-
+ Beyond The EyeBecoming part of the society of devoted amateur astronomers.
- {"background-image": "url('https://source.unsplash.com/vB6mPiQId88/1109x739')", "resize_class": "o_wblog_has_cover cover_mid", "text_size_class": "o_wblog_cover_font_big", "background-color": "oe_black", "opacity": "0.4"}
+ {"background-image": "url('/website_blog/static/src/img/cover_7.png')", "resize_class": "o_wblog_has_cover cover_mid", "text_size_class": "o_wblog_cover_font_big", "background-color": "oe_black", "opacity": "0.4"}For many of us, our very first experience of learning about the celestial bodies begins when we saw our first full moon in the sky. It is truly a magnificent view even to the naked eye.
If the night is clear, you can see amazing detail of the lunar surface just star gazing on in your back yard.
@@ -309,7 +309,7 @@ Naturally, as you grow in your love of astronomy, you will find many celestial b
The best time to view the moon, obviously, is at night when there are few clouds and the weather is accommodating for a long and lasting study. The first quarter yields the greatest detail of study. And don’t be fooled but the blotting out of part of the moon when it is not in full moon stage. The phenomenon known as “earthshine” gives you the ability to see the darkened part of the moon with some detail as well, even if the moon is only at quarter or half display.
-
+ Photo by Patrick Brinksma, @patrickbrinksma
@@ -317,7 +317,7 @@ Naturally, as you grow in your love of astronomy, you will find many celestial b
Of course, to take your moon worship to the ultimate, stepping your equipment up to a good starter telescope will give you the most stunning detail of the lunar surface. With each of these upgrades your knowledge and the depth and scope of what you will be able to see will improve geometrically. For many amateur astronomers, we sometimes cannot get enough of what we can see on this our closest space object.
-
+ Photo by Greg Rakozy, @grakozy
diff --git a/addons/website_blog/models/website_blog.py b/addons/website_blog/models/website_blog.py
index 82f153dcff6..5620230951a 100644
--- a/addons/website_blog/models/website_blog.py
+++ b/addons/website_blog/models/website_blog.py
@@ -5,13 +5,12 @@ from datetime import datetime
import random
import json
-import itertools
-
from odoo import api, models, fields, _
from odoo.addons.http_routing.models.ir_http import slug
from odoo.tools.translate import html_translate
from odoo.tools import html2plaintext
+
class Blog(models.Model):
_name = 'blog.blog'
_description = 'Blogs'
@@ -48,7 +47,8 @@ class Blog(models.Model):
subtype = 'mail.mt_note'
return super(Blog, self).message_post(parent_id=parent_id, subtype=subtype, **kwargs)
- def all_tags(self, min_limit=1):
+ def all_tags(self, join=False, min_limit=1):
+ BlogTag = self.env['blog.tag']
req = """
SELECT
p.blog_id, count(*), r.blog_tag_id
@@ -65,13 +65,20 @@ class Blog(models.Model):
"""
self._cr.execute(req, [tuple(self.ids)])
tag_by_blog = {i.id: [] for i in self}
+ all_tags = set()
for blog_id, freq, tag_id in self._cr.fetchall():
if freq >= min_limit:
- tag_by_blog[blog_id].append(tag_id)
+ if join:
+ all_tags.add(tag_id)
+ else:
+ tag_by_blog[blog_id].append(tag_id)
+
+ if join:
+ return BlogTag.browse(all_tags)
- BlogTag = self.env['blog.tag']
for blog_id in tag_by_blog:
tag_by_blog[blog_id] = BlogTag.browse(tag_by_blog[blog_id])
+
return tag_by_blog
diff --git a/addons/website_blog/static/src/img/content_1_1.png b/addons/website_blog/static/src/img/content_1_1.png
new file mode 100644
index 00000000000..cb357abd5d7
Binary files /dev/null and b/addons/website_blog/static/src/img/content_1_1.png differ
diff --git a/addons/website_blog/static/src/img/content_1_2.png b/addons/website_blog/static/src/img/content_1_2.png
new file mode 100644
index 00000000000..8fede461e7d
Binary files /dev/null and b/addons/website_blog/static/src/img/content_1_2.png differ
diff --git a/addons/website_blog/static/src/img/content_2_1.png b/addons/website_blog/static/src/img/content_2_1.png
new file mode 100644
index 00000000000..83eabfc5ece
Binary files /dev/null and b/addons/website_blog/static/src/img/content_2_1.png differ
diff --git a/addons/website_blog/static/src/img/content_2_2.png b/addons/website_blog/static/src/img/content_2_2.png
new file mode 100644
index 00000000000..db7fd0ab780
Binary files /dev/null and b/addons/website_blog/static/src/img/content_2_2.png differ
diff --git a/addons/website_blog/static/src/img/content_2_3.png b/addons/website_blog/static/src/img/content_2_3.png
new file mode 100644
index 00000000000..38b986cd187
Binary files /dev/null and b/addons/website_blog/static/src/img/content_2_3.png differ
diff --git a/addons/website_blog/static/src/img/content_3_1.png b/addons/website_blog/static/src/img/content_3_1.png
new file mode 100644
index 00000000000..ab0f2ae2789
Binary files /dev/null and b/addons/website_blog/static/src/img/content_3_1.png differ
diff --git a/addons/website_blog/static/src/img/content_4_1.png b/addons/website_blog/static/src/img/content_4_1.png
new file mode 100644
index 00000000000..2bfab19f911
Binary files /dev/null and b/addons/website_blog/static/src/img/content_4_1.png differ
diff --git a/addons/website_blog/static/src/img/content_5_1.png b/addons/website_blog/static/src/img/content_5_1.png
new file mode 100644
index 00000000000..5336ae35d40
Binary files /dev/null and b/addons/website_blog/static/src/img/content_5_1.png differ
diff --git a/addons/website_blog/static/src/img/content_6_1.png b/addons/website_blog/static/src/img/content_6_1.png
new file mode 100644
index 00000000000..2772305c6b3
Binary files /dev/null and b/addons/website_blog/static/src/img/content_6_1.png differ
diff --git a/addons/website_blog/static/src/img/content_7_1.png b/addons/website_blog/static/src/img/content_7_1.png
new file mode 100644
index 00000000000..169a198ae8b
Binary files /dev/null and b/addons/website_blog/static/src/img/content_7_1.png differ
diff --git a/addons/website_blog/static/src/img/content_7_2.png b/addons/website_blog/static/src/img/content_7_2.png
new file mode 100644
index 00000000000..5f244e2ad20
Binary files /dev/null and b/addons/website_blog/static/src/img/content_7_2.png differ
diff --git a/addons/website_blog/static/src/img/cover_1.png b/addons/website_blog/static/src/img/cover_1.png
new file mode 100644
index 00000000000..6011a45a3f5
Binary files /dev/null and b/addons/website_blog/static/src/img/cover_1.png differ
diff --git a/addons/website_blog/static/src/img/cover_2.png b/addons/website_blog/static/src/img/cover_2.png
new file mode 100644
index 00000000000..2231e7c6749
Binary files /dev/null and b/addons/website_blog/static/src/img/cover_2.png differ
diff --git a/addons/website_blog/static/src/img/cover_3.png b/addons/website_blog/static/src/img/cover_3.png
new file mode 100644
index 00000000000..a20fa35a02e
Binary files /dev/null and b/addons/website_blog/static/src/img/cover_3.png differ
diff --git a/addons/website_blog/static/src/img/cover_4.png b/addons/website_blog/static/src/img/cover_4.png
new file mode 100644
index 00000000000..043ae7b1cb4
Binary files /dev/null and b/addons/website_blog/static/src/img/cover_4.png differ
diff --git a/addons/website_blog/static/src/img/cover_5.png b/addons/website_blog/static/src/img/cover_5.png
new file mode 100644
index 00000000000..03f36ad483d
Binary files /dev/null and b/addons/website_blog/static/src/img/cover_5.png differ
diff --git a/addons/website_blog/static/src/img/cover_6.png b/addons/website_blog/static/src/img/cover_6.png
new file mode 100644
index 00000000000..ac972cfa14a
Binary files /dev/null and b/addons/website_blog/static/src/img/cover_6.png differ
diff --git a/addons/website_blog/static/src/img/cover_7.png b/addons/website_blog/static/src/img/cover_7.png
new file mode 100644
index 00000000000..9670ce43d56
Binary files /dev/null and b/addons/website_blog/static/src/img/cover_7.png differ
diff --git a/addons/website_blog/views/website_blog_components.xml b/addons/website_blog/views/website_blog_components.xml
index 2c6e6e30976..5d0239313b1 100644
--- a/addons/website_blog/views/website_blog_components.xml
+++ b/addons/website_blog/views/website_blog_components.xml
@@ -15,7 +15,7 @@
All
-
@@ -169,8 +169,6 @@ Options:
-
-
Tags
diff --git a/addons/website_blog/views/website_blog_posts_loop.xml b/addons/website_blog/views/website_blog_posts_loop.xml
index c8005807637..ed53e0838b7 100644
--- a/addons/website_blog/views/website_blog_posts_loop.xml
+++ b/addons/website_blog/views/website_blog_posts_loop.xml
@@ -47,11 +47,13 @@ according to the enabled options.
-
-
Articles
+
+ Article
+ Articles
+
@@ -60,6 +62,7 @@ according to the enabled options.
+
@@ -75,7 +78,7 @@ according to the enabled options.
-
+
@@ -104,7 +107,7 @@ according to the enabled options.
-
+
@@ -121,7 +124,7 @@ according to the enabled options.