Forum

website_forum
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/website_forum
VERSION
VERSION 1.2
CATEGORY
CATEGORYWebsite/Website
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Denis Ledoux, Xavier ALT, Nicolas Martinelli, Géry Debongnie, Aaron Bohy, Jeremy Kersten, qsm-odoo, Julien Castiaux, Sébastien Theys, Julien Mougenot, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, abd-msyukyu-odoo, William Braeckman, Benjamin Vray, Benoit Socias, Nicolas Bayet, luvi, alsh-odoo, Victor Piryns (pivi), Thomas Becquevort (thbe), Pierre-Yves Dufays, Dylan Kiss (dyki), Mayurrajsinh Rathod, bram1000, divy-odoo, Mahdi Cheikh Rouhou (macr), Walid (wasa), Mehdi Outagant (MOU), Serge Bayet (seba), nihp-odoo, Chrysanthe (chgo), Adnan Saiyed, Rodolpho Lima, adch-odoo, Junqi Wu, Antoine (anso), Sébastien (blse), Pierre Pulinckx (PIPU), Pierre Pulinckx, Bastien PIERRE, Krzysztof Magusiak (krma), utma-odoo, Alessandro Lupo, Augustin (duau), romo, Serhii Rubanskyi, h4818, saurabh, sbbh-odoo, vega-odoo, Julien (jdeh), chpa-odoo, panj-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/forum
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:45
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - html_editor
    - website_mail
    - website
    - digest
    - portal
    - http_routing
    - resource
    - social_media
    - google_recaptcha
    - utm
    - html_builder
    - website_profile
    - website_partner
    - gamification
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES geoip2
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (65)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
author_box author_box ir.ui.view qweb New
close_post Close Post ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
default_faq Faq Accordion div New
display_activities Forum Profile Activities ir.ui.view qweb New
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
display_post_question_block display_post_question_block ir.ui.view qweb New
edit_post Edit Post ir.ui.view qweb New
faq Frequently Asked Questions ir.ui.view qweb New
faq_karma Karma ir.ui.view qweb New
follow follow ir.ui.view qweb New
forum_all Forum Navigation ir.ui.view qweb New
forum_all_all_entries forum_all_all_entries ir.ui.view qweb New
forum_all_oe_structure_forum_all_top Forum Navigation (oe_structure_forum_all_top) ir.ui.view qweb Inherits website_forum.forum_all
forum_filter_tag Filtering Forum Tag ir.ui.view qweb New
forum_forum_view_form forum.forum.view.form forum.forum form New
forum_forum_view_form_add forum.forum.view.form.add forum.forum form New
forum_forum_view_search forum.forum.view.search forum.forum search New
forum_forum_view_tree forum.forum.view.list forum.forum list New
forum_index Forum ir.ui.view qweb New
forum_index_tags Forum Tags ir.ui.view qweb New
forum_model_nav forum_model_nav ir.ui.view qweb New
forum_post_reason_view_list forum.post.reason.list forum.post.reason list New
forum_post_template_new_answer forum_post_template_new_answer ir.ui.view qweb New
forum_post_template_new_question forum_post_template_new_question ir.ui.view qweb New
forum_post_template_validation forum_post_template_validation ir.ui.view qweb New
forum_post_view_form forum.post.view.form forum.post form New
forum_post_view_graph forum.post.view.graph forum.post graph New
forum_post_view_kanban Forum Post Pages Kanban forum.post kanban New
forum_post_view_search forum.post.view.search forum.post search New
forum_post_view_tree forum.post.view.list forum.post list New
forum_related_posts Related Posts ir.ui.view qweb New
forum_sign_up_cta Sign-Up Call to Action ir.ui.view qweb New
forum_tag_view_form forum.tag.view.form forum.tag form New
forum_tag_view_list forum.tag.view.list forum.tag list New
gamification_karma_tracking_view_search gamification.karma.tracking.view.search.inherit.website.forum gamification.karma.tracking xpath Inherits gamification.gamification_karma_tracking_view_search
header Forum Index ir.ui.view qweb New
header_welcome_message Forum Welcome Message (oe_structure_forum_top) ir.ui.view qweb Inherits website_forum.header
layout Forum Layout ir.ui.view qweb Inherits website.layout
link_button link_button ir.ui.view qweb New
mark_as_offensive mark_as_offensive ir.ui.view qweb New
moderation_display_post_question_block moderation_display_post_question_block ir.ui.view qweb New
moderation_queue Forum Moderation Queue ir.ui.view qweb New
new_question New Post ir.ui.view qweb New
no_results_message no_results_message ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
post_display post_display ir.ui.view qweb New
post_dropdown post_dropdown ir.ui.view qweb New
post_stats post_stats ir.ui.view qweb New
profile_access_denied profile_access_denied ir.ui.view qweb Inherits website_profile.profile_access_denied
show_flag_validator show_flag_validator ir.ui.view qweb New
user_profile_content user_profile_content ir.ui.view qweb Inherits website_profile.user_profile_content
user_sidebar user_sidebar ir.ui.view qweb New
user_sidebar_body user_sidebar_body ir.ui.view qweb New
user_sidebar_header user_sidebar_header ir.ui.view qweb New
user_sidebar_mobile user_sidebar_mobile ir.ui.view qweb New
user_votes Forum User Votes ir.ui.view qweb New
vote vote ir.ui.view qweb New
website_forum.opt_last_post Show Last Post ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_list_view List View ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_post_count Show Post Count ir.ui.view qweb Inherits website_forum.forum_all
Models touched (10)

New fields (60)
  • active Boolean
    default=True
  • allow_share Boolean
    default=True help='After posting the user will be proposed to share its question or answer on social networks, enabling social network propagation of the forum content.' args: 'Sharing Options'
  • authorized_group_id Many2one → res.groups
    args: 'res.groups', 'Authorized Group'
  • can_moderate Boolean
    compute='_compute_can_moderate' string='Is a moderator'
  • count_flagged_posts Integer
    compute='_compute_count_flagged_posts' string='Number of flagged posts'
  • count_posts_waiting_validation Integer
    compute='_compute_count_posts_waiting_validation' string='Number of posts waiting for validation'
  • default_order Selection
    default='last_activity_date desc' required=True string='Default' args: [('create_date desc', 'Newest'), ('last_activity_date desc', 'Last Updated'), ('vote_count desc', 'Most Voted'), ('relevancy desc', 'Relevance'), ('child_count desc', 'Answered')]
  • description Text
    translate=True args: 'Description'
  • faq Html
    sanitize=True sanitize_overridable=True translate=html_translate args: 'Guidelines'
  • has_pending_post Boolean
    compute='_compute_has_pending_post' string='Has pending post'
  • karma_answer Integer
    default=3 string='Answer questions'
  • karma_answer_accept_all Integer
    default=500 string='Accept an answer to all questions'
  • karma_answer_accept_own Integer
    default=20 string='Accept an answer on own questions'
  • karma_ask Integer
    default=3 string='Ask questions'
  • karma_close_all Integer
    default=500 string='Close all posts'
  • karma_close_own Integer
    default=100 string='Close own posts'
  • karma_comment_all Integer
    default=1 string='Comment all posts'
  • karma_comment_convert_all Integer
    default=500 string='Convert all comments to answers'
  • karma_comment_convert_own Integer
    default=50 string='Convert own comments to answers'
  • karma_comment_own Integer
    default=1 string='Comment own posts'
  • karma_comment_unlink_all Integer
    default=500 string='Delete all comments'
  • karma_comment_unlink_own Integer
    default=50 string='Delete own comments'
  • karma_dofollow Integer
    default=500 help='If the author has not enough karma, a nofollow attribute is added to links' string='Nofollow links'
  • karma_downvote Integer
    default=50 string='Downvote'
  • karma_edit_all Integer
    default=300 string='Edit all posts'
  • karma_edit_own Integer
    default=1 string='Edit own posts'
  • karma_edit_retag Integer
    default=75 string='Change question tags'
  • karma_editor Integer
    default=30 string='Editor Features: image and links'
  • karma_flag Integer
    default=500 string='Flag a post as offensive'
  • karma_gen_answer_accept Integer
    default=2 string='Accepting an answer'
  • karma_gen_answer_accepted Integer
    default=15 string='Answer accepted'
  • karma_gen_answer_downvote Integer
    default=-2 string='Answer downvoted'
  • karma_gen_answer_flagged Integer
    default=-100 string='Answer flagged'
  • karma_gen_answer_upvote Integer
    default=10 string='Answer upvoted'
  • karma_gen_question_downvote Integer
    default=-2 string='Question downvoted'
  • karma_gen_question_new Integer
    default=2 string='Asking a question'
  • karma_gen_question_upvote Integer
    default=5 string='Question upvoted'
  • karma_moderate Integer
    default=1000 string='Moderate posts'
  • karma_post Integer
    default=100 string='Ask questions without validation'
  • karma_tag_create Integer
    default=30 string='Create new tags'
  • karma_unlink_all Integer
    default=1000 string='Delete all posts'
  • karma_unlink_own Integer
    default=500 string='Delete own posts'
  • karma_upvote Integer
    default=5 string='Upvote'
  • karma_user_bio Integer
    default=750 string='Display detailed user biography'
  • last_post_id Many2one → forum.post
    compute='_compute_last_post_id' args: 'forum.post'
  • mode Selection
    default='questions' help='Questions mode: only one answer allowed\n Discussions mode: multiple answers allowed' required=True string='Mode' args: [('questions', 'Questions (1 answer)'), ('discussions', 'Discussions (multiple answers)')]
  • name Char
    required=True translate=True args: 'Forum Name'
  • post_ids One2many → forum.post
    string='Posts' args: 'forum.post', 'forum_id'
  • privacy Selection
    default='public' help='Public: Forum is public\nSigned In: Forum is visible for signed in users\nSome users: Forum and their content are hidden for non members of selected group' args: [('public', 'Public'), ('connected', 'Signed In'), ('private', 'Some users')]
  • relevancy_post_vote Float
    default=0.8 help="This formula is used in order to sort by relevance. The variable 'votes' represents number of votes for a post, and 'days' is number of days since the post creation" args: 'First Relevance Parameter'
  • relevancy_time_decay Float
    default=1.8 args: 'Second Relevance Parameter'
  • sequence Integer
    default=1 args: 'Sequence'
  • tag_ids One2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_id'
  • tag_most_used_ids One2many → forum.tag
    compute='_compute_tag_ids_usage' string='Most used tags' args: 'forum.tag'
  • tag_unused_ids One2many → forum.tag
    compute='_compute_tag_ids_usage' string='Unused tags' args: 'forum.tag'
  • total_answers Integer
    compute='_compute_forum_statistics' args: '# Answers'
  • total_favorites Integer
    compute='_compute_forum_statistics' args: '# Favorites'
  • total_posts Integer
    compute='_compute_forum_statistics' args: '# Posts'
  • total_views Integer
    compute='_compute_forum_statistics' args: '# Views'
  • welcome_message Html
    default=_get_default_welcome_message sanitize_attributes=False sanitize_form=False translate=html_translate args: 'Welcome Message'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • go_to_website(self)
  • unlink(self)
  • write(self, vals)

New fields (58)
  • active Boolean
    default=True args: 'Active'
  • can_accept Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Accept'
  • can_answer Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Answer'
  • can_ask Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Ask'
  • can_close Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Close'
  • can_comment Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Comment'
  • can_comment_convert Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Convert to Comment'
  • can_display_biography Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: "Is the author's biography visible from his post"
  • can_downvote Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Downvote'
  • can_edit Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Edit'
  • can_flag Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Flag'
  • can_moderate Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Moderate'
  • can_post Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Automatically be Validated'
  • can_unlink Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Unlink'
  • can_upvote Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Upvote'
  • can_use_full_editor Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Use Full Editor'
  • can_view Boolean
    compute='_compute_post_karma_rights' compute_sudo=False search='_search_can_view' args: 'Can View'
  • child_count Integer
    compute='_compute_child_count' store=True args: 'Answers'
  • child_ids One2many → forum.post
    domain="[('forum_id', '=', forum_id)]" string='Post Answers' args: 'forum.post', 'parent_id'
  • closed_date Datetime
    copy=False readonly=True args: 'Closed on'
  • closed_reason_id Many2one → forum.post.reason
    copy=False string='Reason' args: 'forum.post.reason'
  • closed_uid Many2one → res.users
    copy=False readonly=True string='Closed by' args: 'res.users'
  • content Html
    strip_style=True args: 'Content'
  • create_date Datetime
    index=True readonly=True args: 'Asked on'
  • create_uid Many2one → res.users
    index=True readonly=True string='Created by' args: 'res.users'
  • favourite_count Integer
    compute='_compute_favorite_count' store=True args: 'Favorite'
  • favourite_ids Many2many → res.users
    string='Favourite' args: 'res.users'
  • flag_user_id Many2one → res.users
    string='Flagged by' args: 'res.users'
  • forum_id Many2one → forum.forum
    index=True required=True string='Forum' args: 'forum.forum'
  • has_validated_answer Boolean
    compute='_compute_has_validated_answer' store=True args: 'Is answered'
  • is_correct Boolean
    help='Correct answer or answer accepted' args: 'Correct'
  • karma_accept Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Convert comment to answer'
  • karma_close Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to close'
  • karma_comment Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to comment'
  • karma_comment_convert Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to convert comment to answer'
  • karma_edit Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to edit'
  • karma_flag Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Flag a post as offensive'
  • karma_unlink Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to unlink'
  • last_activity_date Datetime
    default=fields.Datetime.now help="Field to keep track of a post's last activity. Updated whenever it is replied to, or when a comment is added on the post or one of its replies." readonly=True required=True args: 'Last activity on'
  • moderator_id Many2one → res.users
    readonly=True string='Reviewed by' args: 'res.users'
  • name Char
    args: 'Title'
  • parent_id Many2one → forum.post
    index=True ondelete='cascade' readonly=True string='Question' args: 'forum.post'
  • plain_content Text
    compute='_compute_plain_content' store=True args: 'Plain Content'
  • relevancy Float
    compute='_compute_relevancy' store=True args: 'Relevance'
  • self_reply Boolean
    compute='_compute_self_reply' store=True args: 'Reply to own question'
  • state Selection
    default='active' string='Status' args: [('active', 'Active'), ('pending', 'Waiting Validation'), ('close', 'Closed'), ('offensive', 'Offensive'), ('flagged', 'Flagged')]
  • tag_ids Many2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_tag_rel', 'forum_post_id', 'forum_tag_id'
  • uid_has_answered Boolean
    compute='_compute_uid_has_answered' args: 'Has Answered'
  • user_favourite Boolean
    compute='_compute_user_favourite' args: 'Is Favourite'
  • user_vote Integer
    compute='_compute_user_vote' args: 'My Vote'
  • views Integer
    copy=False default=0 readonly=True args: 'Views'
  • vote_count Integer
    compute='_compute_vote_count' store=True args: 'Total Votes'
  • vote_ids One2many → forum.post.vote
    string='Votes' args: 'forum.post.vote', 'post_id'
  • website_id Many2one
    readonly=True related='forum_id.website_id'
  • website_message_ids One2many
    domain=<expr>
  • website_url Char
    compute='_compute_website_url' args: 'Website URL'
  • write_date Datetime
    index=True readonly=True args: 'Updated on'
  • write_uid Many2one → res.users
    index=True readonly=True string='Updated by' args: 'res.users'
Public methods (13)
  • close(self, reason_id)
  • convert_answer_to_comment(self)
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, message_id)
    @api.model
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, vals_list)
    @api.model_create_multi
  • go_to_website(self)
  • mark_as_offensive_batch(self, key, values)
  • message_post(self, *, message_type='notification', **kwargs)
  • reopen(self)
  • unlink(self)
  • unlink_comment(self, message_id)
  • validate(self)
  • vote(self, upvote=True)
  • write(self, vals)

New fields (2)
  • name Char
    required=True string='Closing Reason' translate=True
  • reason_type Selection
    default='basic' string='Reason Type' args: [('basic', 'Basic'), ('offensive', 'Offensive')]
Public methods (0)

No public methods.

