From 52a0406a2c71621ce4c5fc550b9a8a5f695b29bf Mon Sep 17 00:00:00 2001 From: Jeremy Kersten Date: Tue, 19 May 2020 12:26:11 +0000 Subject: [PATCH] [IMP] website_forum: delay the set_viewed Try to make the update the latest possible, to minimize risk of concurrent update. Since it is not critical to loose a view, add the old value in where clause, to try to decrease the risk to alter at the same time a same row. --- addons/website_forum/controllers/main.py | 6 ++++-- addons/website_forum/models/forum.py | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/website_forum/controllers/main.py b/addons/website_forum/controllers/main.py index 3b5fbeae0b4..c3d229135e6 100644 --- a/addons/website_forum/controllers/main.py +++ b/addons/website_forum/controllers/main.py @@ -235,8 +235,6 @@ class WebsiteForum(WebsiteProfile): if question.state == 'pending' and user.karma < forum.karma_post and question.create_uid != user: raise werkzeug.exceptions.NotFound() - # increment view counter - question.sudo().set_viewed() if question.parent_id: redirect_url = "/forum/%s/question/%s" % (slug(forum), slug(question.parent_id)) return werkzeug.utils.redirect(redirect_url, 301) @@ -252,6 +250,10 @@ class WebsiteForum(WebsiteProfile): }) if (request.httprequest.referrer or "").startswith(request.httprequest.url_root): values['back_button_url'] = request.httprequest.referrer + + # increment view counter + question.sudo().set_viewed() + return request.render("website_forum.post_description_full", values) @http.route('/forum//question//toggle_favourite', type='json', auth="user", methods=['POST'], website=True) diff --git a/addons/website_forum/models/forum.py b/addons/website_forum/models/forum.py index d77270c55a9..98cd889e12d 100644 --- a/addons/website_forum/models/forum.py +++ b/addons/website_forum/models/forum.py @@ -838,7 +838,8 @@ class Post(models.Model): return result def set_viewed(self): - self._cr.execute("""UPDATE forum_post SET views = views+1 WHERE id IN %s""", (self._ids,)) + self.ensure_one() + self._cr.execute("""UPDATE forum_post SET views = views+1 WHERE views = %s and id = %s""", (self.views, self.id,)) return True def get_access_action(self, access_uid=None):