| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/web |
| GIT | |
| GIT | https://github.com/OCA/web.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/web/tree/19.0/web_form_banner |
| VERSION | |
| VERSION | 1.0.0 |
| CATEGORY | |
| CATEGORY | Web |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Quartile |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Quartile |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, oca-ci, Aungkokolin1997 |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/web |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
No new fields.
Public methods (1)get_view(self, view_id=None, view_type='form', **options)
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'
compute_message(self, rule_id, model, res_id, form_vals=None)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/web |
| GIT | |
| GIT | https://github.com/OCA/web.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/web/tree/18.0/web_form_banner |
| VERSION | |
| VERSION | 1.1.0 |
| CATEGORY | |
| CATEGORY | Web |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Quartile |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Quartile |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, oca-ci, Aungkokolin1997, nobuQuartile |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/web |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
No new fields.
Public methods (1)get_view(self, view_id=None, view_type='form', **options)
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'
compute_message(self, rule_id, model, res_id, form_vals=None)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/web |
| GIT | |
| GIT | https://github.com/OCA/web.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/web/tree/16.0/web_form_banner |
| VERSION | |
| VERSION | 1.1.0 |
| CATEGORY | |
| CATEGORY | Web |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Quartile |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Quartile |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, oca-ci, Aungkokolin1997 |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/web |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-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 | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 |
No new fields.
Public methods (1)get_view(self, view_id=None, view_type='form', **options)
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'
compute_message(self, rule_id, model, res_id, form_vals=None)
| STATUS | |
|---|---|
| STATUS | Open migration PR - not merged yet for this version |
| REPOSITORY | |
| REPOSITORY | OCA/web |
| PULL REQUEST | |
| PULL REQUEST | [15.0][MIG] web_form_banner: Migration to 15.0 (#3287) |
| STATUS | |
|---|---|
| STATUS | Open migration PR - not merged yet for this version |
| REPOSITORY | |
| REPOSITORY | OCA/web |
| PULL REQUEST | |
| PULL REQUEST | [17.0][MIG] web_form_banner: Migration to 17.0 (#3305) |