New fields (6)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_id Many2one → forum.forum
    index='btree_not_null' readonly=False related='post_id.forum_id' store=True string='Forum' args: 'forum.forum'
  • post_id Many2one → forum.post
    index=True ondelete='cascade' required=True string='Post' args: 'forum.post'
  • recipient_id Many2one → res.users
    readonly=False related='post_id.create_uid' store=True string='To' args: 'res.users'
  • user_id Many2one → res.users
    default=<expr> ondelete='cascade' required=True string='User' args: 'res.users'
  • vote Selection
    default='1' required=True string='Vote' args: [('1', '1'), ('-1', '-1'), ('0', '0')]
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (6)
  • color Integer
    args: 'Color'
  • forum_id Many2one → forum.forum
    index=True required=True string='Forum' args: 'forum.forum'
  • name Char
    required=True args: 'Name'
  • post_ids Many2many → forum.post
    domain=[('state', '=', 'active')] string='Posts' args: 'forum.post', 'forum_tag_rel', 'forum_tag_id', 'forum_post_id'
  • posts_count Integer
    compute='_compute_posts_count' store=True args: 'Number of Posts'
  • website_url Char
    compute='_compute_website_url' args: 'Link to questions with the tag'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (1)
  • challenge_category Selection
    ondelete={'forum': 'set default'} selection_add=[('forum', 'Website / Forum')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
Public methods (2)
  • get_gamification_redirection_data(self)
  • open_website_url(self)

New fields (1)
  • forum_count Integer
    default=0 readonly=True
Public methods (4)
  • configurator_get_footer_links(self)
  • configurator_set_menu_links(self, menu_company, module_data)
  • create(self, vals_list)
    @api.model_create_multi
  • get_suggested_controllers(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/website_forum
VERSION
VERSION 1.2
CATEGORY
CATEGORYWebsite/Website
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Xavier ALT, Xavier Morel, Nicolas Martinelli, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Yannick Tivisse, qsm-odoo, Odoo Online, Romain Derie, Jorge Pinna Puissant, Aurélien Warnon, Adrien Dieudonné, Julien Mougenot, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, abd-msyukyu-odoo, William Braeckman, Benjamin Vray, Benoit Socias, Florian Charlier, Thomas Lefebvre (thle), alsh-odoo, Louis Wicket (wil), Victor Piryns (pivi), Yash Vaishnav, Thomas Becquevort (thbe), amdi-odoo, Soukéina Bojabza, Robin Lejeune (role), Dylan Kiss (dyki), FrancoisGe, Vivek Pathak, Brieuc-brd, divy-odoo, Mahdi Cheikh Rouhou (macr), omra-odoo, Walid (wasa), Paul Stroobant, Jay Savaliya, Astik Singh, Maryam Kia, Serge Bayet (seba), Julien Carion (juca), Lopes Marc (loma), Martin Trigaux (mat), Chrysanthe (chgo), Louis (wil), Junqi Wu, Elisabeth Dickinson, Pratik Raval (PRRA), Antoine (anso), Pierre Pulinckx (PIPU), Khushi, Pierre Pulinckx (pipu), Pierre Pulinckx, Bastien PIERRE, Krzysztof Magusiak (krma), utma-odoo, romo, saurabh
WEBSITE
WEBSITEhttps://www.odoo.com/app/forum
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:58
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - html_editor
    - website_mail
    - website
    - digest
    - portal
    - web_editor
    - http_routing
    - resource
    - social_media
    - google_recaptcha
    - utm
    - website_profile
    - website_partner
    - gamification
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES geoip2
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (69)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
author_box author_box ir.ui.view qweb New
close_post Close Post ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
default_faq Faq Accordion div New
display_activities Forum Profile Activities ir.ui.view qweb New
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
display_post_question_block display_post_question_block ir.ui.view qweb New
edit_post Edit Post ir.ui.view qweb New
faq Frequently Asked Questions ir.ui.view qweb New
faq_karma Karma ir.ui.view qweb New
follow follow ir.ui.view qweb New
forum_all Forum Navigation ir.ui.view qweb New
forum_all_all_entries forum_all_all_entries ir.ui.view qweb New
forum_all_oe_structure_forum_all_top Forum Navigation (oe_structure_forum_all_top) ir.ui.view qweb Inherits website_forum.forum_all
forum_filter_tag Filtering Forum Tag ir.ui.view qweb New
forum_forum_view_form forum.forum.view.form forum.forum form New
forum_forum_view_form_add forum.forum.view.form.add forum.forum form New
forum_forum_view_search forum.forum.view.search forum.forum search New
forum_forum_view_tree forum.forum.view.list forum.forum list New
forum_index Forum ir.ui.view qweb New
forum_index_tags Forum Tags ir.ui.view qweb New
forum_model_nav forum_model_nav ir.ui.view qweb New
forum_post_reason_view_list forum.post.reason.list forum.post.reason list New
forum_post_template_new_answer forum_post_template_new_answer ir.ui.view qweb New
forum_post_template_new_question forum_post_template_new_question ir.ui.view qweb New
forum_post_template_validation forum_post_template_validation ir.ui.view qweb New
forum_post_view_form forum.post.view.form forum.post form New
forum_post_view_graph forum.post.view.graph forum.post graph New
forum_post_view_kanban Forum Post Pages Kanban forum.post kanban New
forum_post_view_search forum.post.view.search forum.post search New
forum_post_view_tree forum.post.view.list forum.post list New
forum_related_posts Related Posts ir.ui.view qweb New
forum_searchbar_input_snippet_options forum search bar snippet options ir.ui.view qweb Inherits website.searchbar_input_snippet_options
forum_sign_up_cta Sign-Up Call to Action ir.ui.view qweb New
forum_tag_view_form forum.tag.view.form forum.tag form New
forum_tag_view_list forum.tag.view.list forum.tag list New
gamification_karma_tracking_view_search gamification.karma.tracking.view.search.inherit.website.forum gamification.karma.tracking xpath Inherits gamification.gamification_karma_tracking_view_search
header Forum Index ir.ui.view qweb New
header_welcome_message Forum Welcome Message (oe_structure_forum_top) ir.ui.view qweb Inherits website_forum.header
layout Forum Layout ir.ui.view qweb Inherits website.layout
link_button link_button ir.ui.view qweb New
mark_as_offensive mark_as_offensive ir.ui.view qweb New
moderation_display_post_question_block moderation_display_post_question_block ir.ui.view qweb New
moderation_queue Forum Moderation Queue ir.ui.view qweb New
new_question New Post ir.ui.view qweb New
no_results_message no_results_message ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
post_display post_display ir.ui.view qweb New
post_dropdown post_dropdown ir.ui.view qweb New
post_stats post_stats ir.ui.view qweb New
profile_access_denied profile_access_denied ir.ui.view qweb Inherits website_profile.profile_access_denied
show_flag_validator show_flag_validator ir.ui.view qweb New
snippet_options Forum Snippet Options ir.ui.view qweb Inherits website.snippet_options
user_profile_content user_profile_content ir.ui.view qweb Inherits website_profile.user_profile_content
user_profile_sub_nav user_profile_sub_nav ir.ui.view qweb Inherits website_profile.user_profile_sub_nav
user_sidebar user_sidebar ir.ui.view qweb New
user_sidebar_body user_sidebar_body ir.ui.view qweb New
user_sidebar_header user_sidebar_header ir.ui.view qweb New
user_sidebar_mobile user_sidebar_mobile ir.ui.view qweb New
user_votes Forum User Votes ir.ui.view qweb New
view_users_form_forum res.users.form.forum res.users div Inherits base.view_users_form
vote vote ir.ui.view qweb New
website_forum.opt_last_post Show Last Post ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_list_view List View ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_post_count Show Post Count ir.ui.view qweb Inherits website_forum.forum_all
Models touched (10)

New fields (61)
  • active Boolean
    default=True
  • allow_share Boolean
    default=True help='After posting the user will be proposed to share its question or answer on social networks, enabling social network propagation of the forum content.' args: 'Sharing Options'
  • authorized_group_id Many2one → res.groups
    args: 'res.groups', 'Authorized Group'
  • can_moderate Boolean
    compute='_compute_can_moderate' string='Is a moderator'
  • count_flagged_posts Integer
    compute='_compute_count_flagged_posts' string='Number of flagged posts'
  • count_posts_waiting_validation Integer
    compute='_compute_count_posts_waiting_validation' string='Number of posts waiting for validation'
  • default_order Selection
    default='last_activity_date desc' required=True string='Default' args: [('create_date desc', 'Newest'), ('last_activity_date desc', 'Last Updated'), ('vote_count desc', 'Most Voted'), ('relevancy desc', 'Relevance'), ('child_count desc', 'Answered')]
  • description Text
    translate=True args: 'Description'
  • faq Html
    sanitize=True sanitize_overridable=True translate=html_translate args: 'Guidelines'
  • has_pending_post Boolean
    compute='_compute_has_pending_post' string='Has pending post'
  • karma_answer Integer
    default=3 string='Answer questions'
  • karma_answer_accept_all Integer
    default=500 string='Accept an answer to all questions'
  • karma_answer_accept_own Integer
    default=20 string='Accept an answer on own questions'
  • karma_ask Integer
    default=3 string='Ask questions'
  • karma_close_all Integer
    default=500 string='Close all posts'
  • karma_close_own Integer
    default=100 string='Close own posts'
  • karma_comment_all Integer
    default=1 string='Comment all posts'
  • karma_comment_convert_all Integer
    default=500 string='Convert all comments to answers'
  • karma_comment_convert_own Integer
    default=50 string='Convert own comments to answers'
  • karma_comment_own Integer
    default=1 string='Comment own posts'
  • karma_comment_unlink_all Integer
    default=500 string='Delete all comments'
  • karma_comment_unlink_own Integer
    default=50 string='Delete own comments'
  • karma_dofollow Integer
    default=500 help='If the author has not enough karma, a nofollow attribute is added to links' string='Nofollow links'
  • karma_downvote Integer
    default=50 string='Downvote'
  • karma_edit_all Integer
    default=300 string='Edit all posts'
  • karma_edit_own Integer
    default=1 string='Edit own posts'
  • karma_edit_retag Integer
    default=75 string='Change question tags'
  • karma_editor Integer
    default=30 string='Editor Features: image and links'
  • karma_flag Integer
    default=500 string='Flag a post as offensive'
  • karma_gen_answer_accept Integer
    default=2 string='Accepting an answer'
  • karma_gen_answer_accepted Integer
    default=15 string='Answer accepted'
  • karma_gen_answer_downvote Integer
    default=-2 string='Answer downvoted'
  • karma_gen_answer_flagged Integer
    default=-100 string='Answer flagged'
  • karma_gen_answer_upvote Integer
    default=10 string='Answer upvoted'
  • karma_gen_question_downvote Integer
    default=-2 string='Question downvoted'
  • karma_gen_question_new Integer
    default=2 string='Asking a question'
  • karma_gen_question_upvote Integer
    default=5 string='Question upvoted'
  • karma_moderate Integer
    default=1000 string='Moderate posts'
  • karma_post Integer
    default=100 string='Ask questions without validation'
  • karma_tag_create Integer
    default=30 string='Create new tags'
  • karma_unlink_all Integer
    default=1000 string='Delete all posts'
  • karma_unlink_own Integer
    default=500 string='Delete own posts'
  • karma_upvote Integer
    default=5 string='Upvote'
  • karma_user_bio Integer
    default=750 string='Display detailed user biography'
  • last_post_id Many2one → forum.post
    compute='_compute_last_post_id' args: 'forum.post'
  • mode Selection
    default='questions' help='Questions mode: only one answer allowed\n Discussions mode: multiple answers allowed' required=True string='Mode' args: [('questions', 'Questions (1 answer)'), ('discussions', 'Discussions (multiple answers)')]
  • name Char
    required=True translate=True args: 'Forum Name'
  • post_ids One2many → forum.post
    string='Posts' args: 'forum.post', 'forum_id'
  • privacy Selection
    default='public' help='Public: Forum is public\nSigned In: Forum is visible for signed in users\nSome users: Forum and their content are hidden for non members of selected group' args: [('public', 'Public'), ('connected', 'Signed In'), ('private', 'Some users')]
  • relevancy_post_vote Float
    default=0.8 help="This formula is used in order to sort by relevance. The variable 'votes' represents number of votes for a post, and 'days' is number of days since the post creation" args: 'First Relevance Parameter'
  • relevancy_time_decay Float
    default=1.8 args: 'Second Relevance Parameter'
  • sequence Integer
    default=1 args: 'Sequence'
  • tag_ids One2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_id'
  • tag_most_used_ids One2many → forum.tag
    compute='_compute_tag_ids_usage' string='Most used tags' args: 'forum.tag'
  • tag_unused_ids One2many → forum.tag
    compute='_compute_tag_ids_usage' string='Unused tags' args: 'forum.tag'
  • teaser Text
    compute='_compute_teaser' store=True args: 'Teaser'
  • total_answers Integer
    compute='_compute_forum_statistics' args: '# Answers'
  • total_favorites Integer
    compute='_compute_forum_statistics' args: '# Favorites'
  • total_posts Integer
    compute='_compute_forum_statistics' args: '# Posts'
  • total_views Integer
    compute='_compute_forum_statistics' args: '# Views'
  • welcome_message Html
    default=_get_default_welcome_message sanitize_attributes=False sanitize_form=False translate=html_translate args: 'Welcome Message'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • go_to_website(self)
  • unlink(self)
  • write(self, vals)

New fields (58)
  • active Boolean
    default=True args: 'Active'
  • can_accept Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Accept'
  • can_answer Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Answer'
  • can_ask Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Ask'
  • can_close Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Close'
  • can_comment Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Comment'
  • can_comment_convert Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Convert to Comment'
  • can_display_biography Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: "Is the author's biography visible from his post"
  • can_downvote Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Downvote'
  • can_edit Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Edit'
  • can_flag Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Flag'
  • can_moderate Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Moderate'
  • can_post Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Automatically be Validated'
  • can_unlink Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Unlink'
  • can_upvote Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Upvote'
  • can_use_full_editor Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Use Full Editor'
  • can_view Boolean
    compute='_compute_post_karma_rights' compute_sudo=False search='_search_can_view' args: 'Can View'
  • child_count Integer
    compute='_compute_child_count' store=True args: 'Answers'
  • child_ids One2many → forum.post
    domain="[('forum_id', '=', forum_id)]" string='Post Answers' args: 'forum.post', 'parent_id'
  • closed_date Datetime
    copy=False readonly=True args: 'Closed on'
  • closed_reason_id Many2one → forum.post.reason
    copy=False string='Reason' args: 'forum.post.reason'
  • closed_uid Many2one → res.users
    copy=False readonly=True string='Closed by' args: 'res.users'
  • content Html
    strip_style=True args: 'Content'
  • create_date Datetime
    index=True readonly=True args: 'Asked on'
  • create_uid Many2one → res.users
    index=True readonly=True string='Created by' args: 'res.users'
  • favourite_count Integer
    compute='_compute_favorite_count' store=True args: 'Favorite'
  • favourite_ids Many2many → res.users
    string='Favourite' args: 'res.users'
  • flag_user_id Many2one → res.users
    string='Flagged by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • has_validated_answer Boolean
    compute='_compute_has_validated_answer' store=True args: 'Is answered'
  • is_correct Boolean
    help='Correct answer or answer accepted' args: 'Correct'
  • karma_accept Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Convert comment to answer'
  • karma_close Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to close'
  • karma_comment Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to comment'
  • karma_comment_convert Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to convert comment to answer'
  • karma_edit Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to edit'
  • karma_flag Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Flag a post as offensive'
  • karma_unlink Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to unlink'
  • last_activity_date Datetime
    default=fields.Datetime.now help="Field to keep track of a post's last activity. Updated whenever it is replied to, or when a comment is added on the post or one of its replies." readonly=True required=True args: 'Last activity on'
  • moderator_id Many2one → res.users
    readonly=True string='Reviewed by' args: 'res.users'
  • name Char
    args: 'Title'
  • parent_id Many2one → forum.post
    index=True ondelete='cascade' readonly=True string='Question' args: 'forum.post'
  • plain_content Text
    compute='_compute_plain_content' store=True args: 'Plain Content'
  • relevancy Float
    compute='_compute_relevancy' store=True args: 'Relevance'
  • self_reply Boolean
    compute='_compute_self_reply' store=True args: 'Reply to own question'
  • state Selection
    default='active' string='Status' args: [('active', 'Active'), ('pending', 'Waiting Validation'), ('close', 'Closed'), ('offensive', 'Offensive'), ('flagged', 'Flagged')]
  • tag_ids Many2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_tag_rel', 'forum_post_id', 'forum_tag_id'
  • uid_has_answered Boolean
    compute='_compute_uid_has_answered' args: 'Has Answered'
  • user_favourite Boolean
    compute='_compute_user_favourite' args: 'Is Favourite'
  • user_vote Integer
    compute='_compute_user_vote' args: 'My Vote'
  • views Integer
    copy=False default=0 readonly=True args: 'Views'
  • vote_count Integer
    compute='_compute_vote_count' store=True args: 'Total Votes'
  • vote_ids One2many → forum.post.vote
    string='Votes' args: 'forum.post.vote', 'post_id'
  • website_id Many2one
    readonly=True related='forum_id.website_id'
  • website_message_ids One2many
    domain=<expr>
  • website_url Char
    compute='_compute_website_url' args: 'Website URL'
  • write_date Datetime
    index=True readonly=True args: 'Updated on'
  • write_uid Many2one → res.users
    index=True readonly=True string='Updated by' args: 'res.users'
Public methods (13)
  • close(self, reason_id)
  • convert_answer_to_comment(self)
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, message_id)
    @api.model
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, vals_list)
    @api.model_create_multi
  • go_to_website(self)
  • mark_as_offensive_batch(self, key, values)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • reopen(self)
  • unlink(self)
  • unlink_comment(self, message_id)
  • validate(self)
  • vote(self, upvote=True)
  • write(self, vals)

New fields (2)
  • name Char
    required=True string='Closing Reason' translate=True
  • reason_type Selection
    default='basic' string='Reason Type' args: [('basic', 'Basic'), ('offensive', 'Offensive')]
Public methods (0)

No public methods.

