From 8f8adf760b3b2b1b4f540bff115ad3d43b99dff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 30 Mar 2023 10:51:55 +0000 Subject: [PATCH] [FIX] website_forum: fix post/forum website URL computation on memory records 'slug' cannot be called on records which are not yet saved, aka have no ID. In this commit we set the website_url to False for records that do not have any ID. Code managing those URLs is updated to be defensive, as notably when using studio you may end up trying to call methods on in-memory records. Followup of odoo/odoo@da3f4c2aff92cca23ca2d7a87fa0eb5b1d7ce5fe Task-3254382 closes odoo/odoo#117255 X-original-commit: 36c734ab37fdf1d6a245e0e29cfefe3cc46c6d92 Signed-off-by: Thibault Delavallee (tde) --- addons/website_forum/models/forum_forum.py | 7 ++++++- addons/website_forum/models/forum_post.py | 7 +++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/addons/website_forum/models/forum_forum.py b/addons/website_forum/models/forum_forum.py index 49654555c65..c5c4e4ace56 100644 --- a/addons/website_forum/models/forum_forum.py +++ b/addons/website_forum/models/forum_forum.py @@ -181,7 +181,9 @@ class Forum(models.Model): # EXTENDS WEBSITE.MULTI.MIXIN def _compute_website_url(self): - return '/forum/%s' % (slug(self)) + if not self.id: + return False + return f'/forum/{slug(self)}' # ---------------------------------------------------------------------- # CRUD @@ -261,6 +263,9 @@ class Forum(models.Model): def go_to_website(self): self.ensure_one() + website_url = self._compute_website_url + if not website_url: + return False return self.env['website'].get_client_action(self._compute_website_url()) @api.model diff --git a/addons/website_forum/models/forum_post.py b/addons/website_forum/models/forum_post.py index 5f73b898246..88baea92c91 100644 --- a/addons/website_forum/models/forum_post.py +++ b/addons/website_forum/models/forum_post.py @@ -172,8 +172,9 @@ class Post(models.Model): @api.depends('name') def _compute_website_url(self): - for post in self: - anchor = post.parent_id and '#answer_%d' % post.id or '' + self.website_url = False + for post in self.filtered(lambda post: post.id): + anchor = f'#answer_{post.id}' if post.parent_id else '' post.website_url = f'/forum/{slug(post.forum_id)}/{slug(post)}{anchor}' @api.depends('vote_count', 'forum_id.relevancy_post_vote', 'forum_id.relevancy_time_decay') @@ -793,6 +794,8 @@ class Post(models.Model): def go_to_website(self): self.ensure_one() + if not self.website_url: + return False return self.env['website'].get_client_action(self.website_url) @api.model