[IMP] website_blog: allow to use publish date in future

Now, you can set the published date in the future.
There will be not visible by visitor until this date.

When a user publish a post, if the published date is in the
past, we update the publish date to now, else we keep the old
published date which one is in the future.
This commit is contained in:
Jeremy Kersten
2016-08-17 10:32:57 +02:00
parent 21bd473de7
commit a4d8cf9ead
4 changed files with 66 additions and 43 deletions
+27 -19
View File
@@ -18,14 +18,17 @@ class WebsiteBlog(http.Controller):
_post_comment_per_page = 10
def nav_list(self, blog=None):
dom = blog and [('blog_id', '=', blog.id)] or []
if not request.env.user.has_group('base.group_website_designer'):
dom += [('post_date', '<=', fields.Datetime.now())]
groups = request.env['blog.post']._read_group_raw(
blog and [('blog_id', '=', blog.id)] or [],
['name', 'create_date'],
groupby=["create_date"], orderby="create_date desc")
dom,
['name', 'post_date'],
groupby=["post_date"], orderby="post_date desc")
for group in groups:
(r, label) = group['create_date']
(r, label) = group['post_date']
start, end = r.split('/')
group['create_date'] = label
group['post_date'] = label
group['date_begin'] = fields.Date.to_string(self._to_date(start))
group['date_end'] = fields.Date.to_string(self._to_date(end))
group['month'] = self._to_date(start).strftime("%B")
@@ -33,9 +36,6 @@ class WebsiteBlog(http.Controller):
return {year: [m for m in months] for year, months in itertools.groupby(groups, lambda g: g['year'])}
def _to_date(self, dt):
""" create_date is a datetime so start and end are datetime strings,
but we just want date strings
"""
return fields.Date.from_string(dt)
@http.route([
@@ -57,7 +57,7 @@ class WebsiteBlog(http.Controller):
page=page,
step=self._blog_post_per_page,
)
posts = BlogPost.search([], offset=(page-1)*self._blog_post_per_page, limit=self._blog_post_per_page)
posts = BlogPost.search([], offset=(page - 1) * self._blog_post_per_page, limit=self._blog_post_per_page)
blog_url = QueryURL('', ['blog', 'tag'])
return request.render("website_blog.latest_blogs", {
'posts': posts,
@@ -104,22 +104,23 @@ class WebsiteBlog(http.Controller):
if blog:
domain += [('blog_id', '=', blog.id)]
if date_begin and date_end:
domain += [("create_date", ">=", date_begin), ("create_date", "<=", date_end)]
domain += [("post_date", ">=", date_begin), ("post_date", "<=", date_end)]
if request.env.user.has_group('base.group_website_designer'):
for group in BlogPost.read_group(domain, ['website_published'], groupby=["website_published"]):
if group['website_published']:
published_count = group['website_published_count']
else:
unpublished_count = group['website_published_count']
count_domain = domain + [("website_published", "=", True), ("post_date", "<=", fields.Datetime.now())]
published_count = BlogPost.search_count(count_domain)
unpublished_count = BlogPost.search_count(domain) - published_count
if state == "published":
domain += [("website_published", "=", True)]
domain += [("website_published", "=", True), ("post_date", "<=", fields.Datetime.now())]
elif state == "unpublished":
domain += [("website_published", "=", False)]
domain += ['|', ("website_published", "=", False), ("post_date", ">", fields.Datetime.now())]
else:
domain += [("post_date", "<=", fields.Datetime.now())]
blog_url = QueryURL('', ['blog', 'tag'], blog=blog, tag=tag, date_begin=date_begin, date_end=date_end)
blog_posts = BlogPost.search(domain, order="published_date desc, create_date desc")
blog_posts = BlogPost.search(domain, order="post_date desc")
pager = request.website.pager(
url=blog_url(),
total=len(blog_posts),
@@ -213,8 +214,15 @@ class WebsiteBlog(http.Controller):
tags = request.env['blog.tag'].search([])
# Find next Post
all_post_ids = BlogPost.search([('blog_id', '=', blog.id)]).ids
all_post = BlogPost.search([('blog_id', '=', blog.id)])
if not request.env.user.has_group('base.group_website_designer'):
all_post = all_post.filtered(lambda r: r.post_date <= fields.Datetime.now())
if blog_post not in all_post:
return request.redirect("/blog/%s" % (slug(blog_post.blog_id)))
# should always return at least the current post
all_post_ids = all_post.ids
current_blog_post_index = all_post_ids.index(blog_post.id)
next_post_id = all_post_ids[0 if current_blog_post_index == len(all_post_ids) - 1 \
else current_blog_post_index + 1]
+23 -7
View File
@@ -2,7 +2,6 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime
from lxml import html
import random
from odoo import api, models, fields, _
@@ -10,6 +9,7 @@ from odoo.addons.website.models.website import slug
from odoo.tools.translate import html_translate
from odoo.tools import html2plaintext
class Blog(models.Model):
_name = 'blog.blog'
_description = 'Blogs'
@@ -90,7 +90,7 @@ class BlogPost(models.Model):
def _compute_ranking(self):
res = {}
for blog_post in self:
age = datetime.now() - fields.Datetime.from_string(blog_post.create_date)
age = datetime.now() - fields.Datetime.from_string(blog_post.post_date)
res[blog_post.id] = blog_post.visits * (0.5 + random.random()) / max(3, age.days)
return res
@@ -111,7 +111,7 @@ class BlogPost(models.Model):
blog_id = fields.Many2one('blog.blog', 'Blog', required=True, ondelete='cascade')
tag_ids = fields.Many2many('blog.tag', string='Tags')
content = fields.Html('Content', default=_default_content, translate=html_translate, sanitize=False)
teaser = fields.Text('Teaser', compute='_get_teaser', inverse='_set_teaser')
teaser = fields.Text('Teaser', compute='_compute_teaser', inverse='_set_teaser')
teaser_manual = fields.Text(string='Teaser Content')
website_message_ids = fields.One2many(
@@ -124,17 +124,18 @@ class BlogPost(models.Model):
)
# creation / update stuff
create_date = fields.Datetime('Created on', index=True, readonly=True)
published_date = fields.Datetime('Published Date')
post_date = fields.Datetime('Published date', compute='_compute_post_date', inverse='_set_post_date', store=True)
create_uid = fields.Many2one('res.users', 'Created by', index=True, readonly=True)
write_date = fields.Datetime('Last Modified on', index=True, readonly=True)
write_uid = fields.Many2one('res.users', 'Last Contributor', index=True, readonly=True)
published_date = fields.Datetime('Published Date')
author_avatar = fields.Binary(related='author_id.image_small', string="Avatar")
visits = fields.Integer('No of Views')
ranking = fields.Float(compute='_compute_ranking', string='Ranking')
@api.multi
@api.depends('content', 'teaser_manual')
def _get_teaser(self):
def _compute_teaser(self):
for blog_post in self:
if blog_post.teaser_manual:
blog_post.teaser = blog_post.teaser_manual
@@ -147,6 +148,20 @@ class BlogPost(models.Model):
for blog_post in self:
blog_post.teaser_manual = blog_post.teaser
@api.multi
@api.depends('create_date', 'published_date')
def _compute_post_date(self):
for blog_post in self:
if blog_post.published_date:
blog_post.post_date = blog_post.published_date
else:
blog_post.post_date = blog_post.create_date
@api.multi
def _set_post_date(self):
for blog_post in self:
blog_post.published_date = blog_post.post_date
def _check_for_publication(self, vals):
if vals.get('website_published'):
for post in self:
@@ -167,8 +182,9 @@ class BlogPost(models.Model):
@api.multi
def write(self, vals):
self.ensure_one()
if 'website_published' in vals:
vals['published_date'] = fields.Datetime.now() if vals['website_published'] else False
if 'website_published' in vals and 'published_date' not in vals:
if self.published_date <= fields.Datetime.now():
vals['published_date'] = vals['website_published'] and fields.Datetime.now()
result = super(BlogPost, self).write(vals)
self._check_for_publication(vals)
return result
@@ -63,7 +63,7 @@
</span>
</h4>
<div class="text-muted">
<span class="fa fa-calendar mr8"> <span t-field="post.create_date"/></span>
<span class="fa fa-calendar mr8"> <span t-field="post.post_date"/></span>
<span class="fa fa-folder-open"> In
<a class="mr8" t-attf-href="#{blog_url(blog=post.blog_id)}">
<span t-field="post.blog_id"/>
@@ -143,15 +143,14 @@
"widget": "contact",
"fields": ["name"]
}'/>
&#5760; <t t-if="blog_post.published_date"><span t-field="blog_post.published_date" t-options='{"format": "MMMM yyyy"}'/></t>
<t t-if="not blog_post.published_date"><span t-field="blog_post.create_date" t-options='{"format": "MMMM yyyy"}'/></t>
&amp;mdash; <span t-field="blog_post.post_date" t-options='{"format": "MMMM yyyy"}'/>
<span t-if="len(blog_post.message_ids) &gt; 0">
&#5760; <t t-esc="len(blog_post.message_ids)"/>
&amp;mdash; <t t-esc="len(blog_post.message_ids)"/>
<t t-if="len(blog_post.message_ids) &lt;= 1" >comment</t>
<t t-if="len(blog_post.message_ids) &gt; 1">comments</t>
</span>
<span t-if="blog_post.visits &gt; 0">
&#5760; <t t-esc="blog_post.visits"/>
&amp;mdash; <t t-esc="blog_post.visits"/>
<t t-if="blog_post.visits &lt;= 1" >view</t>
<t t-if="blog_post.visits &gt; 1">views</t>
</span>
@@ -408,12 +407,12 @@
<t t-foreach="nav_list[year]" t-as="months">
<t t-if="months['date_begin'] == date">
<li class="active">
<a t-ignore="True" t-attf-href="#{blog_url(date_begin=False, date_end=False)}"><t t-esc="months['month']"/><span class="pull-right badge" t-esc="months['create_date_count']"/></a>
<a t-ignore="True" t-attf-href="#{blog_url(date_begin=False, date_end=False)}"><t t-esc="months['month']"/><span class="pull-right badge" t-esc="months['post_date_count']"/></a>
</li>
</t>
<t t-else="1">
<li>
<a t-ignore="True" t-attf-href="#{blog_url(date_begin=months['date_begin'], date_end=months['date_end'])}"><t t-esc="months['month']"/><span class="pull-right badge" t-esc="months['create_date_count']"/></a>
<a t-ignore="True" t-attf-href="#{blog_url(date_begin=months['date_begin'], date_end=months['date_end'])}"><t t-esc="months['month']"/><span class="pull-right badge" t-esc="months['post_date_count']"/></a>
</li>
</t>
</t>
@@ -68,22 +68,22 @@
<field name="website_published" widget="website_button"/>
</button>
</div>
<group>
<field name="name" placeholder="Blog Post Title"/>
<field name="tag_ids" widget="many2many_tags"/>
<field name="subtitle" placeholder="Blog Subtitle"/>
</group>
<group>
<field name="blog_id"/>
<field name="name" placeholder="Blog Post Title"/>
<field name="subtitle" placeholder="Blog Subtitle"/>
<field name="tag_ids" widget="many2many_tags"/>
</group>
<group>
<field name="visits"/>
<field name="ranking" invisible="1"/>
</group>
<group string="Technical" groups="base.group_no_one">
<group string="Publishing Options">
<field name="author_id"/>
<field name="create_date"/>
<field name="post_date"/>
<field name="write_uid"/>
<field name="write_date"/>
</group>
<group string="Technical" groups="base.group_no_one">
<field name="ranking" invisible="1"/>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>