New fields (6)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_id Many2one → forum.forum
    readonly=False related='post_id.forum_id' store=True string='Forum' args: 'forum.forum'
  • post_id Many2one → forum.post
    ondelete='cascade' required=True string='Post' args: 'forum.post'
  • recipient_id Many2one → res.users
    readonly=False related='post_id.create_uid' store=True string='To' args: 'res.users'
  • user_id Many2one → res.users
    default=<expr> ondelete='cascade' required=True string='User' args: 'res.users'
  • vote Selection
    default='1' required=True string='Vote' args: [('1', '1'), ('-1', '-1'), ('0', '0')]
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (6)
  • color Integer
    args: 'Color'
  • forum_id Many2one → forum.forum
    index=True required=True string='Forum' args: 'forum.forum'
  • name Char
    required=True args: 'Name'
  • post_ids Many2many → forum.post
    domain=[('state', '=', 'active')] string='Posts' args: 'forum.post', 'forum_tag_rel', 'forum_tag_id', 'forum_post_id'
  • posts_count Integer
    compute='_compute_posts_count' store=True args: 'Number of Posts'
  • website_url Char
    compute='_compute_website_url' args: 'Link to questions with the tag'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (1)
  • challenge_category Selection
    ondelete={'forum': 'set default'} selection_add=[('forum', 'Website / Forum')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
Public methods (2)
  • get_gamification_redirection_data(self)
  • open_website_url(self)

New fields (1)
  • forum_count Integer
    default=0 readonly=True
Public methods (4)
  • configurator_get_footer_links(self)
  • configurator_set_menu_links(self, menu_company, module_data)
  • create(self, vals_list)
    @api.model_create_multi
  • get_suggested_controllers(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/website_forum
VERSION
VERSION 1.2
CATEGORY
CATEGORYWebsite/Website
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Xavier Morel, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Damien Bouvy, Yannick Tivisse, qsm-odoo, Odoo Online, Romain Derie, Jorge Pinna Puissant, Aurélien Warnon, Xavier-Do, Sébastien Theys, Samuel Degueldre, std-odoo, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, William Braeckman, Benoit Socias, Guillaume (gdi), Arthur Detroux (ard), Florian Charlier, Nicolas Bayet, luvi, niyasraphy, Thomas Lefebvre (thle), Louis Wicket (wil), Mahamadasif Ansari, Thomas Becquevort (thbe), amdi-odoo, Tom De Caluwé, Pierre-Yves Dufays, Soukéina Bojabza, Robin Lejeune (role), Dylan Kiss (dyki), FrancoisGe, Michael (mcm), Vivek Pathak, Xavier Bol (xbo), Brieuc-brd, divy-odoo, Mahdi Cheikh Rouhou (macr), Walid (wasa), Paul Stroobant, Astik Singh, dane@odoo.com, Lopes Marc (loma), Chrysanthe (chgo), Louis (wil), Elisabeth Dickinson, Pratik Raval (PRRA), Pierre Pulinckx (pipu), Bastien PIERRE, Pulinckx Pierre (PIPU)
WEBSITE
WEBSITEhttps://www.odoo.com/app/forum
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - website_mail
    - website
    - digest
    - portal
    - web_editor
    - http_routing
    - resource
    - social_media
    - google_recaptcha
    - utm
    - website_profile
    - website_partner
    - gamification
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES geoip2
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (67)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
author_box author_box ir.ui.view qweb New
close_post Close Post ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
default_faq Faq Accordion section New
display_activities Forum Profile Activities ir.ui.view qweb New
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
display_post_question_block display_post_question_block ir.ui.view qweb New
edit_post Edit Post ir.ui.view qweb New
faq Frequently Asked Questions ir.ui.view qweb New
faq_karma Karma ir.ui.view qweb New
follow follow ir.ui.view qweb New
forum_all Forum Navigation ir.ui.view qweb New
forum_all_all_entries forum_all_all_entries ir.ui.view qweb New
forum_all_oe_structure_forum_all_top Forum Navigation (oe_structure_forum_all_top) ir.ui.view qweb Inherits website_forum.forum_all
forum_filter_tag Filtering Forum Tag ir.ui.view qweb New
forum_forum_view_form forum.forum.view.form forum.forum form New
forum_forum_view_form_add forum.forum.view.form.add forum.forum form New
forum_forum_view_search forum.forum.view.search forum.forum search New
forum_forum_view_tree forum.forum.view.tree forum.forum tree New
forum_index Forum ir.ui.view qweb New
forum_index_tags Forum Tags ir.ui.view qweb New
forum_model_nav forum_model_nav ir.ui.view qweb New
forum_post_reason_view_list forum.post.reason.list forum.post.reason tree New
forum_post_template_new_answer forum_post_template_new_answer ir.ui.view qweb New
forum_post_template_new_question forum_post_template_new_question ir.ui.view qweb New
forum_post_template_validation forum_post_template_validation ir.ui.view qweb New
forum_post_view_form forum.post.view.form forum.post form New
forum_post_view_graph forum.post.view.graph forum.post graph New
forum_post_view_kanban Forum Post Pages Kanban forum.post kanban New
forum_post_view_search forum.post.view.search forum.post search New
forum_post_view_tree forum.post.view.tree forum.post tree New
forum_searchbar_input_snippet_options forum search bar snippet options ir.ui.view qweb Inherits website.searchbar_input_snippet_options
forum_tag_view_form forum.tag.view.form forum.tag form New
forum_tag_view_list forum.tag.view.list forum.tag tree New
gamification_karma_tracking_view_search gamification.karma.tracking.view.search.inherit.website.forum gamification.karma.tracking xpath Inherits gamification.gamification_karma_tracking_view_search
header Forum Index ir.ui.view qweb New
header_welcome_message Forum Welcome Message (oe_structure_forum_top) ir.ui.view qweb Inherits website_forum.header
layout Forum Layout ir.ui.view qweb Inherits website.layout
link_button link_button ir.ui.view qweb New
mark_as_offensive mark_as_offensive ir.ui.view qweb New
moderation_display_post_question_block moderation_display_post_question_block ir.ui.view qweb New
moderation_queue Forum Moderation Queue ir.ui.view qweb New
new_question New Post ir.ui.view qweb New
no_results_message no_results_message ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
post_display post_display ir.ui.view qweb New
post_dropdown post_dropdown ir.ui.view qweb New
post_stats post_stats ir.ui.view qweb New
profile_access_denied profile_access_denied ir.ui.view qweb Inherits website_profile.profile_access_denied
show_flag_validator show_flag_validator ir.ui.view qweb New
snippet_options Forum Snippet Options ir.ui.view qweb Inherits website.snippet_options
user_profile_content user_profile_content ir.ui.view qweb Inherits website_profile.user_profile_content
user_profile_sub_nav user_profile_sub_nav ir.ui.view qweb Inherits website_profile.user_profile_sub_nav
user_sidebar user_sidebar ir.ui.view qweb New
user_sidebar_body user_sidebar_body ir.ui.view qweb New
user_sidebar_header user_sidebar_header ir.ui.view qweb New
user_sidebar_mobile user_sidebar_mobile ir.ui.view qweb New
user_votes Forum User Votes ir.ui.view qweb New
view_users_form_forum res.users.form.forum res.users div Inherits base.view_users_form
vote vote ir.ui.view qweb New
website_forum.opt_last_post Show Last Post ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_list_view List View ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_post_count Show Post Count ir.ui.view qweb Inherits website_forum.forum_all
Models touched (13)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (62)
  • active Boolean
    default=True
  • allow_share Boolean
    default=True help='After posting the user will be proposed to share its question or answer on social networks, enabling social network propagation of the forum content.' args: 'Sharing Options'
  • authorized_group_id Many2one → res.groups
    args: 'res.groups', 'Authorized Group'
  • can_moderate Boolean
    compute='_compute_can_moderate' string='Is a moderator'
  • count_flagged_posts Integer
    compute='_compute_count_flagged_posts' string='Number of flagged posts'
  • count_posts_waiting_validation Integer
    compute='_compute_count_posts_waiting_validation' string='Number of posts waiting for validation'
  • default_order Selection
    default='last_activity_date desc' required=True string='Default' args: [('create_date desc', 'Newest'), ('last_activity_date desc', 'Last Updated'), ('vote_count desc', 'Most Voted'), ('relevancy desc', 'Relevance'), ('child_count desc', 'Answered')]
  • description Text
    translate=True args: 'Description'
  • faq Html
    sanitize=True sanitize_overridable=True translate=html_translate args: 'Guidelines'
  • has_pending_post Boolean
    compute='_compute_has_pending_post' string='Has pending post'
  • karma_answer Integer
    default=3 string='Answer questions'
  • karma_answer_accept_all Integer
    default=500 string='Accept an answer to all questions'
  • karma_answer_accept_own Integer
    default=20 string='Accept an answer on own questions'
  • karma_ask Integer
    default=3 string='Ask questions'
  • karma_close_all Integer
    default=500 string='Close all posts'
  • karma_close_own Integer
    default=100 string='Close own posts'
  • karma_comment_all Integer
    default=1 string='Comment all posts'
  • karma_comment_convert_all Integer
    default=500 string='Convert all answers to comments and vice versa'
  • karma_comment_convert_own Integer
    default=50 string='Convert own answers to comments and vice versa'
  • karma_comment_own Integer
    default=1 string='Comment own posts'
  • karma_comment_unlink_all Integer
    default=500 string='Unlink all comments'
  • karma_comment_unlink_own Integer
    default=50 string='Unlink own comments'
  • karma_dofollow Integer
    default=500 help='If the author has not enough karma, a nofollow attribute is added to links' string='Nofollow links'
  • karma_downvote Integer
    default=50 string='Downvote'
  • karma_edit_all Integer
    default=300 string='Edit all posts'
  • karma_edit_own Integer
    default=1 string='Edit own posts'
  • karma_edit_retag Integer
    default=75 string='Change question tags'
  • karma_editor Integer
    default=30 string='Editor Features: image and links'
  • karma_flag Integer
    default=500 string='Flag a post as offensive'
  • karma_gen_answer_accept Integer
    default=2 string='Accepting an answer'
  • karma_gen_answer_accepted Integer
    default=15 string='Answer accepted'
  • karma_gen_answer_downvote Integer
    default=-2 string='Answer downvoted'
  • karma_gen_answer_flagged Integer
    default=-100 string='Answer flagged'
  • karma_gen_answer_upvote Integer
    default=10 string='Answer upvoted'
  • karma_gen_question_downvote Integer
    default=-2 string='Question downvoted'
  • karma_gen_question_new Integer
    default=2 string='Asking a question'
  • karma_gen_question_upvote Integer
    default=5 string='Question upvoted'
  • karma_moderate Integer
    default=1000 string='Moderate posts'
  • karma_post Integer
    default=100 string='Ask questions without validation'
  • karma_tag_create Integer
    default=30 string='Create new tags'
  • karma_unlink_all Integer
    default=1000 string='Delete all posts'
  • karma_unlink_own Integer
    default=500 string='Delete own posts'
  • karma_upvote Integer
    default=5 string='Upvote'
  • karma_user_bio Integer
    default=750 string='Display detailed user biography'
  • last_post_id Many2one → forum.post
    compute='_compute_last_post_id' args: 'forum.post'
  • menu_id Many2one → website.menu
    copy=False args: 'website.menu', 'Menu'
  • mode Selection
    default='questions' help='Questions mode: only one answer allowed\n Discussions mode: multiple answers allowed' required=True string='Mode' args: [('questions', 'Questions (1 answer)'), ('discussions', 'Discussions (multiple answers)')]
  • name Char
    required=True translate=True args: 'Forum Name'
  • post_ids One2many → forum.post
    string='Posts' args: 'forum.post', 'forum_id'
  • privacy Selection
    default='public' help='Public: Forum is public\nSigned In: Forum is visible for signed in users\nSome users: Forum and their content are hidden for non members of selected group' args: [('public', 'Public'), ('connected', 'Signed In'), ('private', 'Some users')]
  • relevancy_post_vote Float
    default=0.8 help="This formula is used in order to sort by relevance. The variable 'votes' represents number of votes for a post, and 'days' is number of days since the post creation" args: 'First Relevance Parameter'
  • relevancy_time_decay Float
    default=1.8 args: 'Second Relevance Parameter'
  • sequence Integer
    default=1 args: 'Sequence'
  • tag_ids One2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_id'
  • tag_most_used_ids One2many → forum.tag
    compute='_compute_tag_ids_usage' string='Most used tags' args: 'forum.tag'
  • tag_unused_ids One2many → forum.tag
    compute='_compute_tag_ids_usage' string='Unused tags' args: 'forum.tag'
  • teaser Text
    compute='_compute_teaser' store=True args: 'Teaser'
  • total_answers Integer
    compute='_compute_forum_statistics' args: '# Answers'
  • total_favorites Integer
    compute='_compute_forum_statistics' args: '# Favorites'
  • total_posts Integer
    compute='_compute_forum_statistics' args: '# Posts'
  • total_views Integer
    compute='_compute_forum_statistics' args: '# Views'
  • welcome_message Html
    default=_get_default_welcome_message sanitize_attributes=False sanitize_form=False translate=html_translate args: 'Welcome Message'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • go_to_website(self)
  • unlink(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (58)
  • active Boolean
    default=True args: 'Active'
  • can_accept Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Accept'
  • can_answer Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Answer'
  • can_ask Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Ask'
  • can_close Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Close'
  • can_comment Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Comment'
  • can_comment_convert Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Convert to Comment'
  • can_display_biography Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: "Is the author's biography visible from his post"
  • can_downvote Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Downvote'
  • can_edit Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Edit'
  • can_flag Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Flag'
  • can_moderate Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Moderate'
  • can_post Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Automatically be Validated'
  • can_unlink Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Unlink'
  • can_upvote Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Upvote'
  • can_use_full_editor Boolean
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Can Use Full Editor'
  • can_view Boolean
    compute='_compute_post_karma_rights' compute_sudo=False search='_search_can_view' args: 'Can View'
  • child_count Integer
    compute='_compute_child_count' store=True args: 'Answers'
  • child_ids One2many → forum.post
    domain="[('forum_id', '=', forum_id)]" string='Post Answers' args: 'forum.post', 'parent_id'
  • closed_date Datetime
    copy=False readonly=True args: 'Closed on'
  • closed_reason_id Many2one → forum.post.reason
    copy=False string='Reason' args: 'forum.post.reason'
  • closed_uid Many2one → res.users
    copy=False readonly=True string='Closed by' args: 'res.users'
  • content Html
    strip_style=True args: 'Content'
  • create_date Datetime
    index=True readonly=True args: 'Asked on'
  • create_uid Many2one → res.users
    index=True readonly=True string='Created by' args: 'res.users'
  • favourite_count Integer
    compute='_compute_favorite_count' store=True args: 'Favorite'
  • favourite_ids Many2many → res.users
    string='Favourite' args: 'res.users'
  • flag_user_id Many2one → res.users
    string='Flagged by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • has_validated_answer Boolean
    compute='_compute_has_validated_answer' store=True args: 'Is answered'
  • is_correct Boolean
    help='Correct answer or answer accepted' args: 'Correct'
  • karma_accept Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Convert comment to answer'
  • karma_close Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to close'
  • karma_comment Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to comment'
  • karma_comment_convert Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to convert comment to answer'
  • karma_edit Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to edit'
  • karma_flag Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Flag a post as offensive'
  • karma_unlink Integer
    compute='_compute_post_karma_rights' compute_sudo=False args: 'Karma to unlink'
  • last_activity_date Datetime
    default=fields.Datetime.now help="Field to keep track of a post's last activity. Updated whenever it is replied to, or when a comment is added on the post or one of its replies." readonly=True required=True args: 'Last activity on'
  • moderator_id Many2one → res.users
    readonly=True string='Reviewed by' args: 'res.users'
  • name Char
    args: 'Title'
  • parent_id Many2one → forum.post
    index=True ondelete='cascade' readonly=True string='Question' args: 'forum.post'
  • plain_content Text
    compute='_compute_plain_content' store=True args: 'Plain Content'
  • relevancy Float
    compute='_compute_relevancy' store=True args: 'Relevance'
  • self_reply Boolean
    compute='_compute_self_reply' store=True args: 'Reply to own question'
  • state Selection
    default='active' string='Status' args: [('active', 'Active'), ('pending', 'Waiting Validation'), ('close', 'Closed'), ('offensive', 'Offensive'), ('flagged', 'Flagged')]
  • tag_ids Many2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_tag_rel', 'forum_id', 'forum_tag_id'
  • uid_has_answered Boolean
    compute='_compute_uid_has_answered' args: 'Has Answered'
  • user_favourite Boolean
    compute='_compute_user_favourite' args: 'Is Favourite'
  • user_vote Integer
    compute='_compute_user_vote' args: 'My Vote'
  • views Integer
    copy=False default=0 readonly=True args: 'Views'
  • vote_count Integer
    compute='_compute_vote_count' store=True args: 'Total Votes'
  • vote_ids One2many → forum.post.vote
    string='Votes' args: 'forum.post.vote', 'post_id'
  • website_id Many2one
    readonly=True related='forum_id.website_id'
  • website_message_ids One2many
    domain=<expr>
  • website_url Char
    compute='_compute_website_url' args: 'Website URL'
  • write_date Datetime
    index=True readonly=True args: 'Updated on'
  • write_uid Many2one → res.users
    index=True readonly=True string='Updated by' args: 'res.users'
Public methods (17)
  • close(self, reason_id)
  • convert_answer_to_comment(self)
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, message_id)
    @api.model
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, vals_list)
    @api.model_create_multi
  • flag(self)
  • go_to_website(self)
  • mark_as_offensive(self, reason_id)
  • mark_as_offensive_batch(self, key, values)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • post_notification(self)
  • refuse(self)
  • reopen(self)
  • unlink(self)
  • unlink_comment(self, message_id)
  • validate(self)
  • vote(self, upvote=True)
  • write(self, vals)

New fields (2)
  • name Char
    required=True string='Closing Reason' translate=True
  • reason_type Selection
    default='basic' string='Reason Type' args: [('basic', 'Basic'), ('offensive', 'Offensive')]
Public methods (0)

No public methods.

New fields (6)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_id Many2one → forum.forum
    readonly=False related='post_id.forum_id' store=True string='Forum' args: 'forum.forum'
  • post_id Many2one → forum.post
    ondelete='cascade' required=True string='Post' args: 'forum.post'
  • recipient_id Many2one → res.users
    readonly=False related='post_id.create_uid' store=True string='To' args: 'res.users'
  • user_id Many2one → res.users
    default=<expr> ondelete='cascade' required=True string='User' args: 'res.users'
  • vote Selection
    default='1' required=True string='Vote' args: [('1', '1'), ('-1', '-1'), ('0', '0')]
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (5)
  • forum_id Many2one → forum.forum
    index=True required=True string='Forum' args: 'forum.forum'
  • name Char
    required=True args: 'Name'
  • post_ids Many2many → forum.post
    domain=[('state', '=', 'active')] string='Posts' args: 'forum.post', 'forum_tag_rel', 'forum_tag_id', 'forum_id'
  • posts_count Integer
    compute='_compute_posts_count' store=True args: 'Number of Posts'
  • website_url Char
    compute='_compute_website_url' args: 'Link to questions with the tag'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (1)
  • challenge_category Selection
    ondelete={'forum': 'set default'} selection_add=[('forum', 'Website / Forum')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
Public methods (2)
  • get_gamification_redirection_data(self)
  • open_website_url(self)

New fields (1)
  • forum_count Integer
    default=0 readonly=True
Public methods (4)
  • configurator_get_footer_links(self)
  • configurator_set_menu_links(self, menu_company, module_data)
  • create(self, vals_list)
    @api.model_create_multi
  • get_suggested_controllers(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/website_forum
VERSION
VERSION 1.1
CATEGORY
CATEGORYWebsite/Website
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Stefan Rijnhart, Jeremy Kersten, Yannick Tivisse, qsm-odoo, Romain Derie, Aurélien Warnon, Romeo Fragomeli, Samuel Degueldre, Achraf (abz), Tiffany Chang (tic), Gorash, William Braeckman, Romain Estievenart, Kevin Baptiste, Benoit Socias, Hardik Prajapati, Guillaume (gdi), MerlinGuillaume, Antoine Guenet, Arthur Detroux (ard), Florian Charlier, luvi, Fabio Barbero, niyasraphy, Thomas Lefebvre (thle), Louis Wicket (wil), Thomas Becquevort (thbe), amdi-odoo, Tom De Caluwé, Soukéina Bojabza, flvr-odoo, Vivek Pathak, divy-odoo, Mahdi Cheikh Rouhou (macr), Astik Singh, Lopes Marc (loma), Thomas Josse
WEBSITE
WEBSITEhttps://www.odoo.com/app/forum
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - website_mail
    - website
    - digest
    - portal
    - web_editor
    - http_routing
    - resource
    - social_media
    - google_recaptcha
    - utm
    - website_profile
    - website_partner
    - gamification
    - web_kanban_gauge
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (62)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
close_post Close Post ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
default_faq Faq Accordion section New
display_activities Forum Profile Activities ir.ui.view qweb New
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
display_post_question_block display_post_question_block ir.ui.view qweb New
edit_post edit_post ir.ui.view qweb New
faq Frequently Asked Questions ir.ui.view qweb New
faq_karma Karma ir.ui.view qweb New
forum_all Forum Navigation ir.ui.view qweb New
forum_all_all_entries forum_all_all_entries ir.ui.view qweb New
forum_all_oe_structure_forum_all_top Forum Navigation (oe_structure_forum_all_top) ir.ui.view qweb Inherits website_forum.forum_all
forum_filter_tag Filtering Forum Tag ir.ui.view qweb New
forum_forum_view_form_add forum.forum.view.form.add forum.forum form New
forum_index Forum ir.ui.view qweb New
forum_nav_header forum_nav_header ir.ui.view qweb New
forum_post_options forum_post_options ir.ui.view qweb New
forum_post_reason_view_list forum.post.reason.list forum.post.reason tree New
forum_post_template_new_answer forum_post_template_new_answer ir.ui.view qweb New
forum_post_template_new_question forum_post_template_new_question ir.ui.view qweb New
forum_post_template_validation forum_post_template_validation ir.ui.view qweb New
forum_post_view_kanban Forum Post Pages Kanban forum.post kanban New
forum_searchbar_input_snippet_options forum search bar snippet options ir.ui.view qweb Inherits website.searchbar_input_snippet_options
forum_tag_view_form forum.tag.form forum.tag form New
forum_tag_view_list forum.tag.list forum.tag tree New
forum_view_search forum.forum.search forum.forum search New
header Forum Index ir.ui.view qweb New
layout Forum Layout ir.ui.view qweb Inherits website.layout
link_button link_button ir.ui.view qweb New
mark_as_offensive mark_as_offensive ir.ui.view qweb New
moderation_display_post_answer moderation_display_post_answer ir.ui.view qweb New
moderation_display_post_question_block moderation_display_post_question_block ir.ui.view qweb New
moderation_queue Forum Moderation Queue ir.ui.view qweb New
new_question New Post ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_answers post_answers ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
post_reply post_reply ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb Inherits website_profile.private_profile
show_flag_validator show_flag_validator ir.ui.view qweb New
snippet_options Forum Snippet Options ir.ui.view qweb Inherits website.snippet_options
tag Forum Tags ir.ui.view qweb New
user_profile_content user_profile_content ir.ui.view qweb Inherits website_profile.user_profile_content
user_profile_sub_nav user_profile_sub_nav ir.ui.view qweb Inherits website_profile.user_profile_sub_nav
user_votes Forum User Votes ir.ui.view qweb New
view_forum_forum_form forum.forum.form forum.forum form New
view_forum_forum_list forum.forum.list forum.forum tree New
view_forum_post_form forum.post.form forum.post form New
view_forum_post_graph forum.post.graph forum.post graph New
view_forum_post_list Forum Post Pages Tree forum.post tree New
view_forum_post_search forum.post.search forum.post search New
view_users_form_forum res.users.form.forum res.users div Inherits base.view_users_form
vote vote ir.ui.view qweb New
website_forum.author_box website_forum.author_box ir.ui.view qweb New
website_forum.opt_last_post Show Last Post ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_list_view List View ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_post_count Show Post Count ir.ui.view qweb Inherits website_forum.forum_all
website_forum.question_dropdown website_forum.question_dropdown ir.ui.view qweb New
website_forum.user_sidebar website_forum.user_sidebar ir.ui.view qweb New
Models touched (9)

New fields (58)
  • active Boolean
    default=True
  • allow_bump Boolean
    default=True help='Check this box to display a popup for posts older than 10 days without any given answer. The popup will offer to share it on social networks. When shared, a question is bumped at the top of the forum.' args: 'Allow Bump'
  • allow_share Boolean
    default=True help='After posting the user will be proposed to share its question or answer on social networks, enabling social network propagation of the forum content.' args: 'Sharing Options'
  • authorized_group_id Many2one → res.groups
    args: 'res.groups', 'Authorized Group'
  • count_flagged_posts Integer
    compute='_compute_count_flagged_posts' string='Number of flagged posts'
  • count_posts_waiting_validation Integer
    compute='_compute_count_posts_waiting_validation' string='Number of posts waiting for validation'
  • default_order Selection
    default='write_date desc' required=True string='Default' args: [('create_date desc', 'Newest'), ('write_date desc', 'Last Updated'), ('vote_count desc', 'Most Voted'), ('relevancy desc', 'Relevance'), ('child_count desc', 'Answered')]
  • description Text
    translate=True args: 'Description'
  • faq Html
    sanitize=True sanitize_overridable=True translate=html_translate args: 'Guidelines'
  • karma_answer Integer
    default=3 string='Answer questions'
  • karma_answer_accept_all Integer
    default=500 string='Accept an answer to all questions'
  • karma_answer_accept_own Integer
    default=20 string='Accept an answer on own questions'
  • karma_ask Integer
    default=3 string='Ask questions'
  • karma_close_all Integer
    default=500 string='Close all posts'
  • karma_close_own Integer
    default=100 string='Close own posts'
  • karma_comment_all Integer
    default=1 string='Comment all posts'
  • karma_comment_convert_all Integer
    default=500 string='Convert all answers to comments and vice versa'
  • karma_comment_convert_own Integer
    default=50 string='Convert own answers to comments and vice versa'
  • karma_comment_own Integer
    default=1 string='Comment own posts'
  • karma_comment_unlink_all Integer
    default=500 string='Unlink all comments'
  • karma_comment_unlink_own Integer
    default=50 string='Unlink own comments'
  • karma_dofollow Integer
    default=500 help='If the author has not enough karma, a nofollow attribute is added to links' string='Nofollow links'
  • karma_downvote Integer
    default=50 string='Downvote'
  • karma_edit_all Integer
    default=300 string='Edit all posts'
  • karma_edit_own Integer
    default=1 string='Edit own posts'
  • karma_edit_retag Integer
    default=75 string='Change question tags'
  • karma_editor Integer
    default=30 string='Editor Features: image and links'
  • karma_flag Integer
    default=500 string='Flag a post as offensive'
  • karma_gen_answer_accept Integer
    default=2 string='Accepting an answer'
  • karma_gen_answer_accepted Integer
    default=15 string='Answer accepted'
  • karma_gen_answer_downvote Integer
    default=-2 string='Answer downvoted'
  • karma_gen_answer_flagged Integer
    default=-100 string='Answer flagged'
  • karma_gen_answer_upvote Integer
    default=10 string='Answer upvoted'
  • karma_gen_question_downvote Integer
    default=-2 string='Question downvoted'
  • karma_gen_question_new Integer
    default=2 string='Asking a question'
  • karma_gen_question_upvote Integer
    default=5 string='Question upvoted'
  • karma_moderate Integer
    default=1000 string='Moderate posts'
  • karma_post Integer
    default=100 string='Ask questions without validation'
  • karma_tag_create Integer
    default=30 string='Create new tags'
  • karma_unlink_all Integer
    default=1000 string='Delete all posts'
  • karma_unlink_own Integer
    default=500 string='Delete own posts'
  • karma_upvote Integer
    default=5 string='Upvote'
  • karma_user_bio Integer
    default=750 string='Display detailed user biography'
  • last_post_id Many2one → forum.post
    compute='_compute_last_post' args: 'forum.post'
  • menu_id Many2one → website.menu
    copy=False args: 'website.menu', 'Menu'
  • mode Selection
    default='questions' help='Questions mode: only one answer allowed\n Discussions mode: multiple answers allowed' required=True string='Mode' args: [('questions', 'Questions (1 answer)'), ('discussions', 'Discussions (multiple answers)')]
  • name Char
    required=True translate=True args: 'Forum Name'
  • post_ids One2many → forum.post
    string='Posts' args: 'forum.post', 'forum_id'
  • privacy Selection
    default='public' help='Public: Forum is public\nSigned In: Forum is visible for signed in users\nSome users: Forum and their content are hidden for non members of selected group' args: [('public', 'Public'), ('connected', 'Signed In'), ('private', 'Some users')]
  • relevancy_post_vote Float
    default=0.8 help="This formula is used in order to sort by relevance. The variable 'votes' represents number of votes for a post, and 'days' is number of days since the post creation" args: 'First Relevance Parameter'
  • relevancy_time_decay Float
    default=1.8 args: 'Second Relevance Parameter'
  • sequence Integer
    default=1 args: 'Sequence'
  • teaser Text
    compute='_compute_teaser' store=True args: 'Teaser'
  • total_answers Integer
    compute='_compute_forum_statistics' args: '# Answers'
  • total_favorites Integer
    compute='_compute_forum_statistics' args: '# Favorites'
  • total_posts Integer
    compute='_compute_forum_statistics' args: '# Posts'
  • total_views Integer
    compute='_compute_forum_statistics' args: '# Views'
  • welcome_message Html
    default='<section>\n <div class="container py-5">\n <div class="row">\n <div class="col-lg-12">\n <h1 class="text-center">Welcome!</h1>\n <p class="text-400 text-center">\n This community is for professionals and enthusiasts of our products and services.\n <br/>Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.\n </p>\n </div>\n <div class="col text-center mt-3">\n <a href="#" class="js_close_intro btn btn-outline-light mr-2">Hide Intro</a>\n <a class="btn btn-light forum_register_url" href="/web/login">Register</a>\n </div>\n </div>\n </div>\n </section>' sanitize_attributes=False sanitize_form=False translate=True args: 'Welcome Message'
Public methods (5)
  • create(self, vals_list)
    @api.model_create_multi
  • get_tags_first_char(self)
    get set of first letter of forum tags
  • go_to_website(self)
  • unlink(self)
  • write(self, vals)

New fields (58)
  • active Boolean
    default=True args: 'Active'
  • bump_date Datetime
    help='Technical field allowing to bump a question. Writing on this field will trigger a write on write_date and therefore bump the post. Directly writing on write_date is currently not supported and this field is a workaround.' readonly=True args: 'Bumped on'
  • can_accept Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Accept'
  • can_answer Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Answer'
  • can_ask Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Ask'
  • can_close Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Close'
  • can_comment Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Comment'
  • can_comment_convert Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Convert to Comment'
  • can_display_biography Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: "Is the author's biography visible from his post"
  • can_downvote Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Downvote'
  • can_edit Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Edit'
  • can_flag Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Flag'
  • can_moderate Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Moderate'
  • can_post Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Automatically be Validated'
  • can_unlink Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Unlink'
  • can_upvote Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Upvote'
  • can_use_full_editor Boolean
    compute='_get_post_karma_rights' compute_sudo=False help='Editor Features: image and links'
  • can_view Boolean
    compute='_get_post_karma_rights' compute_sudo=False search='_search_can_view' args: 'Can View'
  • child_count Integer
    compute='_get_child_count' store=True args: 'Answers'
  • child_ids One2many → forum.post
    domain=<expr> string='Post Answers' args: 'forum.post', 'parent_id'
  • closed_date Datetime
    copy=False readonly=True args: 'Closed on'
  • closed_reason_id Many2one → forum.post.reason
    copy=False string='Reason' args: 'forum.post.reason'
  • closed_uid Many2one → res.users
    copy=False readonly=True string='Closed by' args: 'res.users'
  • content Html
    strip_style=True args: 'Content'
  • create_date Datetime
    index=True readonly=True args: 'Asked on'
  • create_uid Many2one → res.users
    index=True readonly=True string='Created by' args: 'res.users'
  • favourite_count Integer
    compute='_get_favorite_count' store=True args: 'Favorite'
  • favourite_ids Many2many → res.users
    string='Favourite' args: 'res.users'
  • flag_user_id Many2one → res.users
    string='Flagged by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • has_validated_answer Boolean
    compute='_get_has_validated_answer' store=True args: 'Is answered'
  • is_correct Boolean
    help='Correct answer or answer accepted' args: 'Correct'
  • karma_accept Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Convert comment to answer'
  • karma_close Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to close'
  • karma_comment Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to comment'
  • karma_comment_convert Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to convert comment to answer'
  • karma_edit Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to edit'
  • karma_flag Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Flag a post as offensive'
  • karma_unlink Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to unlink'
  • moderator_id Many2one → res.users
    readonly=True string='Reviewed by' args: 'res.users'
  • name Char
    args: 'Title'
  • parent_id Many2one → forum.post
    index=True ondelete='cascade' readonly=True string='Question' args: 'forum.post'
  • plain_content Text
    compute='_get_plain_content' store=True args: 'Plain Content'
  • relevancy Float
    compute='_compute_relevancy' store=True args: 'Relevance'
  • self_reply Boolean
    compute='_is_self_reply' store=True args: 'Reply to own question'
  • state Selection
    default='active' string='Status' args: [('active', 'Active'), ('pending', 'Waiting Validation'), ('close', 'Closed'), ('offensive', 'Offensive'), ('flagged', 'Flagged')]
  • tag_ids Many2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_tag_rel', 'forum_id', 'forum_tag_id'
  • uid_has_answered Boolean
    compute='_get_uid_has_answered' args: 'Has Answered'
  • user_favourite Boolean
    compute='_get_user_favourite' args: 'Is Favourite'
  • user_vote Integer
    compute='_get_user_vote' args: 'My Vote'
  • views Integer
    copy=False default=0 readonly=True args: 'Views'
  • vote_count Integer
    compute='_get_vote_count' store=True args: 'Total Votes'
  • vote_ids One2many → forum.post.vote
    string='Votes' args: 'forum.post.vote', 'post_id'
  • website_id Many2one
    readonly=True related='forum_id.website_id'
  • website_message_ids One2many
    domain=<expr>
  • website_url Char
    compute='_compute_website_url' args: 'Website URL'
  • write_date Datetime
    index=True readonly=True args: 'Updated on'
  • write_uid Many2one → res.users
    index=True readonly=True string='Updated by' args: 'res.users'
Public methods (18)
  • bump(self)
    Bump a question: trigger a write_date by writing on a dummy bump_date field. One cannot bump a question more than once every 10 days.
  • close(self, reason_id)
  • convert_answer_to_comment(self)
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, message_id, default=None)
    @api.model
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, vals_list)
    @api.model_create_multi
  • flag(self)
  • go_to_website(self)
  • mark_as_offensive(self, reason_id)
  • mark_as_offensive_batch(self, key, values)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • post_notification(self)
  • refuse(self)
  • reopen(self)
  • unlink(self)
  • unlink_comment(self, message_id)
  • validate(self)
  • vote(self, upvote=True)
  • write(self, vals)

New fields (2)
  • name Char
    required=True string='Closing Reason' translate=True
  • reason_type Selection
    default='basic' string='Reason Type' args: [('basic', 'Basic'), ('offensive', 'Offensive')]
Public methods (0)

No public methods.

New fields (6)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_id Many2one → forum.forum
    readonly=False related='post_id.forum_id' store=True string='Forum' args: 'forum.forum'
  • post_id Many2one → forum.post
    ondelete='cascade' required=True string='Post' args: 'forum.post'
  • recipient_id Many2one → res.users
    readonly=False related='post_id.create_uid' store=True string='To' args: 'res.users'
  • user_id Many2one → res.users
    default=<expr> required=True string='User' args: 'res.users'
  • vote Selection
    default='1' required=True string='Vote' args: [('1', '1'), ('-1', '-1'), ('0', '0')]
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (4)
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • name Char
    required=True args: 'Name'
  • post_ids Many2many → forum.post
    domain=[('state', '=', 'active')] string='Posts' args: 'forum.post', 'forum_tag_rel', 'forum_tag_id', 'forum_id'
  • posts_count Integer
    compute='_get_posts_count' store=True args: 'Number of Posts'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (1)
  • challenge_category Selection
    ondelete={'forum': 'set default'} selection_add=[('forum', 'Website / Forum')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_waiting_posts_count Integer
    compute='_get_user_waiting_post' args: 'Waiting post'
Public methods (2)
  • get_gamification_redirection_data(self)
  • open_website_url(self)

New fields (1)
  • forums_count Integer
    default=get_default_forum_count readonly=True
Public methods (4)
  • configurator_get_footer_links(self)
  • configurator_set_menu_links(self, menu_company, module_data)
  • get_default_forum_count(self)
    @api.model
  • get_suggested_controllers(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/website_forum
VERSION
VERSION 1.1
CATEGORY
CATEGORYWebsite/Website
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, David Monjoie, Xavier Morel, Nicolas Lempereur, Stefan Rijnhart, Jeremy Kersten, GitHub, Yannick Tivisse, qsm-odoo, Dharmraj Jhala, Romain Derie, Xavier-Do, Victor Feyens, Julien Mougenot, Samuel Degueldre, Nasreddin Boulif (bon), Tiffany Chang (tic), Gorash, Younn Olivier, Mathieu Duckerts-Antoine, Benjamin Vray, Benoit Socias, Hubert Van de Walle (huvw), Hardik Prajapati, Guillaume (gdi), MerlinGuillaume, Sébastien Mottet (oms), Huy Le, Antoine Guenet, Florian Charlier, Nicolas Bayet, Michael Mattiello (mcm), Huy, niyasraphy, Thomas Lefebvre (thle), amdi-odoo, Tom De Caluwé, Soukéina Bojabza, Vivek Pathak, Leonardo Pavan Rocha, Astik Singh, Lopes Marc (loma)
WEBSITE
WEBSITEhttps://www.odoo.com/app/forum
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - website_mail
    - website
    - digest
    - portal
    - web_editor
    - http_routing
    - resource
    - social_media
    - google_recaptcha
    - utm
    - website_profile
    - website_partner
    - gamification
    - web_kanban_gauge
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (58)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
close_post close_post ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
default_faq Faq Accordion section New
display_activities Forum Profile Activities ir.ui.view qweb New
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
display_post_question_block display_post_question_block ir.ui.view qweb New
edit_post edit_post ir.ui.view qweb New
faq Frequently Asked Questions ir.ui.view qweb New
faq_karma Karma ir.ui.view qweb New
forum_all Forum Navigation ir.ui.view qweb New
forum_all_all_entries forum_all_all_entries ir.ui.view qweb New
forum_all_oe_structure_forum_all_top Forum Navigation (oe_structure_forum_all_top) ir.ui.view qweb Inherits website_forum.forum_all
forum_filter_tag Filtering Forum Tag ir.ui.view qweb New
forum_index Forum ir.ui.view qweb New
forum_nav_header forum_nav_header ir.ui.view qweb New
forum_post_options forum_post_options ir.ui.view qweb New
forum_post_reason_view_list forum.post.reason.list forum.post.reason tree New
forum_post_template_new_answer forum_post_template_new_answer ir.ui.view qweb New
forum_post_template_new_question forum_post_template_new_question ir.ui.view qweb New
forum_post_template_validation forum_post_template_validation ir.ui.view qweb New
forum_searchbar_input_snippet_options forum search bar snippet options ir.ui.view qweb Inherits website.searchbar_input_snippet_options
forum_tag_view_form forum.tag.form forum.tag form New
forum_tag_view_list forum.tag.list forum.tag tree New
forum_view_search forum.forum.search forum.forum search New
header Forum Index ir.ui.view qweb New
layout Forum Layout ir.ui.view qweb Inherits website.layout
link_button link_button ir.ui.view qweb New
moderation_display_post_answer moderation_display_post_answer ir.ui.view qweb New
moderation_display_post_question_block moderation_display_post_question_block ir.ui.view qweb New
moderation_queue Forum Moderation Queue ir.ui.view qweb New
new_question new_question ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_answers post_answers ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
post_reply post_reply ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb Inherits website_profile.private_profile
tag Forum Tags ir.ui.view qweb New
user_navbar_inherit_website_forum user_navbar_inherit_website_forum ir.ui.view qweb Inherits website.user_navbar
user_profile_content user_profile_content ir.ui.view qweb Inherits website_profile.user_profile_content
user_profile_sub_nav user_profile_sub_nav ir.ui.view qweb Inherits website_profile.user_profile_sub_nav
user_votes Forum User Votes ir.ui.view qweb New
view_forum_forum_form forum.forum.form forum.forum form New
view_forum_forum_list forum.forum.list forum.forum tree New
view_forum_post_form forum.post.form forum.post form New
view_forum_post_graph forum.post.graph forum.post graph New
view_forum_post_list forum.post.list forum.post tree New
view_forum_post_search forum.post.search forum.post search New
view_users_form_forum res.users.form.forum res.users div Inherits base.view_users_form
vote vote ir.ui.view qweb New
website_forum.author_box website_forum.author_box ir.ui.view qweb New
website_forum.opt_last_post Show Last Post ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_list_view List View ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_post_count Show Post Count ir.ui.view qweb Inherits website_forum.forum_all
website_forum.question_dropdown website_forum.question_dropdown ir.ui.view qweb New
website_forum.user_sidebar website_forum.user_sidebar ir.ui.view qweb New
Models touched (8)

New fields (58)
  • active Boolean
    default=True
  • allow_bump Boolean
    default=True help='Check this box to display a popup for posts older than 10 days without any given answer. The popup will offer to share it on social networks. When shared, a question is bumped at the top of the forum.' args: 'Allow Bump'
  • allow_share Boolean
    default=True help='After posting the user will be proposed to share its question or answer on social networks, enabling social network propagation of the forum content.' args: 'Sharing Options'
  • authorized_group_id Many2one → res.groups
    args: 'res.groups', 'Authorized Group'
  • count_flagged_posts Integer
    compute='_compute_count_flagged_posts' string='Number of flagged posts'
  • count_posts_waiting_validation Integer
    compute='_compute_count_posts_waiting_validation' string='Number of posts waiting for validation'
  • default_order Selection
    default='write_date desc' required=True string='Default' args: [('create_date desc', 'Newest'), ('write_date desc', 'Last Updated'), ('vote_count desc', 'Most Voted'), ('relevancy desc', 'Relevance'), ('child_count desc', 'Answered')]
  • description Text
    translate=True args: 'Description'
  • faq Html
    sanitize=False translate=html_translate args: 'Guidelines'
  • karma_answer Integer
    default=3 string='Answer questions'
  • karma_answer_accept_all Integer
    default=500 string='Accept an answer to all questions'
  • karma_answer_accept_own Integer
    default=20 string='Accept an answer on own questions'
  • karma_ask Integer
    default=3 string='Ask questions'
  • karma_close_all Integer
    default=500 string='Close all posts'
  • karma_close_own Integer
    default=100 string='Close own posts'
  • karma_comment_all Integer
    default=1 string='Comment all posts'
  • karma_comment_convert_all Integer
    default=500 string='Convert all answers to comments and vice versa'
  • karma_comment_convert_own Integer
    default=50 string='Convert own answers to comments and vice versa'
  • karma_comment_own Integer
    default=1 string='Comment own posts'
  • karma_comment_unlink_all Integer
    default=500 string='Unlink all comments'
  • karma_comment_unlink_own Integer
    default=50 string='Unlink own comments'
  • karma_dofollow Integer
    default=500 help='If the author has not enough karma, a nofollow attribute is added to links' string='Nofollow links'
  • karma_downvote Integer
    default=50 string='Downvote'
  • karma_edit_all Integer
    default=300 string='Edit all posts'
  • karma_edit_own Integer
    default=1 string='Edit own posts'
  • karma_edit_retag Integer
    default=75 string='Change question tags'
  • karma_editor Integer
    default=30 string='Editor Features: image and links'
  • karma_flag Integer
    default=500 string='Flag a post as offensive'
  • karma_gen_answer_accept Integer
    default=2 string='Accepting an answer'
  • karma_gen_answer_accepted Integer
    default=15 string='Answer accepted'
  • karma_gen_answer_downvote Integer
    default=-2 string='Answer downvoted'
  • karma_gen_answer_flagged Integer
    default=-100 string='Answer flagged'
  • karma_gen_answer_upvote Integer
    default=10 string='Answer upvoted'
  • karma_gen_question_downvote Integer
    default=-2 string='Question downvoted'
  • karma_gen_question_new Integer
    default=2 string='Asking a question'
  • karma_gen_question_upvote Integer
    default=5 string='Question upvoted'
  • karma_moderate Integer
    default=1000 string='Moderate posts'
  • karma_post Integer
    default=100 string='Ask questions without validation'
  • karma_tag_create Integer
    default=30 string='Create new tags'
  • karma_unlink_all Integer
    default=1000 string='Delete all posts'
  • karma_unlink_own Integer
    default=500 string='Delete own posts'
  • karma_upvote Integer
    default=5 string='Upvote'
  • karma_user_bio Integer
    default=750 string='Display detailed user biography'
  • last_post_id Many2one → forum.post
    compute='_compute_last_post' args: 'forum.post'
  • menu_id Many2one → website.menu
    copy=False args: 'website.menu', 'Menu'
  • mode Selection
    default='questions' help='Questions mode: only one answer allowed\n Discussions mode: multiple answers allowed' required=True string='Mode' args: [('questions', 'Questions (1 answer)'), ('discussions', 'Discussions (multiple answers)')]
  • name Char
    required=True translate=True args: 'Forum Name'
  • post_ids One2many → forum.post
    string='Posts' args: 'forum.post', 'forum_id'
  • privacy Selection
    default='public' help='Public: Forum is public\nSigned In: Forum is visible for signed in users\nSome users: Forum and their content are hidden for non members of selected group' args: [('public', 'Public'), ('connected', 'Signed In'), ('private', 'Some users')]
  • relevancy_post_vote Float
    default=0.8 help="This formula is used in order to sort by relevance. The variable 'votes' represents number of votes for a post, and 'days' is number of days since the post creation" args: 'First Relevance Parameter'
  • relevancy_time_decay Float
    default=1.8 args: 'Second Relevance Parameter'
  • sequence Integer
    default=1 args: 'Sequence'
  • teaser Text
    compute='_compute_teaser' store=True args: 'Teaser'
  • total_answers Integer
    compute='_compute_forum_statistics' args: '# Answers'
  • total_favorites Integer
    compute='_compute_forum_statistics' args: '# Favorites'
  • total_posts Integer
    compute='_compute_forum_statistics' args: '# Posts'
  • total_views Integer
    compute='_compute_forum_statistics' args: '# Views'
  • welcome_message Html
    default='<section>\n <div class="container py-5">\n <div class="row">\n <div class="col-lg-12">\n <h1 class="text-center">Welcome!</h1>\n <p class="text-400 text-center">\n This community is for professionals and enthusiasts of our products and services.\n <br/>Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.\n </p>\n </div>\n <div class="col text-center mt-3">\n <a href="#" class="js_close_intro btn btn-outline-light mr-2">Hide Intro</a>\n <a class="btn btn-light forum_register_url" href="/web/login">Register</a>\n </div>\n </div>\n </div>\n </section>' sanitize_attributes=False sanitize_form=False translate=True args: 'Welcome Message'
Public methods (5)
  • create(self, vals_list)
    @api.model_create_multi
  • get_tags_first_char(self)
    get set of first letter of forum tags
  • go_to_website(self)
  • unlink(self)
  • write(self, vals)

New fields (56)
  • active Boolean
    default=True args: 'Active'
  • bump_date Datetime
    help='Technical field allowing to bump a question. Writing on this field will trigger a write on write_date and therefore bump the post. Directly writing on write_date is currently not supported and this field is a workaround.' readonly=True args: 'Bumped on'
  • can_accept Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Accept'
  • can_answer Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Answer'
  • can_ask Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Ask'
  • can_close Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Close'
  • can_comment Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Comment'
  • can_comment_convert Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Convert to Comment'
  • can_display_biography Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: "Is the author's biography visible from his post"
  • can_downvote Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Downvote'
  • can_edit Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Edit'
  • can_flag Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Flag'
  • can_moderate Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Moderate'
  • can_post Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Automatically be Validated'
  • can_unlink Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Unlink'
  • can_upvote Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Upvote'
  • can_view Boolean
    compute='_get_post_karma_rights' compute_sudo=False search='_search_can_view' args: 'Can View'
  • child_count Integer
    compute='_get_child_count' store=True args: 'Answers'
  • child_ids One2many → forum.post
    domain=<expr> string='Post Answers' args: 'forum.post', 'parent_id'
  • closed_date Datetime
    copy=False readonly=True args: 'Closed on'
  • closed_reason_id Many2one → forum.post.reason
    copy=False string='Reason' args: 'forum.post.reason'
  • closed_uid Many2one → res.users
    copy=False index=True readonly=True string='Closed by' args: 'res.users'
  • content Html
    strip_style=True args: 'Content'
  • create_date Datetime
    index=True readonly=True args: 'Asked on'
  • create_uid Many2one → res.users
    index=True readonly=True string='Created by' args: 'res.users'
  • favourite_count Integer
    compute='_get_favorite_count' store=True args: 'Favorite'
  • favourite_ids Many2many → res.users
    string='Favourite' args: 'res.users'
  • flag_user_id Many2one → res.users
    string='Flagged by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • has_validated_answer Boolean
    compute='_get_has_validated_answer' store=True args: 'Is answered'
  • is_correct Boolean
    help='Correct answer or answer accepted' args: 'Correct'
  • karma_accept Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Convert comment to answer'
  • karma_close Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to close'
  • karma_comment Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to comment'
  • karma_comment_convert Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to convert comment to answer'
  • karma_edit Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to edit'
  • karma_flag Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Flag a post as offensive'
  • karma_unlink Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to unlink'
  • moderator_id Many2one → res.users
    readonly=True string='Reviewed by' args: 'res.users'
  • name Char
    args: 'Title'
  • parent_id Many2one → forum.post
    index=True ondelete='cascade' readonly=True string='Question' args: 'forum.post'
  • plain_content Text
    compute='_get_plain_content' store=True args: 'Plain Content'
  • relevancy Float
    compute='_compute_relevancy' store=True args: 'Relevance'
  • self_reply Boolean
    compute='_is_self_reply' store=True args: 'Reply to own question'
  • state Selection
    default='active' string='Status' args: [('active', 'Active'), ('pending', 'Waiting Validation'), ('close', 'Closed'), ('offensive', 'Offensive'), ('flagged', 'Flagged')]
  • tag_ids Many2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_tag_rel', 'forum_id', 'forum_tag_id'
  • uid_has_answered Boolean
    compute='_get_uid_has_answered' args: 'Has Answered'
  • user_favourite Boolean
    compute='_get_user_favourite' args: 'Is Favourite'
  • user_vote Integer
    compute='_get_user_vote' args: 'My Vote'
  • views Integer
    copy=False default=0 readonly=True args: 'Views'
  • vote_count Integer
    compute='_get_vote_count' store=True args: 'Total Votes'
  • vote_ids One2many → forum.post.vote
    string='Votes' args: 'forum.post.vote', 'post_id'
  • website_id Many2one
    readonly=True related='forum_id.website_id'
  • website_message_ids One2many
    domain=<expr>
  • write_date Datetime
    index=True readonly=True args: 'Updated on'
  • write_uid Many2one → res.users
    index=True readonly=True string='Updated by' args: 'res.users'
Public methods (19)
  • bump(self)
    Bump a question: trigger a write_date by writing on a dummy bump_date field. One cannot bump a question more than once every 10 days.
  • close(self, reason_id)
  • convert_answer_to_comment(self)
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, message_id, default=None)
    @api.model
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, vals)
    @api.model
  • flag(self)
  • get_access_action(self, access_uid=None)
    Instead of the classic form view, redirect to the post on the website directly
  • go_to_website(self)
  • mark_as_offensive(self, reason_id)
  • mark_as_offensive_batch(self, key, values)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • post_notification(self)
  • refuse(self)
  • reopen(self)
  • unlink(self)
  • unlink_comment(self, message_id)
  • validate(self)
  • vote(self, upvote=True)
  • write(self, vals)

New fields (2)
  • name Char
    required=True string='Closing Reason' translate=True
  • reason_type Selection
    default='basic' string='Reason Type' args: [('basic', 'Basic'), ('offensive', 'Offensive')]
Public methods (0)

No public methods.

New fields (6)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_id Many2one → forum.forum
    readonly=False related='post_id.forum_id' store=True string='Forum' args: 'forum.forum'
  • post_id Many2one → forum.post
    ondelete='cascade' required=True string='Post' args: 'forum.post'
  • recipient_id Many2one → res.users
    readonly=False related='post_id.create_uid' store=True string='To' args: 'res.users'
  • user_id Many2one → res.users
    default=<expr> required=True string='User' args: 'res.users'
  • vote Selection
    default='1' required=True string='Vote' args: [('1', '1'), ('-1', '-1'), ('0', '0')]
Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, values)

