From a4d8cf9ead31a8e2160229672ae89ff7485fe753 Mon Sep 17 00:00:00 2001 From: Jeremy Kersten Date: Tue, 16 Aug 2016 17:04:57 +0200 Subject: [PATCH] [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. --- addons/website_blog/controllers/main.py | 46 +++++++++++-------- addons/website_blog/models/website_blog.py | 30 +++++++++--- .../views/website_blog_templates.xml | 13 +++--- .../website_blog/views/website_blog_views.xml | 20 ++++---- 4 files changed, 66 insertions(+), 43 deletions(-) diff --git a/addons/website_blog/controllers/main.py b/addons/website_blog/controllers/main.py index f04cc266760..4413997721f 100644 --- a/addons/website_blog/controllers/main.py +++ b/addons/website_blog/controllers/main.py @@ -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] diff --git a/addons/website_blog/models/website_blog.py b/addons/website_blog/models/website_blog.py index 8e495350a4d..0bc1a670e33 100644 --- a/addons/website_blog/models/website_blog.py +++ b/addons/website_blog/models/website_blog.py @@ -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 diff --git a/addons/website_blog/views/website_blog_templates.xml b/addons/website_blog/views/website_blog_templates.xml index edc5728f006..e2e2de275ee 100644 --- a/addons/website_blog/views/website_blog_templates.xml +++ b/addons/website_blog/views/website_blog_templates.xml @@ -63,7 +63,7 @@
- + In @@ -143,15 +143,14 @@ "widget": "contact", "fields": ["name"] }'/> -   - + &mdash; -   + &mdash; comment comments -   + &mdash; view views @@ -408,12 +407,12 @@
  • - +
  • - +
  • diff --git a/addons/website_blog/views/website_blog_views.xml b/addons/website_blog/views/website_blog_views.xml index 2322a36a581..63a683dd130 100644 --- a/addons/website_blog/views/website_blog_views.xml +++ b/addons/website_blog/views/website_blog_views.xml @@ -68,22 +68,22 @@
    - - - - - + + + - - - - - + + + + + + +