Web Form Banner

web_form_banner
REPOSITORY
REPOSITORYOCA/web
GIT
GIThttps://github.com/OCA/web.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/web/tree/19.0/web_form_banner
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYWeb
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Quartile
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Quartile
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Aungkokolin1997
WEBSITE
WEBSITEhttps://github.com/OCA/web
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:46
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The module adds configurable banners for backend **form** views. Define
rules per model (and optionally per view) to show context-aware alerts
with a chosen severity (info/warning/danger).

Messages can be plain text with \${placeholders} or fully custom HTML;
visibility, severity, and values are computed server-side via a safe
Python expression.

Banners are injected just before or after a target node (default:
//sheet) and refresh on form load/save/reload.

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
view_web_form_banner_rule_form web.form.banner.rule.form web.form.banner.rule form New
view_web_form_banner_rule_search web.form.banner.rule.search web.form.banner.rule search New
view_web_form_banner_rule_tree web.form.banner.rule.tree web.form.banner.rule list New
Models touched (2)

New fields (0)

No new fields.

Public methods (1)
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model

New fields (13)
  • active Boolean
    default=True
  • message Text
    help='Template with ${placeholders}. If not HTML, it will be escaped.' translate=True
  • message_is_html Boolean
    help="If checked, 'message' is treated as raw HTML (no escaping). If not checked, the rendered text is escaped and newlines become <br/>." args: 'HTML'
  • message_value_code Text
    help='Python expression evaluated server-side. Must return a dict.\nKeys: visible(bool, default True), severity(str), values(dict for ${...} in \nmessage), and/or html(str) to override template rendering.'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model'
  • model_name Char
    readonly=True related='model_id.model' store=True string='Model Name'
  • name Char
    required=True
  • position Selection
    default='before' help='Where to insert the placeholder relative to the first matched node.' required=True args: [('before', 'Before target'), ('after', 'After target')]
  • sequence Integer
    default=10
  • severity Selection
    default='danger' help='Default severity level, can be overridden per-record.' required=True string='Default Severity' args: [('info', 'Info'), ('warning', 'Warning'), ('danger', 'Danger')]
  • target_xpath Char
    default='//sheet' help='XPath of the node to insert the banner.' args: 'Target XPath'
  • trigger_field_ids Many2many → ir.model.fields
    domain="[('model', '=', model_name)]" help='If set, the banner recomputes live when any of these fields change.' string='Trigger Fields' args: 'ir.model.fields', 'web_form_banner_rule_trigger_field_rel'
  • view_ids Many2many → ir.ui.view
    domain="[('type', '=', 'form'), ('model', '=', model_name)]" help='Form view where the banner should be injected.' string='Views' args: 'ir.ui.view'
Public methods (1)
  • compute_message(self, rule_id, model, res_id, form_vals=None)
    @api.model
    Return {visible, severity, html} for the given rule and record.
REPOSITORY
REPOSITORYOCA/web
GIT
GIThttps://github.com/OCA/web.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/web/tree/18.0/web_form_banner
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYWeb
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Quartile
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Quartile
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Aungkokolin1997, nobuQuartile
WEBSITE
WEBSITEhttps://github.com/OCA/web
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:07
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The module adds configurable banners for backend **form** views. Define
rules per model (and optionally per view) to show context-aware alerts
with a chosen severity (info/warning/danger).

Messages can be plain text with \${placeholders} or fully custom HTML;
visibility, severity, and values are computed server-side via a safe
Python expression.

Banners are injected just before or after a target node (default:
//sheet) and refresh on form load/save/reload.

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
view_web_form_banner_rule_form web.form.banner.rule.form web.form.banner.rule form New
view_web_form_banner_rule_search web.form.banner.rule.search web.form.banner.rule search New
view_web_form_banner_rule_tree web.form.banner.rule.tree web.form.banner.rule list New
Models touched (2)

New fields (0)

No new fields.

Public methods (1)
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model

New fields (13)
  • active Boolean
    default=True
  • message Text
    help='Template with ${placeholders}. If not HTML, it will be escaped.' translate=True
  • message_is_html Boolean
    help="If checked, 'message' is treated as raw HTML (no escaping). If not checked, the rendered text is escaped and newlines become <br/>." args: 'HTML'
  • message_value_code Text
    help='Python expression evaluated server-side. Must return a dict.\nKeys: visible(bool, default True), severity(str), values(dict for ${...} in \nmessage), and/or html(str) to override template rendering.'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model'
  • model_name Char
    readonly=True related='model_id.model' store=True string='Model Name'
  • name Char
    required=True
  • position Selection
    default='before' help='Where to insert the placeholder relative to the first matched node.' required=True args: [('before', 'Before target'), ('after', 'After target')]
  • sequence Integer
    default=10
  • severity Selection
    default='danger' help='Default severity level, can be overridden per-record.' required=True string='Default Severity' args: [('info', 'Info'), ('warning', 'Warning'), ('danger', 'Danger')]
  • target_xpath Char
    default='//sheet' help='XPath of the node to insert the banner.' args: 'Target XPath'
  • trigger_field_ids Many2many → ir.model.fields
    domain="[('model', '=', model_name)]" help='If set, the banner recomputes live when any of these fields change.' string='Trigger Fields' args: 'ir.model.fields', 'web_form_banner_rule_trigger_field_rel'
  • view_ids Many2many → ir.ui.view
    domain="[('type', '=', 'form'), ('model', '=', model_name)]" help='Form view where the banner should be injected.' string='Views' args: 'ir.ui.view'
Public methods (1)
  • compute_message(self, rule_id, model, res_id, form_vals=None)
    @api.model
    Return {visible, severity, html} for the given rule and record.
REPOSITORY
REPOSITORYOCA/web
GIT
GIThttps://github.com/OCA/web.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/web/tree/16.0/web_form_banner
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYWeb
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Quartile
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Quartile
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Aungkokolin1997
WEBSITE
WEBSITEhttps://github.com/OCA/web
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:54
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
view_web_form_banner_rule_form web.form.banner.rule.form web.form.banner.rule form New
view_web_form_banner_rule_search web.form.banner.rule.search web.form.banner.rule search New
view_web_form_banner_rule_tree web.form.banner.rule.tree web.form.banner.rule tree New
Models touched (2)

New fields (0)

No new fields.

Public methods (1)
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model

New fields (13)
  • active Boolean
    default=True
  • message Text
    help='Template with ${placeholders}. If not HTML, it will be escaped.' translate=True
  • message_is_html Boolean
    help="If checked, 'message' is treated as raw HTML (no escaping). If not checked, the rendered text is escaped and newlines become <br/>." args: 'HTML'
  • message_value_code Text
    help='Python expression evaluated server-side. Must return a dict.\nKeys: visible(bool, default True), severity(str), values(dict for ${...} in \nmessage), and/or html(str) to override template rendering.'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model'
  • model_name Char
    readonly=True related='model_id.model' store=True
  • name Char
    required=True
  • position Selection
    default='before' help='Where to insert the placeholder relative to the first matched node.' required=True args: [('before', 'Before target'), ('after', 'After target')]
  • sequence Integer
    default=10
  • severity Selection
    default='danger' help='Default severity level, can be overridden per-record.' required=True string='Default Severity' args: [('info', 'Info'), ('warning', 'Warning'), ('danger', 'Danger')]
  • target_xpath Char
    default='//sheet' help='XPath of the node to insert the banner.' args: 'Target XPath'
  • trigger_field_ids Many2many → ir.model.fields
    domain="[('model', '=', model_name)]" help='If set, the banner recomputes live when any of these fields change.' string='Trigger Fields' args: 'ir.model.fields', 'web_form_banner_rule_trigger_field_rel'
  • view_ids Many2many → ir.ui.view
    domain="[('type', '=', 'form'), ('model', '=', model_name)]" help='Form view where the banner should be injected.' string='Views' args: 'ir.ui.view'
Public methods (1)
  • compute_message(self, rule_id, model, res_id, form_vals=None)
    @api.model
    Return {visible, severity, html} for the given rule and record.
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/web
PULL REQUEST
PULL REQUEST[15.0][MIG] web_form_banner: Migration to 15.0 (#3287)
STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/web
PULL REQUEST
PULL REQUEST[17.0][MIG] web_form_banner: Migration to 17.0 (#3305)