New fields (4)
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • name Char
    required=True args: 'Name'
  • post_ids Many2many → forum.post
    domain=[('state', '=', 'active')] string='Posts' args: 'forum.post', 'forum_tag_rel', 'forum_tag_id', 'forum_id'
  • posts_count Integer
    compute='_get_posts_count' store=True args: 'Number of Posts'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (1)
  • challenge_category Selection
    ondelete={'forum': 'set default'} selection_add=[('forum', 'Website / Forum')]
Public methods (0)

No public methods.

New fields (2)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_waiting_posts_count Integer
    compute='_get_user_waiting_post' args: 'Waiting post'
Public methods (2)
  • get_gamification_redirection_data(self)
  • open_website_url(self)

New fields (1)
  • forums_count Integer
    default=get_default_forum_count readonly=True
Public methods (4)
  • configurator_get_footer_links(self)
  • configurator_set_menu_links(self, menu_company, module_data)
  • get_default_forum_count(self)
    @api.model
  • get_suggested_controllers(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/website_forum
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite/Website
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Nicolas Martinelli, Nicolas Lempereur, Jeremy Kersten, GitHub, Barad Mahendra, Yannick Tivisse, qsm-odoo, Dharmraj Jhala, Romain Derie, Jorge Pinna Puissant, Adrian Torres, Rémi Rahir, Xavier-Do, jvm-odoo, Victor Feyens, Paul Morelle, Sébastien Theys, fw-bot, Samuel Degueldre, Tiffany Chang (tic), fja-odoo, Younn Olivier, Mathieu Duckerts-Antoine, Kevin Baptiste, Benjamin Vray, Benoit Socias, Hardik Prajapati, Guillaume (gdi), MerlinGuillaume, Sébastien Mottet (oms), Huy Le, Florian Charlier, niyasraphy, Tom De Caluwé
WEBSITE
WEBSITEhttps://www.odoo.com/page/community-builder
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - website_mail
    - website
    - digest
    - portal
    - web_editor
    - http_routing
    - resource
    - social_media
    - website_profile
    - website_partner
    - gamification
    - web_kanban_gauge
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (60)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
assets_editor Forum Editor Assets ir.ui.view qweb Inherits website.assets_editor
assets_frontend assets_frontend ir.ui.view qweb Inherits website.assets_frontend
assets_tests Website Forum Assets Tests ir.ui.view qweb Inherits web.assets_tests
close_post close_post ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
default_faq Faq Accordion section New
display_activities Forum Profile Activities ir.ui.view qweb New
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
display_post_question_block display_post_question_block ir.ui.view qweb New
edit_post edit_post ir.ui.view qweb New
faq Frequently Asked Questions ir.ui.view qweb New
faq_karma Karma ir.ui.view qweb New
forum_all Forum Navigation ir.ui.view qweb New
forum_all_all_entries forum_all_all_entries ir.ui.view qweb New
forum_all_oe_structure_forum_all_top Forum Navigation (oe_structure_forum_all_top) ir.ui.view qweb Inherits website_forum.forum_all
forum_filter_tag Filtering Forum Tag ir.ui.view qweb New
forum_index Forum ir.ui.view qweb New
forum_nav_header forum_nav_header ir.ui.view qweb New
forum_post_options forum_post_options ir.ui.view qweb New
forum_post_reason_view_list forum.post.reason.list forum.post.reason tree New
forum_post_template_new_answer forum_post_template_new_answer ir.ui.view qweb New
forum_post_template_new_question forum_post_template_new_question ir.ui.view qweb New
forum_post_template_validation forum_post_template_validation ir.ui.view qweb New
forum_tag_view_form forum.tag.form forum.tag form New
forum_tag_view_list forum.tag.list forum.tag tree New
forum_view_search forum.forum.search forum.forum search New
header Forum Index ir.ui.view qweb New
layout Forum Layout ir.ui.view qweb Inherits website.layout
link_button link_button ir.ui.view qweb New
moderation_display_post_answer moderation_display_post_answer ir.ui.view qweb New
moderation_display_post_question_block moderation_display_post_question_block ir.ui.view qweb New
moderation_queue Forum Moderation Queue ir.ui.view qweb New
new_question new_question ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_answers post_answers ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
post_reply post_reply ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb Inherits website_profile.private_profile
tag Forum Tags ir.ui.view qweb New
user_navbar_inherit_website_forum user_navbar_inherit_website_forum ir.ui.view qweb Inherits website.user_navbar
user_profile_content user_profile_content ir.ui.view qweb Inherits website_profile.user_profile_content
user_profile_sub_nav user_profile_sub_nav ir.ui.view qweb Inherits website_profile.user_profile_sub_nav
user_votes Forum User Votes ir.ui.view qweb New
view_forum_forum_form forum.forum.form forum.forum form New
view_forum_forum_list forum.forum.list forum.forum tree New
view_forum_post_form forum.post.form forum.post form New
view_forum_post_graph forum.post.graph forum.post graph New
view_forum_post_list forum.post.list forum.post tree New
view_forum_post_search forum.post.search forum.post search New
view_users_form_forum res.users.form.forum res.users div Inherits base.view_users_form
vote vote ir.ui.view qweb New
website_forum.author_box website_forum.author_box ir.ui.view qweb New
website_forum.opt_last_post Show Last Post ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_list_view List View ir.ui.view qweb Inherits website_forum.forum_all
website_forum.opt_post_count Show Post Count ir.ui.view qweb Inherits website_forum.forum_all
website_forum.question_dropdown website_forum.question_dropdown ir.ui.view qweb New
website_forum.user_sidebar website_forum.user_sidebar ir.ui.view qweb New
Models touched (8)

New fields (58)
  • active Boolean
    default=True
  • allow_bump Boolean
    default=True help='Check this box to display a popup for posts older than 10 days without any given answer. The popup will offer to share it on social networks. When shared, a question is bumped at the top of the forum.' args: 'Allow Bump'
  • allow_share Boolean
    default=True help='After posting the user will be proposed to share its question or answer on social networks, enabling social network propagation of the forum content.' args: 'Sharing Options'
  • authorized_group_id Many2one → res.groups
    args: 'res.groups', 'Authorized Group'
  • count_flagged_posts Integer
    compute='_compute_count_flagged_posts' string='Number of flagged posts'
  • count_posts_waiting_validation Integer
    compute='_compute_count_posts_waiting_validation' string='Number of posts waiting for validation'
  • default_order Selection
    default='write_date desc' required=True string='Default' args: [('create_date desc', 'Newest'), ('write_date desc', 'Last Updated'), ('vote_count desc', 'Most Voted'), ('relevancy desc', 'Relevance'), ('child_count desc', 'Answered')]
  • description Text
    translate=True args: 'Description'
  • faq Html
    sanitize=False translate=html_translate args: 'Guidelines'
  • karma_answer Integer
    default=3 string='Answer questions'
  • karma_answer_accept_all Integer
    default=500 string='Accept an answer to all questions'
  • karma_answer_accept_own Integer
    default=20 string='Accept an answer on own questions'
  • karma_ask Integer
    default=3 string='Ask questions'
  • karma_close_all Integer
    default=500 string='Close all posts'
  • karma_close_own Integer
    default=100 string='Close own posts'
  • karma_comment_all Integer
    default=1 string='Comment all posts'
  • karma_comment_convert_all Integer
    default=500 string='Convert all answers to comments and vice versa'
  • karma_comment_convert_own Integer
    default=50 string='Convert own answers to comments and vice versa'
  • karma_comment_own Integer
    default=1 string='Comment own posts'
  • karma_comment_unlink_all Integer
    default=500 string='Unlink all comments'
  • karma_comment_unlink_own Integer
    default=50 string='Unlink own comments'
  • karma_dofollow Integer
    default=500 help='If the author has not enough karma, a nofollow attribute is added to links' string='Nofollow links'
  • karma_downvote Integer
    default=50 string='Downvote'
  • karma_edit_all Integer
    default=300 string='Edit all posts'
  • karma_edit_own Integer
    default=1 string='Edit own posts'
  • karma_edit_retag Integer
    default=75 string='Change question tags'
  • karma_editor Integer
    default=30 string='Editor Features: image and links'
  • karma_flag Integer
    default=500 string='Flag a post as offensive'
  • karma_gen_answer_accept Integer
    default=2 string='Accepting an answer'
  • karma_gen_answer_accepted Integer
    default=15 string='Answer accepted'
  • karma_gen_answer_downvote Integer
    default=-2 string='Answer downvoted'
  • karma_gen_answer_flagged Integer
    default=-100 string='Answer flagged'
  • karma_gen_answer_upvote Integer
    default=10 string='Answer upvoted'
  • karma_gen_question_downvote Integer
    default=-2 string='Question downvoted'
  • karma_gen_question_new Integer
    default=2 string='Asking a question'
  • karma_gen_question_upvote Integer
    default=5 string='Question upvoted'
  • karma_moderate Integer
    default=1000 string='Moderate posts'
  • karma_post Integer
    default=100 string='Ask questions without validation'
  • karma_tag_create Integer
    default=30 string='Create new tags'
  • karma_unlink_all Integer
    default=1000 string='Delete all posts'
  • karma_unlink_own Integer
    default=500 string='Delete own posts'
  • karma_upvote Integer
    default=5 string='Upvote'
  • karma_user_bio Integer
    default=750 string='Display detailed user biography'
  • last_post_id Many2one → forum.post
    compute='_compute_last_post' args: 'forum.post'
  • menu_id Many2one → website.menu
    copy=False args: 'website.menu', 'Menu'
  • mode Selection
    default='questions' help='Questions mode: only one answer allowed\n Discussions mode: multiple answers allowed' required=True string='Mode' args: [('questions', 'Questions (1 answer)'), ('discussions', 'Discussions (multiple answers)')]
  • name Char
    required=True translate=True args: 'Forum Name'
  • post_ids One2many → forum.post
    string='Posts' args: 'forum.post', 'forum_id'
  • privacy Selection
    default='public' help='Public: Forum is public\nSigned In: Forum is visible for signed in users\nSome users: Forum and their content are hidden for non members of selected group' args: [('public', 'Public'), ('connected', 'Signed In'), ('private', 'Some users')]
  • relevancy_post_vote Float
    default=0.8 help="This formula is used in order to sort by relevance. The variable 'votes' represents number of votes for a post, and 'days' is number of days since the post creation" args: 'First Relevance Parameter'
  • relevancy_time_decay Float
    default=1.8 args: 'Second Relevance Parameter'
  • sequence Integer
    default=1 args: 'Sequence'
  • teaser Text
    compute='_compute_teaser' store=True args: 'Teaser'
  • total_answers Integer
    compute='_compute_forum_statistics' args: '# Answers'
  • total_favorites Integer
    compute='_compute_forum_statistics' args: '# Favorites'
  • total_posts Integer
    compute='_compute_forum_statistics' args: '# Posts'
  • total_views Integer
    compute='_compute_forum_statistics' args: '# Views'
  • welcome_message Html
    default='<section>\n <div class="container py-5">\n <div class="row">\n <div class="col-lg-12">\n <h1 class="text-center">Welcome!</h1>\n <p class="text-400 text-center">\n This community is for professionals and enthusiasts of our products and services.\n <br/>Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.\n </p>\n </div>\n <div class="col text-center mt-3">\n <a href="#" class="js_close_intro btn btn-outline-light mr-2">Hide Intro</a>\n <a class="btn btn-light forum_register_url" href="/web/login">Register</a>\n </div>\n </div>\n </div>\n </section>' translate=True args: 'Welcome Message'
Public methods (5)
  • create(self, values)
    @api.model
  • get_tags_first_char(self)
    get set of first letter of forum tags
  • go_to_website(self)
  • unlink(self)
  • write(self, vals)

New fields (56)
  • active Boolean
    default=True args: 'Active'
  • bump_date Datetime
    help='Technical field allowing to bump a question. Writing on this field will trigger a write on write_date and therefore bump the post. Directly writing on write_date is currently not supported and this field is a workaround.' readonly=True args: 'Bumped on'
  • can_accept Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Accept'
  • can_answer Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Answer'
  • can_ask Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Ask'
  • can_close Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Close'
  • can_comment Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Comment'
  • can_comment_convert Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Convert to Comment'
  • can_display_biography Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: "Is the author's biography visible from his post"
  • can_downvote Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Downvote'
  • can_edit Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Edit'
  • can_flag Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Flag'
  • can_moderate Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Moderate'
  • can_post Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Automatically be Validated'
  • can_unlink Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Unlink'
  • can_upvote Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Upvote'
  • can_view Boolean
    compute='_get_post_karma_rights' compute_sudo=False search='_search_can_view' args: 'Can View'
  • child_count Integer
    compute='_get_child_count' store=True args: 'Answers'
  • child_ids One2many → forum.post
    domain=<expr> string='Post Answers' args: 'forum.post', 'parent_id'
  • closed_date Datetime
    copy=False readonly=True args: 'Closed on'
  • closed_reason_id Many2one → forum.post.reason
    copy=False string='Reason' args: 'forum.post.reason'
  • closed_uid Many2one → res.users
    copy=False index=True readonly=True string='Closed by' args: 'res.users'
  • content Html
    strip_style=True args: 'Content'
  • create_date Datetime
    index=True readonly=True args: 'Asked on'
  • create_uid Many2one → res.users
    index=True readonly=True string='Created by' args: 'res.users'
  • favourite_count Integer
    compute='_get_favorite_count' store=True args: 'Favorite'
  • favourite_ids Many2many → res.users
    string='Favourite' args: 'res.users'
  • flag_user_id Many2one → res.users
    string='Flagged by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • has_validated_answer Boolean
    compute='_get_has_validated_answer' store=True args: 'Is answered'
  • is_correct Boolean
    help='Correct answer or answer accepted' args: 'Correct'
  • karma_accept Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Convert comment to answer'
  • karma_close Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to close'
  • karma_comment Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to comment'
  • karma_comment_convert Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to convert comment to answer'
  • karma_edit Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to edit'
  • karma_flag Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Flag a post as offensive'
  • karma_unlink Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to unlink'
  • moderator_id Many2one → res.users
    readonly=True string='Reviewed by' args: 'res.users'
  • name Char
    args: 'Title'
  • parent_id Many2one → forum.post
    index=True ondelete='cascade' readonly=True string='Question' args: 'forum.post'
  • plain_content Text
    compute='_get_plain_content' store=True args: 'Plain Content'
  • relevancy Float
    compute='_compute_relevancy' store=True args: 'Relevance'
  • self_reply Boolean
    compute='_is_self_reply' store=True args: 'Reply to own question'
  • state Selection
    default='active' string='Status' args: [('active', 'Active'), ('pending', 'Waiting Validation'), ('close', 'Closed'), ('offensive', 'Offensive'), ('flagged', 'Flagged')]
  • tag_ids Many2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_tag_rel', 'forum_id', 'forum_tag_id'
  • uid_has_answered Boolean
    compute='_get_uid_has_answered' args: 'Has Answered'
  • user_favourite Boolean
    compute='_get_user_favourite' args: 'Is Favourite'
  • user_vote Integer
    compute='_get_user_vote' args: 'My Vote'
  • views Integer
    copy=False default=0 readonly=True args: 'Views'
  • vote_count Integer
    compute='_get_vote_count' store=True args: 'Total Votes'
  • vote_ids One2many → forum.post.vote
    string='Votes' args: 'forum.post.vote', 'post_id'
  • website_id Many2one
    readonly=True related='forum_id.website_id'
  • website_message_ids One2many
    domain=<expr>
  • write_date Datetime
    index=True readonly=True args: 'Updated on'
  • write_uid Many2one → res.users
    index=True readonly=True string='Updated by' args: 'res.users'
Public methods (19)
  • bump(self)
    Bump a question: trigger a write_date by writing on a dummy bump_date field. One cannot bump a question more than once every 10 days.
  • close(self, reason_id)
  • convert_answer_to_comment(self)
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, message_id, default=None)
    @api.model
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, vals)
    @api.model
  • flag(self)
  • get_access_action(self, access_uid=None)
    Instead of the classic form view, redirect to the post on the website directly
  • go_to_website(self)
  • mark_as_offensive(self, reason_id)
  • mark_as_offensive_batch(self, key, values)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • post_notification(self)
  • refuse(self)
  • reopen(self)
  • unlink(self)
  • unlink_comment(self, message_id)
  • validate(self)
  • vote(self, upvote=True)
  • write(self, vals)

