[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.
This commit is contained in:
Jeremy Kersten
2020-06-08 07:43:06 +00:00
parent 84ff744eb0
commit 52a0406a2c
2 changed files with 6 additions and 3 deletions
+4 -2
View File
@@ -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/<model("forum.forum"):forum>/question/<model("forum.post"):question>/toggle_favourite', type='json', auth="user", methods=['POST'], website=True)
+2 -1
View File
@@ -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):