Skip to content

Commit eca678a

Browse files
[MIG] web_form_banner: Migration to 15.0
1 parent 37b8bb4 commit eca678a

File tree

5 files changed

+49
-47
lines changed

5 files changed

+49
-47
lines changed

web_form_banner/__manifest__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,22 @@
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
33
{
44
"name": "Web Form Banner",
5-
"version": "12.0.1.0.0",
5+
"version": "15.0.1.0.0",
66
"category": "Web",
77
"author": "Quartile, Odoo Community Association (OCA)",
88
"website": "https://github.com/OCA/web",
99
"license": "AGPL-3",
1010
"depends": ["web"],
1111
"data": [
1212
"security/ir.model.access.csv",
13-
"views/assets.xml",
1413
"views/web_form_banner_rule_views.xml",
1514
],
15+
"assets": {
16+
"web.assets_backend": [
17+
"web_form_banner/static/src/js/*.esm.js",
18+
"web_form_banner/static/src/scss/*.scss",
19+
],
20+
},
1621
"demo": ["demo/web_form_banner_rule_demo.xml"],
1722
"installable": True,
1823
}

web_form_banner/models/web_form_banner_rule.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
# Copyright 2025 Quartile (https://www.quartile.co)
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
33

4-
import datetime as dt
5-
import time
64
from functools import lru_cache
75
from string import Template
86

@@ -13,9 +11,8 @@
1311

1412
from odoo import _, api, fields, models
1513
from odoo.exceptions import ValidationError
16-
from odoo.tools import html_escape
14+
from odoo.tools import html_escape, safe_eval
1715
from odoo.tools.float_utils import float_compare, float_is_zero, float_round
18-
from odoo.tools.safe_eval import safe_eval
1916

2017

2118
class WebFormBannerRule(models.Model):
@@ -39,7 +36,6 @@ class WebFormBannerRule(models.Model):
3936
)
4037
position = fields.Selection(
4138
[("before", "Before target"), ("after", "After target")],
42-
string="Position",
4339
default="before",
4440
required=True,
4541
help="Where to insert the placeholder relative to the first matched node.",
@@ -75,7 +71,7 @@ def _check_target_xpath(self):
7571
try:
7672
etree.XPath(xp or "//sheet")
7773
except (etree.XPathSyntaxError, etree.XPathEvalError) as e:
78-
raise ValidationError(_("Invalid XPath:\n%s") % e)
74+
raise ValidationError(_("Invalid XPath:\n%s") % e) from e
7975

8076
@api.model
8177
def _build_form_url(self, rec):
@@ -95,8 +91,8 @@ def _build_form_url(self, rec):
9591
def _banner_base_eval_ctx_static(self):
9692
# Only static, import-heavy items
9793
return {
98-
"time": time,
99-
"datetime": dt,
94+
"time": safe_eval.time,
95+
"datetime": safe_eval.datetime,
10096
"dateutil": {
10197
"parser": dateparse,
10298
"relativedelta": relativedelta,
@@ -143,10 +139,10 @@ def compute_message(self, rule_id, model, res_id):
143139
code = rule.message_value_code.strip()
144140
try:
145141
# 1) try single-expression dict
146-
out = safe_eval(code, eval_ctx, mode="eval") or {}
142+
out = safe_eval.safe_eval(code, eval_ctx, mode="eval") or {}
147143
except Exception:
148144
# 2) allow multi-line; expect `result` to be set
149-
safe_eval(code, eval_ctx, mode="exec", nocopy=True)
145+
safe_eval.safe_eval(code, eval_ctx, mode="exec", nocopy=True)
150146
out = eval_ctx.get("result") or {}
151147
if not isinstance(out, dict):
152148
return {"visible": False}

web_form_banner/static/src/js/web_form_banner.js renamed to web_form_banner/static/src/js/web_form_banner.esm.js

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,29 @@
11
odoo.define("web_form_banner.save_plus_load", function (require) {
2-
"use strict";
32
var rpc = require("web.rpc");
43
var FormController = require("web.FormController");
54

5+
function placeBannerAsFullRow($b, position) {
6+
var $td = $b.closest("td");
7+
var $tr = $td.closest("tr");
8+
if (!$tr.length) {
9+
return false;
10+
}
11+
// Create new row spanning both label+value columns
12+
var $row = $('<tr class="o_wfb_fullrow"><td colspan="2"></td></tr>');
13+
$row.find("td").append($b); // Detach + reinsert banner
14+
if (position === "before") {
15+
$tr.before($row);
16+
} else {
17+
$tr.after($row);
18+
}
19+
return true;
20+
}
21+
622
function refreshBanners(ctrl) {
723
var $banners = ctrl.$('.o_form_view div[role="alert"][data-rule-id]');
824
var state = ctrl.model.get(ctrl.handle);
925
var resId = state && state.res_id;
1026
if (!resId || !$banners.length) return;
11-
1227
$banners.each(function () {
1328
var $b = $(this);
1429
var ruleId = parseInt($b.data("rule-id") || $b.data("wfb-rule-id"));
@@ -35,31 +50,34 @@ odoo.define("web_form_banner.save_plus_load", function (require) {
3550
} else {
3651
$b.html(html);
3752
}
53+
if ($b.closest("table.o_group").length) {
54+
var pos = $b.data("insert-pos") || "after";
55+
placeBannerAsFullRow($b, pos);
56+
}
3857
$b.show();
3958
});
4059
});
4160
}
4261

62+
function withRefresh(ctrl, superFn, args) {
63+
var p = superFn.apply(ctrl, args);
64+
return p.then(function () {
65+
refreshBanners(ctrl);
66+
});
67+
}
68+
4369
FormController.include({
4470
start: function () {
45-
var p = this._super.apply(this, arguments);
46-
var self = this;
47-
return p.then(function () {
48-
refreshBanners(self);
49-
});
71+
return withRefresh(this, this._super, arguments);
5072
},
5173
reload: function () {
52-
var p = this._super.apply(this, arguments);
53-
var self = this;
54-
return p.then(function () {
55-
refreshBanners(self);
56-
});
74+
return withRefresh(this, this._super, arguments);
5775
},
5876
saveRecord: function () {
59-
var self = this;
60-
return this._super.apply(this, arguments).then(function () {
61-
refreshBanners(self);
62-
});
77+
return withRefresh(this, this._super, arguments);
78+
},
79+
update: function (params, options) {
80+
return withRefresh(this, this._super, arguments);
6381
},
6482
});
6583
});

web_form_banner/tests/test_web_form_banner.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33

44
from lxml import etree
55

6-
from odoo.tests.common import SavepointCase, tagged
6+
from odoo.tests.common import TransactionCase, tagged
77

88

99
@tagged("post_install", "-at_install")
10-
class TestFieldsViewGetPartnerBanner(SavepointCase):
10+
class TestFieldsViewGetPartnerBanner(TransactionCase):
1111
@classmethod
1212
def setUpClass(cls):
1313
super().setUpClass()
@@ -23,7 +23,6 @@ def setUpClass(cls):
2323
"but none was found. Ensure demo data is loaded."
2424
)
2525
cls.partner_form_view = cls.env.ref("base.view_partner_form")
26-
2726
cls.p_len3 = cls.Partner.create({"name": "Bob"}) # 3
2827
cls.p_len12 = cls.Partner.create({"name": "Yoshi Tashiro"}) # 12
2928
cls.p_len22 = cls.Partner.create({"name": "Professor Charles Xavier"}) # 22

web_form_banner/views/assets.xml

Lines changed: 0 additions & 16 deletions
This file was deleted.

0 commit comments

Comments
 (0)