New fields (2)
  • name Char
    required=True string='Closing Reason' translate=True
  • reason_type Selection
    default='basic' string='Reason Type' args: [('basic', 'Basic'), ('offensive', 'Offensive')]
Public methods (0)

No public methods.

New fields (6)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_id Many2one → forum.forum
    readonly=False related='post_id.forum_id' store=True string='Forum' args: 'forum.forum'
  • post_id Many2one → forum.post
    ondelete='cascade' required=True string='Post' args: 'forum.post'
  • recipient_id Many2one → res.users
    readonly=False related='post_id.create_uid' store=True string='To' args: 'res.users'
  • user_id Many2one → res.users
    default=<expr> required=True string='User' args: 'res.users'
  • vote Selection
    default='1' required=True string='Vote' args: [('1', '1'), ('-1', '-1'), ('0', '0')]
Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, values)

New fields (4)
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • name Char
    required=True args: 'Name'
  • post_ids Many2many → forum.post
    domain=[('state', '=', 'active')] string='Posts' args: 'forum.post', 'forum_tag_rel', 'forum_tag_id', 'forum_id'
  • posts_count Integer
    compute='_get_posts_count' store=True args: 'Number of Posts'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (1)
  • challenge_category Selection
    ondelete={'forum': 'set default'} selection_add=[('forum', 'Website / Forum')]
Public methods (0)

No public methods.

New fields (2)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_waiting_posts_count Integer
    compute='_get_user_waiting_post' args: 'Waiting post'
Public methods (2)
  • get_gamification_redirection_data(self)
  • open_website_url(self)

New fields (1)
  • forums_count Integer
    default=get_default_forum_count readonly=True
Public methods (2)
  • get_default_forum_count(self)
    @api.model
  • get_suggested_controllers(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/website_forum
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite/Website
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, David Monjoie, Xavier Morel, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Aaron Bohy, Jeremy Kersten, GitHub, Damien Bouvy, Yannick Tivisse, qsm-odoo, Dharmraj Jhala, Romain Derie, Jorge Pinna Puissant, Nans Lefebvre, Toufik Ben Jaa, Adrian Torres, Rémi Rahir, Xavier-Do, jvm-odoo, mgh-odoo, Paul Morelle, Sébastien Theys, David Beguin, Lucas Lefèvre, fja-odoo, ThanhDodeurOdoo, Younn Olivier, Parth Choksi, Yenthe666, Kevin Baptiste, Benjamin Vray, Hardik Prajapati, MerlinGuillaume, Andrea Ulliana, Huy
WEBSITE
WEBSITEhttps://www.odoo.com/page/community-builder
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - website_mail
    - website
    - web_editor
    - http_routing
    - portal
    - social_media
    - website_profile
    - website_partner
    - gamification
    - web_kanban_gauge
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (52)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
assets_editor Forum Editor Assets ir.ui.view qweb Inherits website.assets_editor
assets_frontend assets_frontend ir.ui.view qweb Inherits website.assets_frontend
assets_tests Website Forum Assets Tests ir.ui.view qweb Inherits web.assets_tests
close_post close_post ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
display_activities Forum Profile Activities ir.ui.view qweb New
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
display_post_question_block display_post_question_block ir.ui.view qweb New
edit_post edit_post ir.ui.view qweb New
faq Frequently Asked Questions ir.ui.view qweb New
forum_all Forum Navigation ir.ui.view qweb New
forum_all_all_entries forum_all_all_entries ir.ui.view qweb New
forum_all_oe_structure_forum_all_top Forum Navigation (oe_structure_forum_all_top) ir.ui.view qweb Inherits website_forum.forum_all
forum_index Forum ir.ui.view qweb New
forum_nav_header forum_nav_header ir.ui.view qweb New
forum_post_template_new_answer forum_post_template_new_answer ir.ui.view qweb New
forum_post_template_new_question forum_post_template_new_question ir.ui.view qweb New
forum_post_template_validation forum_post_template_validation ir.ui.view qweb New
forum_tag_view_form forum.tag.form forum.tag form New
forum_tag_view_list forum.tag.list forum.tag tree New
forum_view_search forum.forum.search forum.forum search New
header Forum Index ir.ui.view qweb New
layout Forum Layout ir.ui.view qweb Inherits website.layout
link_button link_button ir.ui.view qweb New
moderation_display_post_answer moderation_display_post_answer ir.ui.view qweb New
moderation_display_post_question_block moderation_display_post_question_block ir.ui.view qweb New
moderation_queue Forum Moderation Queue ir.ui.view qweb New
new_question new_question ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_answers post_answers ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
post_reply post_reply ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb Inherits website_profile.private_profile
tag Forum Tags ir.ui.view qweb New
user_navbar_inherit_website_forum user_navbar_inherit_website_forum ir.ui.view qweb Inherits website.user_navbar
user_profile_content user_profile_content ir.ui.view qweb Inherits website_profile.user_profile_content
user_profile_sub_nav user_profile_sub_nav ir.ui.view qweb Inherits website_profile.user_profile_sub_nav
user_votes Forum User Votes ir.ui.view qweb New
view_forum_forum_form forum.forum.form forum.forum form New
view_forum_forum_list forum.forum.list forum.forum tree New
view_forum_post_form forum.post.form forum.post form New
view_forum_post_graph forum.post.graph forum.post graph New
view_forum_post_list forum.post.list forum.post tree New
view_forum_post_search forum.post.search forum.post search New
view_users_form_forum res.users.form.forum res.users div Inherits base.view_users_form
vote vote ir.ui.view qweb New
website_forum.author_box website_forum.author_box ir.ui.view qweb New
website_forum.question_dropdown website_forum.question_dropdown ir.ui.view qweb New
website_forum.user_sidebar website_forum.user_sidebar ir.ui.view qweb New
Models touched (8)

New fields (53)
  • active Boolean
    default=True
  • allow_bump Boolean
    default=True help='Check this box to display a popup for posts older than 10 days without any given answer. The popup will offer to share it on social networks. When shared, a question is bumped at the top of the forum.' args: 'Allow Bump'
  • allow_share Boolean
    default=True help='After posting the user will be proposed to share its question or answer on social networks, enabling social network propagation of the forum content.' args: 'Sharing Options'
  • count_flagged_posts Integer
    compute='_compute_count_flagged_posts' string='Number of flagged posts'
  • count_posts_waiting_validation Integer
    compute='_compute_count_posts_waiting_validation' string='Number of posts waiting for validation'
  • default_order Selection
    default='write_date desc' required=True string='Default' args: [('create_date desc', 'Newest'), ('write_date desc', 'Last Updated'), ('vote_count desc', 'Most Voted'), ('relevancy desc', 'Relevance'), ('child_count desc', 'Answered')]
  • description Text
    translate=True args: 'Description'
  • faq Html
    default=_get_default_faq sanitize=False translate=html_translate args: 'Guidelines'
  • karma_answer Integer
    default=3 string='Answer questions'
  • karma_answer_accept_all Integer
    default=500 string='Accept an answer to all questions'
  • karma_answer_accept_own Integer
    default=20 string='Accept an answer on own questions'
  • karma_ask Integer
    default=3 string='Ask questions'
  • karma_close_all Integer
    default=500 string='Close all posts'
  • karma_close_own Integer
    default=100 string='Close own posts'
  • karma_comment_all Integer
    default=1 string='Comment all posts'
  • karma_comment_convert_all Integer
    default=500 string='Convert all answers to comments and vice versa'
  • karma_comment_convert_own Integer
    default=50 string='Convert own answers to comments and vice versa'
  • karma_comment_own Integer
    default=1 string='Comment own posts'
  • karma_comment_unlink_all Integer
    default=500 string='Unlink all comments'
  • karma_comment_unlink_own Integer
    default=50 string='Unlink own comments'
  • karma_dofollow Integer
    default=500 help='If the author has not enough karma, a nofollow attribute is added to links' string='Nofollow links'
  • karma_downvote Integer
    default=50 string='Downvote'
  • karma_edit_all Integer
    default=300 string='Edit all posts'
  • karma_edit_own Integer
    default=1 string='Edit own posts'
  • karma_edit_retag Integer
    default=75 string='Change question tags'
  • karma_editor Integer
    default=30 string='Editor Features: image and links'
  • karma_flag Integer
    default=500 string='Flag a post as offensive'
  • karma_gen_answer_accept Integer
    default=2 string='Accepting an answer'
  • karma_gen_answer_accepted Integer
    default=15 string='Answer accepted'
  • karma_gen_answer_downvote Integer
    default=-2 string='Answer downvoted'
  • karma_gen_answer_flagged Integer
    default=-100 string='Answer flagged'
  • karma_gen_answer_upvote Integer
    default=10 string='Answer upvoted'
  • karma_gen_question_downvote Integer
    default=-2 string='Question downvoted'
  • karma_gen_question_new Integer
    default=2 string='Asking a question'
  • karma_gen_question_upvote Integer
    default=5 string='Question upvoted'
  • karma_moderate Integer
    default=1000 string='Moderate posts'
  • karma_post Integer
    default=100 string='Ask questions without validation'
  • karma_tag_create Integer
    default=30 string='Create new tags'
  • karma_unlink_all Integer
    default=1000 string='Delete all posts'
  • karma_unlink_own Integer
    default=500 string='Delete own posts'
  • karma_upvote Integer
    default=5 string='Upvote'
  • karma_user_bio Integer
    default=750 string='Display detailed user biography'
  • mode Selection
    default='questions' help='Questions mode: only one answer allowed\n Discussions mode: multiple answers allowed' required=True string='Forum Mode' args: [('questions', 'Questions'), ('discussions', 'Discussions')]
  • name Char
    required=True translate=True args: 'Forum Name'
  • post_ids One2many → forum.post
    string='Posts' args: 'forum.post', 'forum_id'
  • relevancy_post_vote Float
    default=0.8 help="This formula is used in order to sort by relevance. The variable 'votes' represents number of votes for a post, and 'days' is number of days since the post creation" args: 'First Relevance Parameter'
  • relevancy_time_decay Float
    default=1.8 args: 'Second Relevance Parameter'
  • sequence Integer
    default=1 args: 'Sequence'
  • total_answers Integer
    compute='_compute_forum_statistics' args: 'Answers Count'
  • total_favorites Integer
    compute='_compute_forum_statistics' args: 'Favorites Count'
  • total_posts Integer
    compute='_compute_forum_statistics' args: 'Post Count'
  • total_views Integer
    compute='_compute_forum_statistics' args: 'Views Count'
  • welcome_message Html
    default='<section>\n <div class="container py-5">\n <div class="row">\n <div class="col-lg-12">\n <h1 class="text-center">Welcome!</h1>\n <p class="text-400 text-center">\n This community is for professionals and enthusiasts of our products and services.\n <br/>Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.\n </p>\n </div>\n <div class="col text-center mt-3">\n <a href="#" class="js_close_intro btn btn-outline-light mr-2">Hide Intro</a>\n <a class="btn btn-light forum_register_url" href="/web/login">Register</a>\n </div>\n </div>\n </div>\n </section>' translate=True args: 'Welcome Message'
Public methods (3)
  • create(self, values)
    @api.model
  • get_tags_first_char(self)
    get set of first letter of forum tags
  • write(self, vals)

New fields (56)
  • active Boolean
    default=True args: 'Active'
  • bump_date Datetime
    help='Technical field allowing to bump a question. Writing on this field will trigger a write on write_date and therefore bump the post. Directly writing on write_date is currently not supported and this field is a workaround.' readonly=True args: 'Bumped on'
  • can_accept Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Accept'
  • can_answer Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Answer'
  • can_ask Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Ask'
  • can_close Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Close'
  • can_comment Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Comment'
  • can_comment_convert Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Convert to Comment'
  • can_display_biography Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: "Is the author's biography visible from his post"
  • can_downvote Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Downvote'
  • can_edit Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Edit'
  • can_flag Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Flag'
  • can_moderate Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Moderate'
  • can_post Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Automatically be Validated'
  • can_unlink Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Unlink'
  • can_upvote Boolean
    compute='_get_post_karma_rights' compute_sudo=False args: 'Can Upvote'
  • can_view Boolean
    compute='_get_post_karma_rights' compute_sudo=False search='_search_can_view' args: 'Can View'
  • child_count Integer
    compute='_get_child_count' store=True args: 'Number of answers'
  • child_ids One2many → forum.post
    string='Answers' args: 'forum.post', 'parent_id'
  • closed_date Datetime
    readonly=True args: 'Closed on'
  • closed_reason_id Many2one → forum.post.reason
    string='Reason' args: 'forum.post.reason'
  • closed_uid Many2one → res.users
    index=True string='Closed by' args: 'res.users'
  • content Html
    strip_style=True args: 'Content'
  • create_date Datetime
    index=True readonly=True args: 'Asked on'
  • create_uid Many2one → res.users
    index=True readonly=True string='Created by' args: 'res.users'
  • favourite_count Integer
    compute='_get_favorite_count' store=True args: 'Favorite Count'
  • favourite_ids Many2many → res.users
    string='Favourite' args: 'res.users'
  • flag_user_id Many2one → res.users
    string='Flagged by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • has_validated_answer Boolean
    compute='_get_has_validated_answer' store=True args: 'Is answered'
  • is_correct Boolean
    help='Correct answer or answer accepted' args: 'Correct'
  • karma_accept Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Convert comment to answer'
  • karma_close Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to close'
  • karma_comment Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to comment'
  • karma_comment_convert Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to convert comment to answer'
  • karma_edit Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to edit'
  • karma_flag Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Flag a post as offensive'
  • karma_unlink Integer
    compute='_get_post_karma_rights' compute_sudo=False args: 'Karma to unlink'
  • moderator_id Many2one → res.users
    readonly=True string='Reviewed by' args: 'res.users'
  • name Char
    args: 'Title'
  • parent_id Many2one → forum.post
    ondelete='cascade' string='Question' args: 'forum.post'
  • plain_content Text
    compute='_get_plain_content' store=True args: 'Plain Content'
  • relevancy Float
    compute='_compute_relevancy' store=True args: 'Relevance'
  • self_reply Boolean
    compute='_is_self_reply' store=True args: 'Reply to own question'
  • state Selection
    default='active' string='Status' args: [('active', 'Active'), ('pending', 'Waiting Validation'), ('close', 'Close'), ('offensive', 'Offensive'), ('flagged', 'Flagged')]
  • tag_ids Many2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_tag_rel', 'forum_id', 'forum_tag_id'
  • uid_has_answered Boolean
    compute='_get_uid_has_answered' args: 'Has Answered'
  • user_favourite Boolean
    compute='_get_user_favourite' args: 'Is Favourite'
  • user_vote Integer
    compute='_get_user_vote' args: 'My Vote'
  • views Integer
    default=0 args: 'Number of Views'
  • vote_count Integer
    compute='_get_vote_count' store=True args: 'Total Votes'
  • vote_ids One2many → forum.post.vote
    string='Votes' args: 'forum.post.vote', 'post_id'
  • website_id Many2one
    readonly=True related='forum_id.website_id'
  • website_message_ids One2many
    domain=<expr>
  • write_date Datetime
    index=True readonly=True args: 'Update on'
  • write_uid Many2one → res.users
    index=True readonly=True string='Updated by' args: 'res.users'
Public methods (20)
  • bump(self)
    Bump a question: trigger a write_date by writing on a dummy bump_date field. One cannot bump a question more than once every 10 days.
  • close(self, reason_id)
  • convert_answer_to_comment(self)
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, message_id, default=None)
    @api.model
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, vals)
    @api.model
  • flag(self)
  • get_access_action(self, access_uid=None)
    Instead of the classic form view, redirect to the post on the website directly
  • get_mail_message_access(self, res_ids, operation, model_name=None)
    @api.model
  • mark_as_offensive(self, reason_id)
  • mark_as_offensive_batch(self, key, values)
  • message_post(self, *, message_type='notification', **kwargs)
    @api.returns('mail.message', <expr>)
  • post_notification(self)
  • refuse(self)
  • reopen(self)
  • set_viewed(self)
  • unlink(self)
  • unlink_comment(self, message_id)
  • validate(self)
  • vote(self, upvote=True)
  • write(self, vals)

New fields (2)
  • name Char
    required=True string='Closing Reason' translate=True
  • reason_type Char
    string='Reason Type'
Public methods (0)

No public methods.

New fields (6)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_id Many2one → forum.forum
    readonly=False related='post_id.forum_id' store=True string='Forum' args: 'forum.forum'
  • post_id Many2one → forum.post
    ondelete='cascade' required=True string='Post' args: 'forum.post'
  • recipient_id Many2one → res.users
    readonly=False related='post_id.create_uid' store=True string='To' args: 'res.users'
  • user_id Many2one → res.users
    default=<expr> required=True string='User' args: 'res.users'
  • vote Selection
    default='1' required=True string='Vote' args: [('1', '1'), ('-1', '-1'), ('0', '0')]
Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, values)

New fields (4)
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • name Char
    required=True args: 'Name'
  • post_ids Many2many → forum.post
    domain=[('state', '=', 'active')] string='Posts' args: 'forum.post', 'forum_tag_rel', 'forum_tag_id', 'forum_id'
  • posts_count Integer
    compute='_get_posts_count' store=True args: 'Number of Posts'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (1)
  • category Selection
    selection_add=[('forum', 'Website / Forum')]
Public methods (0)

No public methods.

New fields (2)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_waiting_posts_count Integer
    compute='_get_user_waiting_post' args: 'Waiting post'
Public methods (2)
  • get_gamification_redirection_data(self)
  • open_website_url(self)

New fields (1)
  • forums_count Integer
    compute=_compute_field_forums_count
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/website_forum
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Christophe Simonis, Xavier Morel, Nicolas Martinelli, Nicolas Lempereur, Jeremy Kersten, GitHub, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Romain Derie, Christophe Monniez, Adrian Torres, Xavier-Do, David Tran, Sébastien Theys, Quentin Smetz (qsm), Younn Olivier, Yenthe666, Benjamin Vray
WEBSITE
WEBSITEhttps://www.odoo.com/page/community-builder
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:02
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - gamification
    - web_kanban_gauge
    - website_mail
    - website
    - web_editor
    - http_routing
    - portal
    - social_media
    - website_partner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (53)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
