Skip to content

Commit 1e78c6b

Browse files
[MIG] web_form_banner: Migration to 15.0
1 parent 2b79148 commit 1e78c6b

File tree

5 files changed

+44
-43
lines changed

5 files changed

+44
-43
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: 1 addition & 6 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

@@ -39,7 +37,6 @@ class WebFormBannerRule(models.Model):
3937
)
4038
position = fields.Selection(
4139
[("before", "Before target"), ("after", "After target")],
42-
string="Position",
4340
default="before",
4441
required=True,
4542
help="Where to insert the placeholder relative to the first matched node.",
@@ -75,7 +72,7 @@ def _check_target_xpath(self):
7572
try:
7673
etree.XPath(xp or "//sheet")
7774
except (etree.XPathSyntaxError, etree.XPathEvalError) as e:
78-
raise ValidationError(_("Invalid XPath:\n%s") % e)
75+
raise ValidationError(_("Invalid XPath:\n%s") % e) from e
7976

8077
@api.model
8178
def _build_form_url(self, rec):
@@ -95,8 +92,6 @@ def _build_form_url(self, rec):
9592
def _banner_base_eval_ctx_static(self):
9693
# Only static, import-heavy items
9794
return {
98-
"time": time,
99-
"datetime": dt,
10095
"dateutil": {
10196
"parser": dateparse,
10297
"relativedelta": relativedelta,

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)