[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:
@@ -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]
|
||||
|
||||
@@ -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"]
|
||||
}'/>
|
||||
  <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>
|
||||
&mdash; <span t-field="blog_post.post_date" t-options='{"format": "MMMM yyyy"}'/>
|
||||
<span t-if="len(blog_post.message_ids) > 0">
|
||||
  <t t-esc="len(blog_post.message_ids)"/>
|
||||
&mdash; <t t-esc="len(blog_post.message_ids)"/>
|
||||
<t t-if="len(blog_post.message_ids) <= 1" >comment</t>
|
||||
<t t-if="len(blog_post.message_ids) > 1">comments</t>
|
||||
</span>
|
||||
<span t-if="blog_post.visits > 0">
|
||||
  <t t-esc="blog_post.visits"/>
|
||||
&mdash; <t t-esc="blog_post.visits"/>
|
||||
<t t-if="blog_post.visits <= 1" >view</t>
|
||||
<t t-if="blog_post.visits > 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"/>
|
||||
|
||||
Reference in New Issue
Block a user