assets_editor Forum Editor Assets ir.ui.view qweb Inherits website.assets_editor
assets_frontend assets_frontend ir.ui.view qweb Inherits website.assets_frontend
badge Forum Badges ir.ui.view qweb New
badge_form_view_forum forum.badge_form_view gamification.badge field Inherits gamification.badge_form_view
close_post close_post ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
display_post_question_block display_post_question_block ir.ui.view qweb New
edit_post edit_post ir.ui.view qweb New
edit_profile Forum Edit Profile ir.ui.view qweb New
edit_welcome_message edit_welcome_message ir.ui.view qweb New
faq Frequently Asked Questions ir.ui.view qweb New
forum_all Our Forums ir.ui.view qweb New
forum_index Forum ir.ui.view qweb New
forum_post_template_new_answer forum_post_template_new_answer ir.ui.view qweb New
forum_post_template_new_question forum_post_template_new_question ir.ui.view qweb New
forum_post_template_validation forum_post_template_validation ir.ui.view qweb New
forum_tag_view_form forum.tag.form forum.tag form New
forum_tag_view_list forum.tag.list forum.tag tree New
forum_user_tooltip forum_user_tooltip ir.ui.view qweb New
forum_view_search forum.forum.search forum.forum search New
header Forum Index ir.ui.view qweb New
layout Forum Layout ir.ui.view qweb Inherits website.layout
link_button link_button ir.ui.view qweb New
moderation_display_post_answer moderation_display_post_answer ir.ui.view qweb New
moderation_display_post_question_block moderation_display_post_question_block ir.ui.view qweb New
moderation_queue Forum Moderation Queue ir.ui.view qweb New
new_discussion new_discussion ir.ui.view qweb New
new_link new_link ir.ui.view qweb New
new_question new_question ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_answers post_answers ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
post_reply post_reply ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb New
res_users_view_form_preference res.users.form.preference.forum res.users data Inherits base.view_users_form_simple_modif
tag Forum Tags ir.ui.view qweb New
user_badges user_badges ir.ui.view qweb New
user_detail_full user_detail_full ir.ui.view qweb New
user_navbar_inherit_website_forum user_navbar_inherit_website_forum ir.ui.view qweb Inherits website.user_navbar
user_votes user_votes ir.ui.view qweb New
users users ir.ui.view qweb New
view_forum_forum_form forum.forum.form forum.forum form New
view_forum_forum_list forum.forum.list forum.forum tree New
view_forum_post_form forum.post.form forum.post form New
view_forum_post_graph forum.post.graph forum.post graph New
view_forum_post_list forum.post.list forum.post tree New
view_forum_post_search forum.post.search forum.post search New
view_users_form_forum res.users.form.forum res.users field Inherits base.view_users_form
vote vote ir.ui.view qweb New
Models touched (9)

New fields (50)
  • active Boolean
    default=True
  • allow_bump Boolean
    default=True help='Check this box to display a popup for posts older than 10 days without any given answer. The popup will offer to share it on social networks. When shared, a question is bumped at the top of the forum.' args: 'Allow Bump'
  • allow_discussion Boolean
    default=True args: 'Discussions'
  • allow_link Boolean
    default=True help='When clicking on the post, it redirects to an external link' args: 'Links'
  • allow_question Boolean
    default=True help='Users can answer only once per question. Contributors can edit answers and mark the right ones.' args: 'Questions'
  • allow_share Boolean
    default=True help='After posting the user will be proposed to share its question or answer on social networks, enabling social network propagation of the forum content.' args: 'Sharing Options'
  • count_flagged_posts Integer
    compute='_compute_count_flagged_posts' string='Number of flagged posts'
  • count_posts_waiting_validation Integer
    compute='_compute_count_posts_waiting_validation' string='Number of posts waiting for validation'
  • default_order Selection
    default='write_date desc' required=True string='Default Order' args: [('create_date desc', 'Newest'), ('write_date desc', 'Last Updated'), ('vote_count desc', 'Most Voted'), ('relevancy desc', 'Relevance'), ('child_count desc', 'Answered')]
  • default_post_type Selection
    default='question' required=True string='Default Post' args: [('question', 'Question'), ('discussion', 'Discussion'), ('link', 'Link')]
  • description Text
    default=<expr> translate=True args: 'Description'
  • faq Html
    default=_get_default_faq translate=True args: 'Guidelines'
  • karma_answer Integer
    default=3 string='Answer questions'
  • karma_answer_accept_all Integer
    default=500 string='Accept an answer to all questions'
  • karma_answer_accept_own Integer
    default=20 string='Accept an answer on own questions'
  • karma_ask Integer
    default=3 string='Ask questions'
  • karma_close_all Integer
    default=500 string='Close all posts'
  • karma_close_own Integer
    default=100 string='Close own posts'
  • karma_comment_all Integer
    default=1 string='Comment all posts'
  • karma_comment_convert_all Integer
    default=500 string='Convert all answers to comments and vice versa'
  • karma_comment_convert_own Integer
    default=50 string='Convert own answers to comments and vice versa'
  • karma_comment_own Integer
    default=1 string='Comment own posts'
  • karma_comment_unlink_all Integer
    default=500 string='Unlink all comments'
  • karma_comment_unlink_own Integer
    default=50 string='Unlink own comments'
  • karma_dofollow Integer
    default=500 help='If the author has not enough karma, a nofollow attribute is added to links' string='Nofollow links'
  • karma_downvote Integer
    default=50 string='Downvote'
  • karma_edit_all Integer
    default=300 string='Edit all posts'
  • karma_edit_own Integer
    default=1 string='Edit own posts'
  • karma_edit_retag Integer
    default=75 oldname='karma_retag' string='Change question tags'
  • karma_editor Integer
    default=30 oldname='karma_editor_link_files' string='Editor Features: image and links'
  • karma_flag Integer
    default=500 string='Flag a post as offensive'
  • karma_gen_answer_accept Integer
    default=2 string='Accepting an answer'
  • karma_gen_answer_accepted Integer
    default=15 string='Answer accepted'
  • karma_gen_answer_downvote Integer
    default=-2 string='Answer downvoted'
  • karma_gen_answer_flagged Integer
    default=-100 string='Answer flagged'
  • karma_gen_answer_upvote Integer
    default=10 string='Answer upvoted'
  • karma_gen_question_downvote Integer
    default=-2 string='Question downvoted'
  • karma_gen_question_new Integer
    default=2 string='Asking a question'
  • karma_gen_question_upvote Integer
    default=5 string='Question upvoted'
  • karma_moderate Integer
    default=1000 string='Moderate posts'
  • karma_post Integer
    default=100 string='Ask questions without validation'
  • karma_tag_create Integer
    default=30 string='Create new tags'
  • karma_unlink_all Integer
    default=1000 string='Delete all posts'
  • karma_unlink_own Integer
    default=500 string='Delete own posts'
  • karma_upvote Integer
    default=5 string='Upvote'
  • karma_user_bio Integer
    default=750 string='Display detailed user biography'
  • name Char
    required=True translate=True args: 'Forum Name'
  • relevancy_post_vote Float
    default=0.8 help="This formula is used in order to sort by relevance. The variable 'votes' represents number of votes for a post, and 'days' is number of days since the post creation" args: 'First Relevance Parameter'
  • relevancy_time_decay Float
    default=1.8 args: 'Second Relevance Parameter'
  • welcome_message Html
    default='<section class="bg-info shadow">\n <div class="container py-5">\n <div class="row">\n <div class="col-lg-12">\n <h1 class="text-center">Welcome!</h1>\n <p class="text-400 text-center">\n This community is for professionals and enthusiasts of our products and services.\n <br/>Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.\n </p>\n </div>\n <div class="col text-center mt-3">\n <a href="#" class="js_close_intro btn btn-outline-light">Hide Intro</a>\n <a class="btn btn-light forum_register_url" href="/web/login">Register</a>\n </div>\n </div>\n </div>\n </section>' translate=True args: 'Welcome Message'
Public methods (4)
  • create(self, values)
    @api.model
  • get_tags_first_char(self)
    get set of first letter of forum tags
  • init(self)
    @api.model_cr
    Add forum uuid for user email validation. TDE TODO: move me somewhere else, auto_init ?
  • write(self, vals)
    @api.multi

New fields (58)
  • active Boolean
    default=True args: 'Active'
  • bump_date Datetime
    help='Technical field allowing to bump a question. Writing on this field will trigger a write on write_date and therefore bump the post. Directly writing on write_date is currently not supported and this field is a workaround.' readonly=True args: 'Bumped on'
  • can_accept Boolean
    compute='_get_post_karma_rights' args: 'Can Accept'
  • can_answer Boolean
    compute='_get_post_karma_rights' args: 'Can Answer'
  • can_ask Boolean
    compute='_get_post_karma_rights' args: 'Can Ask'
  • can_close Boolean
    compute='_get_post_karma_rights' args: 'Can Close'
  • can_comment Boolean
    compute='_get_post_karma_rights' args: 'Can Comment'
  • can_comment_convert Boolean
    compute='_get_post_karma_rights' args: 'Can Convert to Comment'
  • can_display_biography Boolean
    compute='_get_post_karma_rights' args: "Is the author's biography visible from his post"
  • can_downvote Boolean
    compute='_get_post_karma_rights' args: 'Can Downvote'
  • can_edit Boolean
    compute='_get_post_karma_rights' args: 'Can Edit'
  • can_flag Boolean
    compute='_get_post_karma_rights' args: 'Can Flag'
  • can_moderate Boolean
    compute='_get_post_karma_rights' args: 'Can Moderate'
  • can_post Boolean
    compute='_get_post_karma_rights' args: 'Can Automatically be Validated'
  • can_unlink Boolean
    compute='_get_post_karma_rights' args: 'Can Unlink'
  • can_upvote Boolean
    compute='_get_post_karma_rights' args: 'Can Upvote'
  • can_view Boolean
    compute='_get_post_karma_rights' search='_search_can_view' args: 'Can View'
  • child_count Integer
    compute='_get_child_count' store=True args: 'Number of answers'
  • child_ids One2many → forum.post
    string='Answers' args: 'forum.post', 'parent_id'
  • closed_date Datetime
    readonly=True args: 'Closed on'
  • closed_reason_id Many2one → forum.post.reason
    string='Reason' args: 'forum.post.reason'
  • closed_uid Many2one → res.users
    index=True string='Closed by' args: 'res.users'
  • content Html
    strip_style=True args: 'Content'
  • content_link Char
    help='URL of Link Articles' args: 'URL'
  • create_date Datetime
    index=True readonly=True args: 'Asked on'
  • create_uid Many2one → res.users
    index=True readonly=True string='Created by' args: 'res.users'
  • favourite_count Integer
    compute='_get_favorite_count' store=True args: 'Favorite Count'
  • favourite_ids Many2many → res.users
    string='Favourite' args: 'res.users'
  • flag_user_id Many2one → res.users
    string='Flagged by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • has_validated_answer Boolean
    compute='_get_has_validated_answer' store=True args: 'Is answered'
  • is_correct Boolean
    help='Correct answer or answer accepted' args: 'Correct'
  • karma_accept Integer
    compute='_get_post_karma_rights' args: 'Convert comment to answer'
  • karma_close Integer
    compute='_get_post_karma_rights' args: 'Karma to close'
  • karma_comment Integer
    compute='_get_post_karma_rights' args: 'Karma to comment'
  • karma_comment_convert Integer
    compute='_get_post_karma_rights' args: 'Karma to convert comment to answer'
  • karma_edit Integer
    compute='_get_post_karma_rights' args: 'Karma to edit'
  • karma_flag Integer
    compute='_get_post_karma_rights' args: 'Flag a post as offensive'
  • karma_unlink Integer
    compute='_get_post_karma_rights' args: 'Karma to unlink'
  • moderator_id Many2one → res.users
    readonly=True string='Reviewed by' args: 'res.users'
  • name Char
    args: 'Title'
  • parent_id Many2one → forum.post
    ondelete='cascade' string='Question' args: 'forum.post'
  • plain_content Text
    compute='_get_plain_content' store=True args: 'Plain Content'
  • post_type Selection
    default='question' required=True string='Type' args: [('question', 'Question'), ('link', 'Article'), ('discussion', 'Discussion')]
  • relevancy Float
    compute='_compute_relevancy' store=True args: 'Relevance'
  • self_reply Boolean
    compute='_is_self_reply' store=True args: 'Reply to own question'
  • state Selection
    default='active' string='Status' args: [('active', 'Active'), ('pending', 'Waiting Validation'), ('close', 'Close'), ('offensive', 'Offensive'), ('flagged', 'Flagged')]
  • tag_ids Many2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_tag_rel', 'forum_id', 'forum_tag_id'
  • uid_has_answered Boolean
    compute='_get_uid_has_answered' args: 'Has Answered'
  • user_favourite Boolean
    compute='_get_user_favourite' args: 'Is Favourite'
  • user_vote Integer
    compute='_get_user_vote' args: 'My Vote'
  • views Integer
    default=0 args: 'Number of Views'
  • vote_count Integer
    compute='_get_vote_count' store=True args: 'Total Votes'
  • vote_ids One2many → forum.post.vote
    string='Votes' args: 'forum.post.vote', 'post_id'
  • website_id Many2one
    readonly=True related='forum_id.website_id'
  • website_message_ids One2many
    domain=<expr>
  • write_date Datetime
    index=True readonly=True args: 'Update on'
  • write_uid Many2one → res.users
    index=True readonly=True string='Updated by' args: 'res.users'
Public methods (20)
  • bump(self)
    @api.multi
    Bump a question: trigger a write_date by writing on a dummy bump_date field. One cannot bump a question more than once every 10 days.
  • check_mail_message_access(self, res_ids, operation, model_name=None)
    @api.model
  • close(self, reason_id)
    @api.multi
  • convert_answer_to_comment(self)
    @api.multi
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, message_id, default=None)
    @api.model
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, vals)
    @api.model
  • flag(self)
    @api.one
  • get_access_action(self, access_uid=None)
    @api.multi
    Instead of the classic form view, redirect to the post on the website directly
  • mark_as_offensive(self, reason_id)
    @api.one
  • message_post(self, message_type='notification', **kwargs)
    @api.multi@api.returns('mail.message', <expr>)
  • name_get(self)
    @api.multi@api.depends('name', 'post_type')
  • post_notification(self)
    @api.multi
  • refuse(self)
    @api.one
  • reopen(self)
    @api.multi
  • set_viewed(self)
    @api.multi
  • unlink(self)
    @api.multi
  • unlink_comment(self, message_id)
    @api.one
  • validate(self)
    @api.one
  • vote(self, upvote=True)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (2)
  • name Char
    required=True string='Closing Reason' translate=True
  • reason_type Char
    string='Reason Type'
Public methods (0)

No public methods.

New fields (6)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_id Many2one → forum.forum
    readonly=False related='post_id.forum_id' store=True string='Forum' args: 'forum.forum'
  • post_id Many2one → forum.post
    ondelete='cascade' required=True string='Post' args: 'forum.post'
  • recipient_id Many2one → res.users
    readonly=False related='post_id.create_uid' store=True string='To' args: 'res.users'
  • user_id Many2one → res.users
    default=<expr> required=True string='User' args: 'res.users'
  • vote Selection
    default='1' required=True string='Vote' args: [('1', '1'), ('-1', '-1'), ('0', '0')]
Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, values)
    @api.multi

New fields (4)
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • name Char
    required=True args: 'Name'
  • post_ids Many2many → forum.post
    domain=[('state', '=', 'active')] string='Posts' args: 'forum.post', 'forum_tag_rel', 'forum_tag_id', 'forum_id'
  • posts_count Integer
    compute='_get_posts_count' store=True args: 'Number of Posts'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (1)
  • level Selection
    string='Forum Badge Level' args: [('bronze', 'bronze'), ('silver', 'silver'), ('gold', 'gold')]
Public methods (0)

No public methods.

New fields (1)
  • level Selection
    readonly=False related='badge_id.level' store=True string='Forum Badge Level' args: [('bronze', 'bronze'), ('silver', 'silver'), ('gold', 'gold')]
Public methods (0)

No public methods.

New fields (1)
  • category Selection
    selection_add=[('forum', 'Website / Forum')]
Public methods (0)

No public methods.

New fields (7)
  • badge_ids One2many → gamification.badge.user
    copy=False string='Badges' args: 'gamification.badge.user', 'user_id'
  • bronze_badge Integer
    compute='_get_user_badge_level' args: 'Bronze badges count'
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_waiting_posts_count Integer
    compute='_get_user_waiting_post' args: 'Waiting post'
  • gold_badge Integer
    compute='_get_user_badge_level' args: 'Gold badges count'
  • karma Integer
    default=0 args: 'Karma'
  • silver_badge Integer
    compute='_get_user_badge_level' args: 'Silver badges count'
Public methods (4)
  • add_karma(self, karma)
    @api.multi
  • open_website_url(self)
    @api.multi
  • process_forum_validation_token(self, token, email, forum_id=None, context=None)
    @api.one
  • send_forum_validation_email(self, forum_id=None)
    @api.one
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/website_forum
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Jérome Maes, Aaron Bohy, Jeremy Kersten, GitHub, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, fwi-odoo, Sébastien Theys
WEBSITE
WEBSITEhttps://www.odoo.com/page/community-builder
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - gamification
    - web_kanban_gauge
    - website_mail
    - website
    - web_editor
    - web_planner
    - http_routing
    - portal
    - website_partner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (53)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
assets_editor Forum Editor Assets ir.ui.view qweb Inherits website.assets_editor
assets_frontend Forum Assets ir.ui.view qweb Inherits website.assets_frontend
badge badge ir.ui.view qweb New
close_post close_post ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
content_new_forum content_new_forum ir.ui.view qweb Inherits website.user_navbar
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
display_post_question_block display_post_question_block ir.ui.view qweb New
edit_post edit_post ir.ui.view qweb New
edit_profile edit_profile ir.ui.view qweb New
edit_welcome_message edit_welcome_message ir.ui.view qweb New
faq faq ir.ui.view qweb New
forum_all forum_all ir.ui.view qweb New
forum_index Forum ir.ui.view qweb New
forum_post_template_new_answer forum_post_template_new_answer ir.ui.view qweb New
forum_post_template_new_question forum_post_template_new_question ir.ui.view qweb New
forum_post_template_validation forum_post_template_validation ir.ui.view qweb New
forum_tag_view_form forum.tag.form forum.tag form New
forum_tag_view_list forum.tag.list forum.tag tree New
forum_user_tooltip forum_user_tooltip ir.ui.view qweb New
forum_view_search forum.forum.search forum.forum search New
header Forum Index ir.ui.view qweb New
header_footer_custom Footer Questions Link ir.ui.view qweb Inherits website.footer_default
layout Forum Layout ir.ui.view qweb Inherits website.layout
link_button link_button ir.ui.view qweb New
moderation_display_post_answer moderation_display_post_answer ir.ui.view qweb New
moderation_display_post_question_block moderation_display_post_question_block ir.ui.view qweb New
moderation_queue moderation_queue ir.ui.view qweb New
new_discussion new_discussion ir.ui.view qweb New
new_link new_link ir.ui.view qweb New
new_question new_question ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_answers post_answers ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
post_reply post_reply ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb New
res_users_view_form_preference res.users.form.preference.forum res.users data Inherits base.view_users_form_simple_modif
tag tag ir.ui.view qweb New
user_badges user_badges ir.ui.view qweb New
user_detail_full user_detail_full ir.ui.view qweb New
user_votes user_votes ir.ui.view qweb New
users users ir.ui.view qweb New
view_forum_forum_form forum.forum.form forum.forum form New
view_forum_forum_list forum.forum.list forum.forum tree New
view_forum_post_form forum.post.form forum.post form New
view_forum_post_graph forum.post.graph forum.post graph New
view_forum_post_list forum.post.list forum.post tree New
view_forum_post_search forum.post.search forum.post search New
view_users_form_forum res.users.form.forum res.users field Inherits base.view_users_form
vote vote ir.ui.view qweb New
Models touched (9)

New fields (50)
  • active Boolean
    default=True
  • allow_bump Boolean
    default=True help='Check this box to display a popup for posts older than 10 days without any given answer. The popup will offer to share it on social networks. When shared, a question is bumped at the top of the forum.' args: 'Allow Bump'
  • allow_discussion Boolean
    default=True args: 'Discussions'
  • allow_link Boolean
    default=True help='When clicking on the post, it redirects to an external link' args: 'Links'
  • allow_question Boolean
    default=True help='Users can answer only once per question. Contributors can edit answers and mark the right ones.' args: 'Questions'
  • allow_share Boolean
    default=True help='After posting the user will be proposed to share its question or answer on social networks, enabling social network propagation of the forum content.' args: 'Sharing Options'
  • count_flagged_posts Integer
    compute='_compute_count_flagged_posts' string='Number of flagged posts'
  • count_posts_waiting_validation Integer
    compute='_compute_count_posts_waiting_validation' string='Number of posts waiting for validation'
  • default_order Selection
    default='write_date desc' required=True string='Default Order' args: [('create_date desc', 'Newest'), ('write_date desc', 'Last Updated'), ('vote_count desc', 'Most Voted'), ('relevancy desc', 'Relevance'), ('child_count desc', 'Answered')]
  • default_post_type Selection
    default='question' required=True string='Default Post' args: [('question', 'Question'), ('discussion', 'Discussion'), ('link', 'Link')]
  • description Text
    default=<expr> translate=True args: 'Description'
  • faq Html
    default=_get_default_faq translate=True args: 'Guidelines'
  • karma_answer Integer
    default=3 string='Answer questions'
  • karma_answer_accept_all Integer
    default=500 string='Accept an answer to all questions'
  • karma_answer_accept_own Integer
    default=20 string='Accept an answer on own questions'
  • karma_ask Integer
    default=3 string='Ask questions'
  • karma_close_all Integer
    default=500 string='Close all posts'
  • karma_close_own Integer
    default=100 string='Close own posts'
  • karma_comment_all Integer
    default=1 string='Comment all posts'
  • karma_comment_convert_all Integer
    default=500 string='Convert all answers to comments and vice versa'
  • karma_comment_convert_own Integer
    default=50 string='Convert own answers to comments and vice versa'
  • karma_comment_own Integer
    default=1 string='Comment own posts'
  • karma_comment_unlink_all Integer
    default=500 string='Unlink all comments'
  • karma_comment_unlink_own Integer
    default=50 string='Unlink own comments'
  • karma_dofollow Integer
    default=500 help='If the author has not enough karma, a nofollow attribute is added to links' string='Nofollow links'
  • karma_downvote Integer
    default=50 string='Downvote'
  • karma_edit_all Integer
    default=300 string='Edit all posts'
  • karma_edit_own Integer
    default=1 string='Edit own posts'
  • karma_edit_retag Integer
    default=75 oldname='karma_retag' string='Change question tags'
  • karma_editor Integer
    default=30 oldname='karma_editor_link_files' string='Editor Features: image and links'
  • karma_flag Integer
    default=500 string='Flag a post as offensive'
  • karma_gen_answer_accept Integer
    default=2 string='Accepting an answer'
  • karma_gen_answer_accepted Integer
    default=15 string='Answer accepted'
  • karma_gen_answer_downvote Integer
    default=-2 string='Answer downvoted'
  • karma_gen_answer_flagged Integer
    default=-100 string='Answer flagged'
  • karma_gen_answer_upvote Integer
    default=10 string='Answer upvoted'
  • karma_gen_question_downvote Integer
    default=-2 string='Question downvoted'
  • karma_gen_question_new Integer
    default=2 string='Asking a question'
  • karma_gen_question_upvote Integer
    default=5 string='Question upvoted'
  • karma_moderate Integer
    default=1000 string='Moderate posts'
  • karma_post Integer
    default=100 string='Ask questions without validation'
  • karma_tag_create Integer
    default=30 string='Create new tags'
  • karma_unlink_all Integer
    default=1000 string='Delete all posts'
  • karma_unlink_own Integer
    default=500 string='Delete own posts'
  • karma_upvote Integer
    default=5 string='Upvote'
  • karma_user_bio Integer
    default=750 string='Display detailed user biography'
  • name Char
    required=True translate=True args: 'Forum Name'
  • relevancy_post_vote Float
    default=0.8 help="This formula is used in order to sort by relevance. The variable 'votes' represents number of votes for a post, and 'days' is number of days since the post creation" args: 'First Relevance Parameter'
  • relevancy_time_decay Float
    default=1.8 args: 'Second Relevance Parameter'
  • welcome_message Html
    default='<section class="bg-info" style="height: 168px;"><div class="container">\n <div class="row">\n <div class="col-md-12">\n <h1 class="text-center" style="text-align: left;">Welcome!</h1>\n <p class="text-muted text-center" style="text-align: left;">This community is for professionals and enthusiasts of our products and services. Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.</p>\n </div>\n <div class="col-md-12">\n <a href="#" class="js_close_intro">Hide Intro</a> <a class="btn btn-primary forum_register_url" href="/web/login">Register</a> </div>\n </div>\n </div>\n </section>' translate=True args: 'Welcome Message'
Public methods (4)
  • create(self, values)
    @api.model
  • get_tags_first_char(self)
    get set of first letter of forum tags
  • init(self)
    @api.model_cr
    Add forum uuid for user email validation. TDE TODO: move me somewhere else, auto_init ?
  • write(self, vals)
    @api.multi

New fields (57)
  • active Boolean
    default=True args: 'Active'
  • bump_date Datetime
    help='Technical field allowing to bump a question. Writing on this field will trigger a write on write_date and therefore bump the post. Directly writing on write_date is currently not supported and this field is a workaround.' readonly=True args: 'Bumped on'
  • can_accept Boolean
    compute='_get_post_karma_rights' args: 'Can Accept'
  • can_answer Boolean
    compute='_get_post_karma_rights' args: 'Can Answer'
  • can_ask Boolean
    compute='_get_post_karma_rights' args: 'Can Ask'
  • can_close Boolean
    compute='_get_post_karma_rights' args: 'Can Close'
  • can_comment Boolean
    compute='_get_post_karma_rights' args: 'Can Comment'
  • can_comment_convert Boolean
    compute='_get_post_karma_rights' args: 'Can Convert to Comment'
  • can_display_biography Boolean
    compute='_get_post_karma_rights' args: "Is the author's biography visible from his post"
  • can_downvote Boolean
    compute='_get_post_karma_rights' args: 'Can Downvote'
  • can_edit Boolean
    compute='_get_post_karma_rights' args: 'Can Edit'
  • can_flag Boolean
    compute='_get_post_karma_rights' args: 'Can Flag'
  • can_moderate Boolean
    compute='_get_post_karma_rights' args: 'Can Moderate'
  • can_post Boolean
    compute='_get_post_karma_rights' args: 'Can Automatically be Validated'
  • can_unlink Boolean
    compute='_get_post_karma_rights' args: 'Can Unlink'
  • can_upvote Boolean
    compute='_get_post_karma_rights' args: 'Can Upvote'
  • can_view Boolean
    compute='_get_post_karma_rights' search='_search_can_view' args: 'Can View'
  • child_count Integer
    compute='_get_child_count' store=True args: 'Number of answers'
  • child_ids One2many → forum.post
    string='Answers' args: 'forum.post', 'parent_id'
  • closed_date Datetime
    readonly=True args: 'Closed on'
  • closed_reason_id Many2one → forum.post.reason
    string='Reason' args: 'forum.post.reason'
  • closed_uid Many2one → res.users
    index=True string='Closed by' args: 'res.users'
  • content Html
    strip_style=True args: 'Content'
  • content_link Char
    help='URL of Link Articles' args: 'URL'
  • create_date Datetime
    index=True readonly=True args: 'Asked on'
  • create_uid Many2one → res.users
    index=True readonly=True string='Created by' args: 'res.users'
  • favourite_count Integer
    compute='_get_favorite_count' store=True args: 'Favorite Count'
  • favourite_ids Many2many → res.users
    string='Favourite' args: 'res.users'
  • flag_user_id Many2one → res.users
    string='Flagged by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • has_validated_answer Boolean
    compute='_get_has_validated_answer' store=True args: 'Is answered'
  • is_correct Boolean
    help='Correct answer or answer accepted' args: 'Correct'
  • karma_accept Integer
    compute='_get_post_karma_rights' args: 'Convert comment to answer'
  • karma_close Integer
    compute='_get_post_karma_rights' args: 'Karma to close'
  • karma_comment Integer
    compute='_get_post_karma_rights' args: 'Karma to comment'
  • karma_comment_convert Integer
    compute='_get_post_karma_rights' args: 'Karma to convert comment to answer'
  • karma_edit Integer
    compute='_get_post_karma_rights' args: 'Karma to edit'
  • karma_flag Integer
    compute='_get_post_karma_rights' args: 'Flag a post as offensive'
  • karma_unlink Integer
    compute='_get_post_karma_rights' args: 'Karma to unlink'
  • moderator_id Many2one → res.users
    readonly=True string='Reviewed by' args: 'res.users'
  • name Char
    args: 'Title'
  • parent_id Many2one → forum.post
    ondelete='cascade' string='Question' args: 'forum.post'
  • plain_content Text
    compute='_get_plain_content' store=True args: 'Plain Content'
  • post_type Selection
    default='question' required=True string='Type' args: [('question', 'Question'), ('link', 'Article'), ('discussion', 'Discussion')]
  • relevancy Float
    compute='_compute_relevancy' store=True args: 'Relevance'
  • self_reply Boolean
    compute='_is_self_reply' store=True args: 'Reply to own question'
  • state Selection
    default='active' string='Status' args: [('active', 'Active'), ('pending', 'Waiting Validation'), ('close', 'Close'), ('offensive', 'Offensive'), ('flagged', 'Flagged')]
  • tag_ids Many2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_tag_rel', 'forum_id', 'forum_tag_id'
  • uid_has_answered Boolean
    compute='_get_uid_has_answered' args: 'Has Answered'
  • user_favourite Boolean
    compute='_get_user_favourite' args: 'Is Favourite'
  • user_vote Integer
    compute='_get_user_vote' args: 'My Vote'
  • views Integer
    default=0 args: 'Number of Views'
  • vote_count Integer
    compute='_get_vote_count' store=True args: 'Total Votes'
  • vote_ids One2many → forum.post.vote
    string='Votes' args: 'forum.post.vote', 'post_id'
  • website_message_ids One2many
    domain=<expr>
  • write_date Datetime
    index=True readonly=True args: 'Update on'
  • write_uid Many2one → res.users
    index=True readonly=True string='Updated by' args: 'res.users'
Public methods (21)
  • bump(self)
    @api.multi
    Bump a question: trigger a write_date by writing on a dummy bump_date field. One cannot bump a question more than once every 10 days.
  • check_mail_message_access(self, res_ids, operation, model_name=None)
    @api.model
  • close(self, reason_id)
    @api.multi
  • convert_answer_to_comment(self)
    @api.multi
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, message_id, default=None)
    @api.model
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, vals)
    @api.model
  • flag(self)
    @api.one
  • get_access_action(self, access_uid=None)
    @api.multi
    Instead of the classic form view, redirect to the post on the website directly
  • mark_as_offensive(self, reason_id)
    @api.one
  • message_get_message_notify_values(self, message, message_values)
    @api.multi
    Override to avoid keeping all notified recipients of a comment. We avoid tracking needaction on post comments. Only emails should be sufficient.
  • message_post(self, message_type='notification', subtype=None, **kwargs)
    @api.multi@api.returns('self', <expr>)
  • name_get(self)
    @api.multi@api.depends('name', 'post_type')
  • post_notification(self)
    @api.multi
  • refuse(self)
    @api.one
  • reopen(self)
    @api.multi
  • set_viewed(self)
    @api.multi
  • unlink(self)
    @api.multi
  • unlink_comment(self, message_id)
    @api.one
  • validate(self)
    @api.one
  • vote(self, upvote=True)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (2)
  • name Char
    required=True string='Closing Reason' translate=True
  • reason_type Char
    string='Reason Type'
Public methods (0)

No public methods.

New fields (6)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_id Many2one → forum.forum
    related='post_id.forum_id' store=True string='Forum' args: 'forum.forum'
  • post_id Many2one → forum.post
    ondelete='cascade' required=True string='Post' args: 'forum.post'
  • recipient_id Many2one → res.users
    related='post_id.create_uid' store=True string='To' args: 'res.users'
  • user_id Many2one → res.users
    default=<expr> required=True string='User' args: 'res.users'
  • vote Selection
    default='1' required=True string='Vote' args: [('1', '1'), ('-1', '-1'), ('0', '0')]
Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, values)
    @api.multi

New fields (5)
  • create_uid Many2one → res.users
    readonly=True string='Created by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • name Char
    required=True args: 'Name'
  • post_ids Many2many → forum.post
    domain=[('state', '=', 'active')] string='Posts' args: 'forum.post', 'forum_tag_rel', 'forum_tag_id', 'forum_id'
  • posts_count Integer
    compute='_get_posts_count' store=True args: 'Number of Posts'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (1)
  • level Selection
    string='Forum Badge Level' args: [('bronze', 'bronze'), ('silver', 'silver'), ('gold', 'gold')]
Public methods (0)

No public methods.

New fields (1)
  • level Selection
    related='badge_id.level' store=True string='Forum Badge Level' args: [('bronze', 'bronze'), ('silver', 'silver'), ('gold', 'gold')]
Public methods (0)

No public methods.

New fields (1)
  • category Selection
    selection_add=[('forum', 'Website / Forum')]
Public methods (0)

No public methods.

New fields (7)
  • badge_ids One2many → gamification.badge.user
    copy=False string='Badges' args: 'gamification.badge.user', 'user_id'
  • bronze_badge Integer
    compute='_get_user_badge_level' args: 'Bronze badges count'
  • create_date Datetime
    copy=False index=True readonly=True args: 'Create Date'
  • forum_waiting_posts_count Integer
    compute='_get_user_waiting_post' args: 'Waiting post'
  • gold_badge Integer
    compute='_get_user_badge_level' args: 'Gold badges count'
  • karma Integer
    default=0 args: 'Karma'
  • silver_badge Integer
    compute='_get_user_badge_level' args: 'Silver badges count'
Public methods (4)
  • add_karma(self, karma)
    @api.multi
  • open_website_url(self)
    @api.multi
  • process_forum_validation_token(self, token, email, forum_id=None, context=None)
    @api.one
  • send_forum_validation_email(self, forum_id=None)
    @api.one
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/website_forum
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Julien Legros, qdp-odoo, Géry Debongnie, Jeremy Kersten, GitHub, Lucas Perais (lpe), Yannick Tivisse, qsm-odoo, Martin Geubelle, Denis Vermylen (dve), len-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/page/community-builder
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web_kanban
    - web
    - mail
    - bus
    - web_tour
    - gamification
    - web_kanban_gauge
    - website_mail
    - website
    - web_editor
    - web_planner
    - website_partner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (52)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
assets_editor Forum Editor Assets ir.ui.view qweb Inherits website.assets_editor
assets_frontend Forum Assets ir.ui.view qweb Inherits website.assets_frontend
badge badge ir.ui.view qweb New
close_post close_post ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
content_new_forum content_new_forum ir.ui.view qweb Inherits website.user_navbar
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
display_post_question_block display_post_question_block ir.ui.view qweb New
edit_post edit_post ir.ui.view qweb New
edit_profile edit_profile ir.ui.view qweb New
edit_welcome_message edit_welcome_message ir.ui.view qweb New
faq faq ir.ui.view qweb New
forum_all forum_all ir.ui.view qweb New
forum_index Forum ir.ui.view qweb New
forum_post_template_new_answer forum_post_template_new_answer ir.ui.view qweb New
forum_post_template_new_question forum_post_template_new_question ir.ui.view qweb New
forum_post_template_validation forum_post_template_validation ir.ui.view qweb New
forum_tag_view_form forum.tag.form forum.tag form New
forum_tag_view_list forum.tag.list forum.tag tree New
forum_user_tooltip forum_user_tooltip ir.ui.view qweb New
forum_view_search forum.forum.search forum.forum search New
header Forum Index ir.ui.view qweb New
header_footer_custom Footer Questions Link ir.ui.view qweb Inherits website.footer_default
layout Forum Layout ir.ui.view qweb Inherits website.layout
link_button link_button ir.ui.view qweb New
moderation_display_post_answer moderation_display_post_answer ir.ui.view qweb New
moderation_display_post_question_block moderation_display_post_question_block ir.ui.view qweb New
moderation_queue moderation_queue ir.ui.view qweb New
new_discussion new_discussion ir.ui.view qweb New
new_link new_link ir.ui.view qweb New
new_question new_question ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_answers post_answers ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
post_reply post_reply ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb New
tag tag ir.ui.view qweb New
user_badges user_badges ir.ui.view qweb New
user_detail_full user_detail_full ir.ui.view qweb New
user_votes user_votes ir.ui.view qweb New
users users ir.ui.view qweb New
view_forum_forum_form forum.forum.form forum.forum form New
view_forum_forum_list forum.forum.list forum.forum tree New
view_forum_post_form forum.post.form forum.post form New
view_forum_post_graph forum.post.graph forum.post graph New
view_forum_post_list forum.post.list forum.post tree New
view_forum_post_search forum.post.search forum.post search New
view_users_form_forum res.users.form.forum res.users field Inherits base.view_users_form
vote vote ir.ui.view qweb New
Models touched (9)

New fields (50)
  • active Boolean
    default=True
  • allow_bump Boolean
    default=True help='Check this box to display a popup for posts older than 10 days without any given answer. The popup will offer to share it on social networks. When shared, a question is bumped at the top of the forum.' args: 'Allow Bump'
  • allow_discussion Boolean
    default=True args: 'Discussions'
  • allow_link Boolean
    default=True help='When clicking on the post, it redirects to an external link' args: 'Links'
  • allow_question Boolean
    default=True help='Users can answer only once per question. Contributors can edit answers and mark the right ones.' args: 'Questions'
  • allow_share Boolean
    default=True help='After posting the user will be proposed to share its question or answer on social networks, enabling social network propagation of the forum content.' args: 'Sharing Options'
  • count_flagged_posts Integer
    compute='_compute_count_flagged_posts' string='Number of flagged posts'
  • count_posts_waiting_validation Integer
    compute='_compute_count_posts_waiting_validation' string='Number of posts waiting for validation'
  • default_order Selection
    default='write_date desc' required=True string='Default Order' args: [('create_date desc', 'Newest'), ('write_date desc', 'Last Updated'), ('vote_count desc', 'Most Voted'), ('relevancy desc', 'Relevance'), ('child_count desc', 'Answered')]
  • default_post_type Selection
    default='question' required=True string='Default Post' args: [('question', 'Question'), ('discussion', 'Discussion'), ('link', 'Link')]
  • description Text
    default='This community is for professionals and enthusiasts of our products and services. Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.' translate=True args: 'Description'
  • faq Html
    default=_get_default_faq translate=True args: 'Guidelines'
  • karma_answer Integer
    default=3 string='Answer questions'
  • karma_answer_accept_all Integer
    default=500 string='Accept an answer to all questions'
  • karma_answer_accept_own Integer
    default=20 string='Accept an answer on own questions'
  • karma_ask Integer
    default=3 string='Ask questions'
  • karma_close_all Integer
    default=500 string='Close all posts'
  • karma_close_own Integer
    default=100 string='Close own posts'
  • karma_comment_all Integer
    default=1 string='Comment all posts'
  • karma_comment_convert_all Integer
    default=500 string='Convert all answers to comments and vice versa'
  • karma_comment_convert_own Integer
    default=50 string='Convert own answers to comments and vice versa'
  • karma_comment_own Integer
    default=1 string='Comment own posts'
  • karma_comment_unlink_all Integer
    default=500 string='Unlink all comments'
  • karma_comment_unlink_own Integer
    default=50 string='Unlink own comments'
  • karma_dofollow Integer
    default=500 help='If the author has not enough karma, a nofollow attribute is added to links' string='Nofollow links'
  • karma_downvote Integer
    default=50 string='Downvote'
  • karma_edit_all Integer
    default=300 string='Edit all posts'
  • karma_edit_own Integer
    default=1 string='Edit own posts'
  • karma_edit_retag Integer
    default=75 oldname='karma_retag' string='Change question tags'
  • karma_editor Integer
    default=30 oldname='karma_editor_link_files' string='Editor Features: image and links'
  • karma_flag Integer
    default=500 string='Flag a post as offensive'
  • karma_gen_answer_accept Integer
    default=2 string='Accepting an answer'
  • karma_gen_answer_accepted Integer
    default=15 string='Answer accepted'
  • karma_gen_answer_downvote Integer
    default=-2 string='Answer downvoted'
  • karma_gen_answer_flagged Integer
    default=-100 string='Answer flagged'
  • karma_gen_answer_upvote Integer
    default=10 string='Answer upvoted'
  • karma_gen_question_downvote Integer
    default=-2 string='Question downvoted'
  • karma_gen_question_new Integer
    default=2 string='Asking a question'
  • karma_gen_question_upvote Integer
    default=5 string='Question upvoted'
  • karma_moderate Integer
    default=1000 string='Moderate posts'
  • karma_post Integer
    default=100 string='Ask questions without validation'
  • karma_tag_create Integer
    default=30 string='Create new tags'
  • karma_unlink_all Integer
    default=1000 string='Delete all posts'
  • karma_unlink_own Integer
    default=500 string='Delete own posts'
  • karma_upvote Integer
    default=5 string='Upvote'
  • karma_user_bio Integer
    default=750 string='Display detailed user biography'
  • name Char
    required=True translate=True args: 'Forum Name'
  • relevancy_post_vote Float
    default=0.8 help="This formula is used in order to sort by relevance. The variable 'votes' represents number of votes for a post, and 'days' is number of days since the post creation" args: 'First Relevance Parameter'
  • relevancy_time_decay Float
    default=1.8 args: 'Second Relevance Parameter'
  • welcome_message Html
    default='<section class="bg-info" style="height: 168px;"><div class="container">\n <div class="row">\n <div class="col-md-12">\n <h1 class="text-center" style="text-align: left;">Welcome!</h1>\n <p class="text-muted text-center" style="text-align: left;">This community is for professionals and enthusiasts of our products and services. Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.</p>\n </div>\n <div class="col-md-12">\n <a href="#" class="js_close_intro">Hide Intro</a> <a class="btn btn-primary forum_register_url" href="/web/login">Register</a> </div>\n </div>\n </div>\n </section>' args: 'Welcome Message'
Public methods (4)
  • create(self, values)
    @api.model
  • get_tags_first_char(self)
    get set of first letter of forum tags
  • init(self)
    @api.model_cr
    Add forum uuid for user email validation. TDE TODO: move me somewhere else, auto_init ?
  • write(self, vals)
    @api.multi

New fields (57)
  • active Boolean
    default=True args: 'Active'
  • bump_date Datetime
    help='Technical field allowing to bump a question. Writing on this field will trigger a write on write_date and therefore bump the post. Directly writing on write_date is currently not supported and this field is a workaround.' readonly=True args: 'Bumped on'
  • can_accept Boolean
    compute='_get_post_karma_rights' args: 'Can Accept'
  • can_answer Boolean
    compute='_get_post_karma_rights' args: 'Can Answer'
  • can_ask Boolean
    compute='_get_post_karma_rights' args: 'Can Ask'
  • can_close Boolean
    compute='_get_post_karma_rights' args: 'Can Close'
  • can_comment Boolean
    compute='_get_post_karma_rights' args: 'Can Comment'
  • can_comment_convert Boolean
    compute='_get_post_karma_rights' args: 'Can Convert to Comment'
  • can_display_biography Boolean
    compute='_get_post_karma_rights' args: "Is the author's biography visible from his post"
  • can_downvote Boolean
    compute='_get_post_karma_rights' args: 'Can Downvote'
  • can_edit Boolean
    compute='_get_post_karma_rights' args: 'Can Edit'
  • can_flag Boolean
    compute='_get_post_karma_rights' args: 'Can Flag'
  • can_moderate Boolean
    compute='_get_post_karma_rights' args: 'Can Moderate'
  • can_post Boolean
    compute='_get_post_karma_rights' args: 'Can Automatically be Validated'
  • can_unlink Boolean
    compute='_get_post_karma_rights' args: 'Can Unlink'
  • can_upvote Boolean
    compute='_get_post_karma_rights' args: 'Can Upvote'
  • can_view Boolean
    compute='_get_post_karma_rights' search='_search_can_view' args: 'Can View'
  • child_count Integer
    compute='_get_child_count' store=True args: 'Number of answers'
  • child_ids One2many → forum.post
    string='Answers' args: 'forum.post', 'parent_id'
  • closed_date Datetime
    readonly=True args: 'Closed on'
  • closed_reason_id Many2one → forum.post.reason
    string='Reason' args: 'forum.post.reason'
  • closed_uid Many2one → res.users
    index=True string='Closed by' args: 'res.users'
  • content Html
    strip_style=True args: 'Content'
  • content_link Char
    help='URL of Link Articles' args: 'URL'
  • create_date Datetime
    index=True readonly=True args: 'Asked on'
  • create_uid Many2one → res.users
    index=True readonly=True string='Created by' args: 'res.users'
  • favourite_count Integer
    compute='_get_favorite_count' store=True args: 'Favorite Count'
  • favourite_ids Many2many → res.users
    string='Favourite' args: 'res.users'
  • flag_user_id Many2one → res.users
    string='Flagged by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • has_validated_answer Boolean
    compute='_get_has_validated_answer' store=True args: 'Is answered'
  • is_correct Boolean
    help='Correct answer or answer accepted' args: 'Correct'
  • karma_accept Integer
    compute='_get_post_karma_rights' args: 'Convert comment to answer'
  • karma_close Integer
    compute='_get_post_karma_rights' args: 'Karma to close'
  • karma_comment Integer
    compute='_get_post_karma_rights' args: 'Karma to comment'
  • karma_comment_convert Integer
    compute='_get_post_karma_rights' args: 'Karma to convert comment to answer'
  • karma_edit Integer
    compute='_get_post_karma_rights' args: 'Karma to edit'
  • karma_flag Integer
    compute='_get_post_karma_rights' args: 'Flag a post as offensive'
  • karma_unlink Integer
    compute='_get_post_karma_rights' args: 'Karma to unlink'
  • moderator_id Many2one → res.users
    readonly=True string='Reviewed by' args: 'res.users'
  • name Char
    args: 'Title'
  • parent_id Many2one → forum.post
    ondelete='cascade' string='Question' args: 'forum.post'
  • plain_content Text
    compute='_get_plain_content' store=True args: 'Plain Content'
  • post_type Selection
    default='question' required=True string='Type' args: [('question', 'Question'), ('link', 'Article'), ('discussion', 'Discussion')]
  • relevancy Float
    compute='_compute_relevancy' store=True args: 'Relevance'
  • self_reply Boolean
    compute='_is_self_reply' store=True args: 'Reply to own question'
  • state Selection
    default='active' string='Status' args: [('active', 'Active'), ('pending', 'Waiting Validation'), ('close', 'Close'), ('offensive', 'Offensive'), ('flagged', 'Flagged')]
  • tag_ids Many2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_tag_rel', 'forum_id', 'forum_tag_id'
  • uid_has_answered Boolean
    compute='_get_uid_has_answered' args: 'Has Answered'
  • user_favourite Boolean
    compute='_get_user_favourite' args: 'Is Favourite'
  • user_vote Integer
    compute='_get_user_vote' args: 'My Vote'
  • views Integer
    default=0 args: 'Number of Views'
  • vote_count Integer
    compute='_get_vote_count' store=True args: 'Total Votes'
  • vote_ids One2many → forum.post.vote
    string='Votes' args: 'forum.post.vote', 'post_id'
  • website_message_ids One2many → mail.message
    domain=<expr> help='Comments on forum post' string='Post Messages' args: 'mail.message', 'res_id'
  • write_date Datetime
    index=True readonly=True args: 'Update on'
  • write_uid Many2one → res.users
    index=True readonly=True string='Updated by' args: 'res.users'
Public methods (21)
  • bump(self)
    @api.multi
    Bump a question: trigger a write_date by writing on a dummy bump_date field. One cannot bump a question more than once every 10 days.
  • check_mail_message_access(self, res_ids, operation, model_name=None)
    @api.model
  • close(self, reason_id)
    @api.multi
  • convert_answer_to_comment(self)
    @api.multi
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, message_id, default=None)
    @api.model
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, vals)
    @api.model
  • flag(self)
    @api.one
  • get_access_action(self)
    @api.multi
    Instead of the classic form view, redirect to the post on the website directly
  • mark_as_offensive(self, reason_id)
    @api.one
  • message_get_message_notify_values(self, message, message_values)
    @api.multi
    Override to avoid keeping all notified recipients of a comment. We avoid tracking needaction on post comments. Only emails should be sufficient.
  • message_post(self, message_type='notification', subtype=None, **kwargs)
    @api.multi@api.returns('self', <expr>)
  • name_get(self)
    @api.multi@api.depends('name', 'post_type')
  • post_notification(self)
    @api.multi
  • refuse(self)
    @api.one
  • reopen(self)
    @api.multi
  • set_viewed(self)
    @api.multi
  • unlink(self)
    @api.multi
  • unlink_comment(self, message_id)
    @api.one
  • validate(self)
    @api.one
  • vote(self, upvote=True)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (2)
  • name Char
    required=True string='Closing Reason' translate=True
  • reason_type Char
    string='Reason Type'
Public methods (0)

No public methods.

New fields (6)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_id Many2one → forum.forum
    related='post_id.forum_id' store=True string='Forum' args: 'forum.forum'
  • post_id Many2one → forum.post
    ondelete='cascade' required=True string='Post' args: 'forum.post'
  • recipient_id Many2one → res.users
    related='post_id.create_uid' store=True string='To' args: 'res.users'
  • user_id Many2one → res.users
    default=<expr> required=True string='User' args: 'res.users'
  • vote Selection
    default='1' required=True string='Vote' args: [('1', '1'), ('-1', '-1'), ('0', '0')]
Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, values)
    @api.multi

New fields (5)
  • create_uid Many2one → res.users
    readonly=True string='Created by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • name Char
    required=True args: 'Name'
  • post_ids Many2many → forum.post
    domain=[('state', '=', 'active')] string='Posts' args: 'forum.post', 'forum_tag_rel', 'forum_tag_id', 'forum_id'
  • posts_count Integer
    compute='_get_posts_count' store=True args: 'Number of Posts'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (1)
  • level Selection
    string='Forum Badge Level' args: [('bronze', 'bronze'), ('silver', 'silver'), ('gold', 'gold')]
Public methods (0)

No public methods.

New fields (1)
  • level Selection
    related='badge_id.level' store=True string='Forum Badge Level' args: [('bronze', 'bronze'), ('silver', 'silver'), ('gold', 'gold')]
Public methods (0)

No public methods.

New fields (1)
  • category Selection
    selection_add=[('forum', 'Website / Forum')]
Public methods (0)

No public methods.

New fields (7)
  • badge_ids One2many → gamification.badge.user
    copy=False string='Badges' args: 'gamification.badge.user', 'user_id'
  • bronze_badge Integer
    compute='_get_user_badge_level' args: 'Bronze badges count'
  • create_date Datetime
    copy=False index=True readonly=True args: 'Create Date'
  • forum_waiting_posts_count Integer
    compute='_get_user_waiting_post' args: 'Waiting post'
  • gold_badge Integer
    compute='_get_user_badge_level' args: 'Gold badges count'
  • karma Integer
    default=0 args: 'Karma'
  • silver_badge Integer
    compute='_get_user_badge_level' args: 'Silver badges count'
Public methods (4)
  • add_karma(self, karma)
    @api.multi
  • open_website_url(self)
    @api.multi
  • process_forum_validation_token(self, token, email, forum_id=None, context=None)
    @api.one
  • send_forum_validation_email(self, forum_id=None)
    @api.one
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/website_forum
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, Christophe Simonis, David Monjoie, Xavier Morel, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Julien Legros, Richard Mathot, Géry Debongnie, Jeremy Kersten, Julien De Coster, tpa-odoo, Yannick Tivisse, qsm-odoo, Jaysinh Shukla
WEBSITE
WEBSITEhttps://www.odoo.com/page/community-builder
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:31
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web_kanban
    - web
    - mail
    - bus
    - gamification
    - web_kanban_gauge
    - website_mail
    - website
    - web_editor
    - web_planner
    - website_partner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (46)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
assets_editor Forum Editor Assets ir.ui.view qweb Inherits website.assets_editor
assets_frontend Forum Assets ir.ui.view qweb Inherits website.assets_frontend
badge badge ir.ui.view qweb New
badge_user badge_user ir.ui.view qweb New
close_post close_post ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
content_new_forum content_new_forum ir.ui.view qweb Inherits website.user_navbar
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
display_post_question_block display_post_question_block ir.ui.view qweb New
edit_post edit_post ir.ui.view qweb New
edit_profile edit_profile ir.ui.view qweb New
edit_welcome_message edit_welcome_message ir.ui.view qweb New
faq faq ir.ui.view qweb New
forum_all forum_all ir.ui.view qweb New
forum_index Forum ir.ui.view qweb New
forum_user_tooltip forum_user_tooltip ir.ui.view qweb New
header Forum Index ir.ui.view qweb New
header_footer_custom Footer Questions Link ir.ui.view qweb Inherits website.footer_default
link_button link_button ir.ui.view qweb New
moderation_display_post_answer moderation_display_post_answer ir.ui.view qweb New
moderation_display_post_question_block moderation_display_post_question_block ir.ui.view qweb New
moderation_queue moderation_queue ir.ui.view qweb New
new_discussion new_discussion ir.ui.view qweb New
new_link new_link ir.ui.view qweb New
new_question new_question ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_answers post_answers ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
post_reply post_reply ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb New
tag tag ir.ui.view qweb New
user_badges user_badges ir.ui.view qweb New
user_detail_full user_detail_full ir.ui.view qweb New
user_votes user_votes ir.ui.view qweb New
users users ir.ui.view qweb New
view_forum_forum_form forum.forum.form forum.forum form New
view_forum_forum_list forum.forum.list forum.forum tree New
view_forum_post_form forum.post.form forum.post form New
view_forum_post_graph forum.post.graph forum.post graph New
view_forum_post_list forum.post.list forum.post tree New
view_forum_post_search forum.post.search forum.post search New
view_users_form_forum res.users.form.forum res.users field Inherits base.view_users_form
vote vote ir.ui.view qweb New
Models touched (9)

New fields (48)
  • allow_bump Boolean
    default=True help='Check this box to display a popup for posts older than 10 days without any given answer. The popup will offer to share it on social networks. When shared, a question is bumped at the top of the forum.' args: 'Allow Bump'
  • allow_discussion Boolean
    default=True args: 'Discussions'
  • allow_link Boolean
    default=True help='When clicking on the post, it redirects to an external link' args: 'Links'
  • allow_question Boolean
    default=True help='Users can answer only once per question. Contributors can edit answers and mark the right ones.' args: 'Questions'
  • allow_share Boolean
    default=True help='After posting the user will be proposed to share its question or answer on social networks, enabling social network propagation of the forum content.' args: 'Sharing Options'
  • count_flagged_posts Integer
    compute='_compute_count_flagged_posts' string='Number of flagged posts'
  • count_posts_waiting_validation Integer
    compute='_compute_count_posts_waiting_validation' string='Number of posts waiting for validation'
  • default_order Selection
    default='write_date desc' required=True string='Default Order' args: [('create_date desc', 'Newest'), ('write_date desc', 'Last Updated'), ('vote_count desc', 'Most Voted'), ('relevancy desc', 'Relevance'), ('child_count desc', 'Answered')]
  • default_post_type Selection
    default='question' required=True string='Default Post' args: [('question', 'Question'), ('discussion', 'Discussion'), ('link', 'Link')]
  • description Text
    default='This community is for professionals and enthusiasts of our products and services. Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.' translate=True args: 'Description'
  • faq Html
    default=_get_default_faq translate=True args: 'Guidelines'
  • karma_answer Integer
    default=3 string='Answer questions'
  • karma_answer_accept_all Integer
    default=500 string='Accept an answer to all questions'
  • karma_answer_accept_own Integer
    default=20 string='Accept an answer on own questions'
  • karma_ask Integer
    default=3 string='Ask questions'
  • karma_close_all Integer
    default=500 string='Close all posts'
  • karma_close_own Integer
    default=100 string='Close own posts'
  • karma_comment_all Integer
    default=1 string='Comment all posts'
  • karma_comment_convert_all Integer
    default=500 string='Convert all answers to comments and vice versa'
  • karma_comment_convert_own Integer
    default=50 string='Convert own answers to comments and vice versa'
  • karma_comment_own Integer
    default=1 string='Comment own posts'
  • karma_comment_unlink_all Integer
    default=500 string='Unlink all comments'
  • karma_comment_unlink_own Integer
    default=50 string='Unlink own comments'
  • karma_dofollow Integer
    default=500 help='If the author has not enough karma, a nofollow attribute is added to links' string='Nofollow links'
  • karma_downvote Integer
    default=50 string='Downvote'
  • karma_edit_all Integer
    default=300 string='Edit all posts'
  • karma_edit_own Integer
    default=1 string='Edit own posts'
  • karma_editor Integer
    default=30 oldname='karma_editor_link_files' string='Editor Features: image and links'
  • karma_flag Integer
    default=500 string='Flag a post as offensive'
  • karma_gen_answer_accept Integer
    default=2 string='Accepting an answer'
  • karma_gen_answer_accepted Integer
    default=15 string='Answer accepted'
  • karma_gen_answer_downvote Integer
    default=-2 string='Answer downvoted'
  • karma_gen_answer_flagged Integer
    default=-100 string='Answer flagged'
  • karma_gen_answer_upvote Integer
    default=10 string='Answer upvoted'
  • karma_gen_question_downvote Integer
    default=-2 string='Question downvoted'
  • karma_gen_question_new Integer
    default=2 string='Asking a question'
  • karma_gen_question_upvote Integer
    default=5 string='Question upvoted'
  • karma_moderate Integer
    default=1000 string='Moderate posts'
  • karma_post Integer
    default=100 string='Ask questions without validation'
  • karma_retag Integer
    default=75 string='Change question tags'
  • karma_unlink_all Integer
    default=1000 string='Delete all posts'
  • karma_unlink_own Integer
    default=500 string='Delete own posts'
  • karma_upvote Integer
    default=5 string='Upvote'
  • karma_user_bio Integer
    default=750 string='Display detailed user biography'
  • name Char
    required=True translate=True args: 'Forum Name'
  • relevancy_post_vote Float
    default=0.8 help="This formula is used in order to sort by relevance. The variable 'votes' represents number of votes for a post, and 'days' is number of days since the post creation" args: 'First Relevance Parameter'
  • relevancy_time_decay Float
    default=1.8 args: 'Second Relevance Parameter'
  • welcome_message Html
    default='<section class="bg-info" style="height: 168px;"><div class="container">\n <div class="row">\n <div class="col-md-12">\n <h1 class="text-center" style="text-align: left;">Welcome!</h1>\n <p class="text-muted text-center" style="text-align: left;">This community is for professionals and enthusiasts of our products and services. Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.</p>\n </div>\n <div class="col-md-12">\n <a href="#" class="js_close_intro">Hide Intro</a> <a class="btn btn-primary forum_register_url" href="/web/login">Register</a> </div>\n </div>\n </div>\n </section>' args: 'Welcome Message'
Public methods (3)
  • create(self, values)
    @api.model
  • get_tags_first_char(self)
    get set of first letter of forum tags
  • init(self, cr)
    Add forum uuid for user email validation. TDE TODO: move me somewhere else, auto_init ?

New fields (57)
  • active Boolean
    default=True args: 'Active'
  • bump_date Datetime
    help='Technical field allowing to bump a question. Writing on this field will trigger a write on write_date and therefore bump the post. Directly writing on write_date is currently not supported and this field is a workaround.' readonly=True args: 'Bumped on'
  • can_accept Boolean
    compute='_get_post_karma_rights' args: 'Can Accept'
  • can_answer Boolean
    compute='_get_post_karma_rights' args: 'Can Answer'
  • can_ask Boolean
    compute='_get_post_karma_rights' args: 'Can Ask'
  • can_close Boolean
    compute='_get_post_karma_rights' args: 'Can Close'
  • can_comment Boolean
    compute='_get_post_karma_rights' args: 'Can Comment'
  • can_comment_convert Boolean
    compute='_get_post_karma_rights' args: 'Can Convert to Comment'
  • can_display_biography Boolean
    compute='_get_post_karma_rights' args: "Is the author's biography visible from his post"
  • can_downvote Boolean
    compute='_get_post_karma_rights' args: 'Can Downvote'
  • can_edit Boolean
    compute='_get_post_karma_rights' args: 'Can Edit'
  • can_flag Boolean
    compute='_get_post_karma_rights' args: 'Can Flag'
  • can_moderate Boolean
    compute='_get_post_karma_rights' args: 'Can Moderate'
  • can_post Boolean
    compute='_get_post_karma_rights' args: 'Can Automatically be Validated'
  • can_unlink Boolean
    compute='_get_post_karma_rights' args: 'Can Unlink'
  • can_upvote Boolean
    compute='_get_post_karma_rights' args: 'Can Upvote'
  • can_view Boolean
    compute='_get_post_karma_rights' search='_search_can_view' args: 'Can View'
  • child_count Integer
    compute='_get_child_count' store=True args: 'Number of answers'
  • child_ids One2many → forum.post
    string='Answers' args: 'forum.post', 'parent_id'
  • closed_date Datetime
    readonly=True args: 'Closed on'
  • closed_reason_id Many2one → forum.post.reason
    string='Reason' args: 'forum.post.reason'
  • closed_uid Many2one → res.users
    index=True string='Closed by' args: 'res.users'
  • content Html
    strip_style=True args: 'Content'
  • content_link Char
    help='URL of Link Articles' args: 'URL'
  • create_date Datetime
    index=True readonly=True args: 'Asked on'
  • create_uid Many2one → res.users
    index=True readonly=True string='Created by' args: 'res.users'
  • favourite_count Integer
    compute='_get_favorite_count' store=True args: 'Favorite Count'
  • favourite_ids Many2many → res.users
    string='Favourite' args: 'res.users'
  • flag_user_id Many2one → res.users
    string='Flagged by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • has_validated_answer Boolean
    compute='_get_has_validated_answer' store=True args: 'Is answered'
  • is_correct Boolean
    help='Correct answer or answer accepted' args: 'Correct'
  • karma_accept Integer
    compute='_get_post_karma_rights' args: 'Convert comment to answer'
  • karma_close Integer
    compute='_get_post_karma_rights' args: 'Karma to close'
  • karma_comment Integer
    compute='_get_post_karma_rights' args: 'Karma to comment'
  • karma_comment_convert Integer
    compute='_get_post_karma_rights' args: 'Karma to convert comment to answer'
  • karma_edit Integer
    compute='_get_post_karma_rights' args: 'Karma to edit'
  • karma_flag Integer
    compute='_get_post_karma_rights' args: 'Flag a post as offensive'
  • karma_unlink Integer
    compute='_get_post_karma_rights' args: 'Karma to unlink'
  • moderator_id Many2one → res.users
    readonly=True string='Reviewed by' args: 'res.users'
  • name Char
    args: 'Title'
  • parent_id Many2one → forum.post
    ondelete='cascade' string='Question' args: 'forum.post'
  • plain_content Text
    compute='_get_plain_content' store=True args: 'Plain Content'
  • post_type Selection
    default='question' required=True string='Type' args: [('question', 'Question'), ('link', 'Article'), ('discussion', 'Discussion')]
  • relevancy Float
    compute='_compute_relevancy' store=True args: 'Relevance'
  • self_reply Boolean
    compute='_is_self_reply' store=True args: 'Reply to own question'
  • state Selection
    default='active' string='Status' args: [('active', 'Active'), ('pending', 'Waiting Validation'), ('close', 'Close'), ('offensive', 'Offensive'), ('flagged', 'Flagged')]
  • tag_ids Many2many → forum.tag
    string='Tags' args: 'forum.tag', 'forum_tag_rel', 'forum_id', 'forum_tag_id'
  • uid_has_answered Boolean
    compute='_get_uid_has_answered' args: 'Has Answered'
  • user_favourite Boolean
    compute='_get_user_favourite' args: 'Is Favourite'
  • user_vote Integer
    compute='_get_user_vote' args: 'My Vote'
  • views Integer
    default=0 args: 'Number of Views'
  • vote_count Integer
    compute='_get_vote_count' store=True args: 'Votes'
  • vote_ids One2many → forum.post.vote
    string='Votes' args: 'forum.post.vote', 'post_id'
  • website_message_ids One2many → mail.message
    domain=<expr> help='Comments on forum post' string='Post Messages' args: 'mail.message', 'res_id'
  • write_date Datetime
    index=True readonly=True args: 'Update on'
  • write_uid Many2one → res.users
    index=True readonly=True string='Updated by' args: 'res.users'
Public methods (20)
  • bump(self)
    @api.multi
    Bump a question: trigger a write_date by writing on a dummy bump_date field. One cannot bump a question more than once every 10 days.
  • check_mail_message_access(self, res_ids, operation, model_name=None)
    @api.model
  • close(self, reason_id)
    @api.multi
  • convert_answer_to_comment(self)
    @api.one
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, message_id, default=None)
    @api.model
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, vals)
    @api.model
  • flag(self)
    @api.one
  • get_access_action(self)
    @api.multi
    Override method that generated the link to access the document. Instead of the classic form view, redirect to the post on the website directly
  • mark_as_offensive(self, reason_id)
    @api.one
  • message_post(self, cr, uid, thread_id, message_type='notification', subtype=None, context=None, **kwargs)
    @api.cr_uid_ids_context
  • name_get(self)
    @api.multi@api.depends('name', 'post_type')
  • post_notification(self)
    @api.multi
  • refuse(self)
    @api.one
  • reopen(self)
    @api.multi
  • set_viewed(self)
    @api.multi
  • unlink(self)
    @api.multi
  • unlink_comment(self, message_id)
    @api.one
  • validate(self)
    @api.one
  • vote(self, upvote=True)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (2)
  • name Char
    required=True string='Closing Reason' translate=True
  • reason_type Char
    string='Reason Type'
Public methods (0)

No public methods.

New fields (6)
  • create_date Datetime
    index=True readonly=True args: 'Create Date'
  • forum_id Many2one → forum.forum
    related='post_id.forum_id' store=True string='Forum' args: 'forum.forum'
  • post_id Many2one → forum.post
    ondelete='cascade' required=True string='Post' args: 'forum.post'
  • recipient_id Many2one → res.users
    related='post_id.create_uid' store=True string='To' args: 'res.users'
  • user_id Many2one → res.users
    default=<expr> required=True string='User' args: 'res.users'
  • vote Selection
    default='1' required=True string='Vote' args: [('1', '1'), ('-1', '-1'), ('0', '0')]
Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, values)
    @api.multi

New fields (5)
  • create_uid Many2one → res.users
    readonly=True string='Created by' args: 'res.users'
  • forum_id Many2one → forum.forum
    required=True string='Forum' args: 'forum.forum'
  • name Char
    required=True args: 'Name'
  • post_ids Many2many → forum.post
    string='Posts' args: 'forum.post', 'forum_tag_rel', 'forum_tag_id', 'forum_id'
  • posts_count Integer
    compute='_get_posts_count' store=True args: 'Number of Posts'
Public methods (0)

No public methods.

New fields (1)
  • level Selection
    string='Forum Badge Level' args: [('bronze', 'bronze'), ('silver', 'silver'), ('gold', 'gold')]
Public methods (0)

No public methods.

New fields (1)
  • level Selection
    related='badge_id.level' store=True string='Forum Badge Level' args: [('bronze', 'bronze'), ('silver', 'silver'), ('gold', 'gold')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (6)
  • badge_ids One2many → gamification.badge.user
    copy=False string='Badges' args: 'gamification.badge.user', 'user_id'
  • bronze_badge Integer
    compute='_get_user_badge_level' args: 'Bronze badges count'
  • create_date Datetime
    copy=False index=True readonly=True args: 'Create Date'
  • gold_badge Integer
    compute='_get_user_badge_level' args: 'Gold badges count'
  • karma Integer
    default=0 args: 'Karma'
  • silver_badge Integer
    compute='_get_user_badge_level' args: 'Silver badges count'
Public methods (5)
  • add_karma(self, karma)
    @api.multi
  • get_serialised_gamification_summary(self, excluded_categories=None)
    @api.model
  • open_website_url(self)
    @api.multi
  • process_forum_validation_token(self, token, email, forum_id=None, context=None)
    @api.one
  • send_forum_validation_email(self, forum_id=None)
    @api.one
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/8.0/website_forum
VERSION
VERSION 1.0
CATEGORY
CATEGORYWebsite
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSOdoo Translation Bot, Turkesh Patel (Open ERP), Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, Christophe Simonis, Xavier Morel, Simon Lejeune, Nicolas Lempereur, Richard Mathot, Géry Debongnie, ged-odoo, Yogesh Parekh, Jeremy Kersten, Sunil Sharma (OpenERP), --global, Mantavya Gajjar, Sunil Sharma, Hitesh Trivedi
WEBSITE
WEBSITEhttps://www.odoo.com/page/community-builder
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:40
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - auth_signup
    - base_setup
    - base
    - web_kanban
    - web
    - email_template
    - mail
    - gamification
    - web_kanban_gauge
    - website_mail
    - website
    - share
    - website_partner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Ask questions, get answers, no distractions
        

Code Analysis

Views touched (36)
XML IDNameModelTypeStatus
404 404 ir.ui.view qweb New
ask_question ask_question ir.ui.view qweb New
assets_editor Forum Editor ir.ui.view qweb Inherits website.assets_editor
assets_frontend website_forum assets ir.ui.view qweb Inherits website.assets_frontend
badge badge ir.ui.view qweb New
badge_user badge_user ir.ui.view qweb New
close_question close_question ir.ui.view qweb New
contact Forum Contact Widget ir.ui.view qweb Inherits base.contact
content_new_forum content_new_forum ir.ui.view qweb Inherits website.user_navbar
display_post display_post ir.ui.view qweb New
display_post_answer display_post_answer ir.ui.view qweb New
edit_post edit_post ir.ui.view qweb New
edit_profile edit_profile ir.ui.view qweb New
faq faq ir.ui.view qweb New
forum_all forum_all ir.ui.view qweb New
forum_index Forum ir.ui.view qweb New
header Forum Index ir.ui.view qweb New
header_footer_custom Footer Questions Link ir.ui.view qweb Inherits website.footer_default
link_button link_button ir.ui.view qweb New
post_answer post_answer ir.ui.view qweb New
post_comment post_comment ir.ui.view qweb New
post_description_full Question Navigation ir.ui.view qweb New
private_profile private_profile ir.ui.view qweb New
tag tag ir.ui.view qweb New
user_badges user_badges ir.ui.view qweb New
user_detail_full user_detail_full ir.ui.view qweb New
user_votes user_votes ir.ui.view qweb New
users users ir.ui.view qweb New
view_forum_forum_form forum.forum.form forum.forum form New
view_forum_forum_list forum.forum.list forum.forum tree New
view_forum_post_form forum.post.form forum.post form New
view_forum_post_list forum.post.list forum.post tree New
view_forum_post_search forum.post.search forum.post search New
view_users_form_forum res.users.form.forum res.users field Inherits base.view_users_form
view_users_form_simple_modif_forum res.users.preferences.form res.users group Inherits base.view_users_form_simple_modif
vote vote ir.ui.view qweb New
Models touched (8)

New fields (0)

No new fields.

Public methods (2)
  • create(self, cr, uid, values, context=None)
  • init(self, cr)
    Add forum uuid for user email validation.

New fields (0)

No new fields.

Public methods (13)
  • check_mail_message_access(self, cr, uid, mids, operation, model_obj=None, context=None)
  • close(self, cr, uid, ids, reason_id, context=None)
  • convert_answer_to_comment(self, cr, uid, id, context=None)
    Tools to convert an answer (forum.post) to a comment (mail.message). The original post is unlinked and a new comment is posted on the question using the post create_uid as the comment's author.
  • convert_comment_to_answer(self, cr, uid, message_id, default=None, context=None)
    Tool to convert a comment (mail.message) into an answer (forum.post). The original comment is unlinked and a new answer from the comment's author is created. Nothing is done if the comment's author already answered the question.
  • create(self, cr, uid, vals, context=None)
  • message_post(self, cr, uid, thread_id, type='notification', subtype=None, context=None, **kwargs)
    @api.cr_uid_ids_context
  • name_get(self, cr, uid, ids, context=None)
  • reopen(self, cr, uid, ids, context=None)
  • set_viewed(self, cr, uid, ids, context=None)
  • unlink(self, cr, uid, ids, context=None)
  • unlink_comment(self, cr, uid, id, message_id, context=None)
  • vote(self, cr, uid, ids, upvote=True, context=None)
  • write(self, cr, uid, ids, vals, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • create(self, cr, uid, vals, context=None)
  • write(self, cr, uid, ids, values, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (4)
  • add_karma(self, cr, uid, ids, karma, context=None)
  • get_serialised_gamification_summary(self, cr, uid, excluded_categories=None, context=None)
  • process_forum_validation_token(self, cr, uid, token, user_id, email, forum_id=None, context=None)
  • send_forum_validation_email(self, cr, uid, user_id, forum_id=None, context=None)