Skip to content

Commit 5f8719f

Browse files
committed
[MIG] uom
1 parent 756794f commit 5f8719f

9 files changed

Lines changed: 514 additions & 1 deletion

File tree

docsource/modules180-190.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1110,7 +1110,7 @@ Module coverage 18.0 -> 19.0
11101110
+---------------------------------------------------+----------------------+-------------------------------------------------+
11111111
| transifex | |No DB layout changes. |
11121112
+---------------------------------------------------+----------------------+-------------------------------------------------+
1113-
| uom | | |
1113+
| uom | |Done |
11141114
+---------------------------------------------------+----------------------+-------------------------------------------------+
11151115
| utm | | |
11161116
+---------------------------------------------------+----------------------+-------------------------------------------------+
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
<?xml version='1.0' encoding='utf-8'?>
2+
<odoo>
3+
<record id="product_uom_cm" model="uom.uom">
4+
<field name="factor"/>
5+
<field name="active" eval="False"/>
6+
<field name="relative_factor" eval="10"/>
7+
<field name="relative_uom_id" ref="uom.product_uom_millimeter"/>
8+
</record>
9+
<record id="product_uom_cubic_foot" model="uom.uom">
10+
<field name="active" eval="False"/>
11+
<field name="relative_factor" eval="1728"/>
12+
<field name="relative_uom_id" ref="uom.product_uom_cubic_inch"/>
13+
</record>
14+
<record id="product_uom_cubic_inch" model="uom.uom">
15+
<field name="factor"/>
16+
<field name="active" eval="False"/>
17+
<field name="relative_factor" eval="0.0163871"/>
18+
<field name="relative_uom_id" ref="uom.product_uom_litre"/>
19+
</record>
20+
<record id="product_uom_cubic_meter" model="uom.uom">
21+
<field name="active" eval="False"/>
22+
<field name="relative_factor">1000</field>
23+
<field name="relative_uom_id" ref="uom.product_uom_litre"/>
24+
</record>
25+
<record id="product_uom_day" model="uom.uom">
26+
<field name="factor"/>
27+
<field name="relative_factor" eval="8.0"/>
28+
<field name="relative_uom_id" ref="uom.product_uom_hour"/>
29+
</record>
30+
<record id="product_uom_dozen" model="uom.uom">
31+
<field name="active" eval="False"/>
32+
<field name="relative_factor" eval="12"/>
33+
<field name="relative_uom_id" ref="uom.product_uom_unit"/>
34+
</record>
35+
<record id="product_uom_floz" model="uom.uom">
36+
<field name="factor"/>
37+
<field name="active" eval="False"/>
38+
<field name="relative_factor" eval="0.0295735"/>
39+
<field name="relative_uom_id" ref="uom.product_uom_litre"/>
40+
</record>
41+
<record id="product_uom_foot" model="uom.uom">
42+
<field name="factor"/>
43+
<field name="active" eval="False"/>
44+
<field name="relative_factor" eval="12"/>
45+
<field name="relative_uom_id" ref="uom.product_uom_inch"/>
46+
</record>
47+
<record id="product_uom_gal" model="uom.uom">
48+
<field name="active" eval="False"/>
49+
<field name="relative_factor" eval="4"/>
50+
<field name="relative_uom_id" ref="uom.product_uom_qt"/>
51+
</record>
52+
<record id="product_uom_gram" model="uom.uom">
53+
<field name="factor"/>
54+
<field name="relative_factor" eval="1"/>
55+
</record>
56+
<record id="product_uom_hour" model="uom.uom">
57+
<field name="factor"/>
58+
<field name="relative_factor" eval="1"/>
59+
</record>
60+
<record id="product_uom_inch" model="uom.uom">
61+
<field name="factor"/>
62+
<field name="active" eval="False"/>
63+
<field name="relative_factor" eval="2.54"/>
64+
<field name="relative_uom_id" ref="uom.product_uom_cm"/>
65+
</record>
66+
<record id="product_uom_kgm" model="uom.uom">
67+
<field name="factor"/>
68+
<field name="relative_factor" eval="1000"/>
69+
<field name="relative_uom_id" ref="uom.product_uom_gram"/>
70+
</record>
71+
<record id="product_uom_km" model="uom.uom">
72+
<field name="active" eval="False"/>
73+
<field name="relative_factor" eval="1000"/>
74+
<field name="relative_uom_id" ref="uom.product_uom_meter"/>
75+
</record>
76+
<record id="product_uom_lb" model="uom.uom">
77+
<field name="factor"/>
78+
<field name="active" eval="False"/>
79+
<field name="relative_factor" eval="16"/>
80+
<field name="relative_uom_id" ref="uom.product_uom_oz"/>
81+
</record>
82+
<record id="product_uom_litre" model="uom.uom">
83+
<field name="factor"/>
84+
<field name="relative_factor">1000</field>
85+
<field name="relative_uom_id" ref="uom.product_uom_milliliter"/>
86+
</record>
87+
<record id="product_uom_meter" model="uom.uom">
88+
<field name="factor"/>
89+
<field name="relative_factor" eval="100.0"/>
90+
<field name="relative_uom_id" ref="uom.product_uom_cm"/>
91+
</record>
92+
<record id="product_uom_mile" model="uom.uom">
93+
<field name="active" eval="False"/>
94+
<field name="relative_factor" eval="1760"/>
95+
<field name="relative_uom_id" ref="uom.product_uom_yard"/>
96+
</record>
97+
<record id="product_uom_millimeter" model="uom.uom">
98+
<field name="factor"/>
99+
<field name="relative_factor" eval="1"/>
100+
</record>
101+
<record id="product_uom_oz" model="uom.uom">
102+
<field name="factor"/>
103+
<field name="active" eval="False"/>
104+
<field name="relative_factor" eval="28.3495"/>
105+
<field name="relative_uom_id" ref="uom.product_uom_gram"/>
106+
</record>
107+
<record id="product_uom_qt" model="uom.uom">
108+
<field name="factor"/>
109+
<field name="active" eval="False"/>
110+
<field name="relative_factor" eval="32"/>
111+
<field name="relative_uom_id" ref="uom.product_uom_floz"/>
112+
</record>
113+
<record id="product_uom_ton" model="uom.uom">
114+
<field name="name">Ton</field>
115+
<field name="relative_factor" eval="1000"/>
116+
<field name="relative_uom_id" ref="uom.product_uom_kgm"/>
117+
</record>
118+
<record id="product_uom_unit" model="uom.uom">
119+
<field name="factor"/>
120+
<field name="relative_factor" eval="1.0"/>
121+
</record>
122+
<record id="product_uom_yard" model="uom.uom">
123+
<field name="factor"/>
124+
<field name="active" eval="False"/>
125+
<field name="relative_factor" eval="3"/>
126+
<field name="relative_uom_id" ref="uom.product_uom_foot"/>
127+
</record>
128+
</odoo>
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
<?xml version='1.0' encoding='utf-8'?>
2+
<odoo>
3+
<record id="product_uom_cm" model="uom.uom">
4+
<field name="relative_factor" eval="10"/>
5+
<field name="relative_uom_id" ref="uom.product_uom_millimeter"/>
6+
</record>
7+
<record id="product_uom_cubic_foot" model="uom.uom">
8+
<field name="relative_factor" eval="1728"/>
9+
<field name="relative_uom_id" ref="uom.product_uom_cubic_inch"/>
10+
</record>
11+
<record id="product_uom_cubic_inch" model="uom.uom">
12+
<field name="relative_factor" eval="0.0163871"/>
13+
<field name="relative_uom_id" ref="uom.product_uom_litre"/>
14+
</record>
15+
<record id="product_uom_cubic_meter" model="uom.uom">
16+
<field name="relative_factor">1000</field>
17+
<field name="relative_uom_id" ref="uom.product_uom_litre"/>
18+
</record>
19+
<record id="product_uom_day" model="uom.uom">
20+
<field name="relative_factor" eval="8.0"/>
21+
<field name="relative_uom_id" ref="uom.product_uom_hour"/>
22+
</record>
23+
<record id="product_uom_dozen" model="uom.uom">
24+
<field name="relative_factor" eval="12"/>
25+
<field name="relative_uom_id" ref="uom.product_uom_unit"/>
26+
</record>
27+
<record id="product_uom_floz" model="uom.uom">
28+
<field name="relative_factor" eval="0.0295735"/>
29+
<field name="relative_uom_id" ref="uom.product_uom_litre"/>
30+
</record>
31+
<record id="product_uom_foot" model="uom.uom">
32+
<field name="relative_factor" eval="12"/>
33+
<field name="relative_uom_id" ref="uom.product_uom_inch"/>
34+
</record>
35+
<record id="product_uom_gal" model="uom.uom">
36+
<field name="relative_factor" eval="4"/>
37+
<field name="relative_uom_id" ref="uom.product_uom_qt"/>
38+
</record>
39+
<record id="product_uom_gram" model="uom.uom">
40+
<field name="relative_factor" eval="1"/>
41+
</record>
42+
<record id="product_uom_hour" model="uom.uom">
43+
<field name="relative_factor" eval="1"/>
44+
</record>
45+
<record id="product_uom_inch" model="uom.uom">
46+
<field name="relative_factor" eval="2.54"/>
47+
<field name="relative_uom_id" ref="uom.product_uom_cm"/>
48+
</record>
49+
<record id="product_uom_kgm" model="uom.uom">
50+
<field name="relative_factor" eval="1000"/>
51+
<field name="relative_uom_id" ref="uom.product_uom_gram"/>
52+
</record>
53+
<record id="product_uom_km" model="uom.uom">
54+
<field name="relative_factor" eval="1000"/>
55+
<field name="relative_uom_id" ref="uom.product_uom_meter"/>
56+
</record>
57+
<record id="product_uom_lb" model="uom.uom">
58+
<field name="relative_factor" eval="16"/>
59+
<field name="relative_uom_id" ref="uom.product_uom_oz"/>
60+
</record>
61+
<record id="product_uom_litre" model="uom.uom">
62+
<field name="relative_factor">1000</field>
63+
<field name="relative_uom_id" ref="uom.product_uom_milliliter"/>
64+
</record>
65+
<record id="product_uom_meter" model="uom.uom">
66+
<field name="relative_factor" eval="100.0"/>
67+
<field name="relative_uom_id" ref="uom.product_uom_cm"/>
68+
</record>
69+
<record id="product_uom_mile" model="uom.uom">
70+
<field name="relative_factor" eval="1760"/>
71+
<field name="relative_uom_id" ref="uom.product_uom_yard"/>
72+
</record>
73+
<record id="product_uom_millimeter" model="uom.uom">
74+
<field name="relative_factor" eval="1"/>
75+
<field name="factor" eval="1"/>
76+
</record>
77+
<record id="product_uom_oz" model="uom.uom">
78+
<field name="relative_factor" eval="28.3495"/>
79+
<field name="relative_uom_id" ref="uom.product_uom_gram"/>
80+
</record>
81+
<record id="product_uom_qt" model="uom.uom">
82+
<field name="relative_factor" eval="32"/>
83+
<field name="relative_uom_id" ref="uom.product_uom_floz"/>
84+
</record>
85+
<record id="product_uom_ton" model="uom.uom">
86+
<field name="name">Ton</field>
87+
<field name="relative_factor" eval="1000"/>
88+
<field name="relative_uom_id" ref="uom.product_uom_kgm"/>
89+
</record>
90+
<record id="product_uom_unit" model="uom.uom">
91+
<field name="relative_factor" eval="1.0"/>
92+
</record>
93+
<record id="product_uom_yard" model="uom.uom">
94+
<field name="relative_factor" eval="3"/>
95+
<field name="relative_uom_id" ref="uom.product_uom_foot"/>
96+
</record>
97+
</odoo>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# Copyright 2025 Hunki Enterprises BV
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
from openupgradelib import openupgrade
5+
6+
7+
def _uom_relative_uom_id_relative_factor(env):
8+
"""
9+
UOM categories have been obsoleted, UOMs are a tree now with the reference
10+
unit as root and relative_factor giving the ratio to the UOM linked in
11+
relative_uom_id
12+
"""
13+
14+
def has_xmlid(uom):
15+
return env["ir.model.data"].search_count(
16+
[
17+
("model", "=", "uom.uom"),
18+
("res_id", "=", uom.id),
19+
("module", "!=", "__export__"),
20+
]
21+
)
22+
23+
env.cr.execute(
24+
f"""
25+
SELECT
26+
array_agg(id),
27+
array_agg({openupgrade.get_legacy_name("factor")}),
28+
array_agg({openupgrade.get_legacy_name("uom_type")})
29+
FROM
30+
uom_uom
31+
WHERE {openupgrade.get_legacy_name("category_id")} IS NOT NULL
32+
GROUP BY {openupgrade.get_legacy_name("category_id")}
33+
"""
34+
)
35+
for ids, factors, uom_types in env.cr.fetchall():
36+
uoms = env["uom.uom"].browse(ids)
37+
uom2factor = dict(zip(uoms, factors, strict=False))
38+
uom2type = dict(zip(uoms, uom_types, strict=False))
39+
40+
old_reference = uoms.filtered(
41+
lambda x, uom2type=uom2type: uom2type[x] == "reference"
42+
)
43+
44+
for uom in uoms - old_reference:
45+
if has_xmlid(uom):
46+
# uoms with xmlid will be updated by the migration of the module
47+
# providing them
48+
continue
49+
50+
relative_factor = (
51+
uom2factor[uom] if uom2type[uom] == "bigger" else (1 / uom2factor[uom])
52+
)
53+
54+
uom.write(
55+
{
56+
"relative_uom_id": old_reference,
57+
"relative_factor": relative_factor,
58+
}
59+
)
60+
61+
62+
@openupgrade.migrate()
63+
def migrate(env, version):
64+
openupgrade.load_data(env, "uom", "19.0.1.0/noupdate_changes_work.xml")
65+
_uom_relative_uom_id_relative_factor(env)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Copyright 2025 Hunki Enterprises BV
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
from openupgradelib import openupgrade
5+
6+
7+
@openupgrade.migrate()
8+
def migrate(env, version):
9+
openupgrade.copy_columns(
10+
env.cr,
11+
{
12+
"uom_uom": [
13+
("category_id", None, None),
14+
("factor", None, None),
15+
("rounding", None, None),
16+
("uom_type", None, None),
17+
]
18+
},
19+
)
20+
openupgrade.rename_xmlids(
21+
env.cr,
22+
[
23+
("product.decimal_product_uom", "uom.decimal_product_uom"),
24+
("uom.uom_square_foot", "uom.product_uom_square_foot"),
25+
("uom.uom_square_meter", "uom.product_uom_square_meter"),
26+
],
27+
)
28+
# this would be cleaned up after the migration, but we can't have it during
29+
# migration
30+
openupgrade.delete_sql_constraint_safely(
31+
env, "uom", "uom_uom", "factor_reference_is_one"
32+
)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---Models in module 'uom'---
2+
obsolete model uom.category
3+
---Fields in module 'uom'---
4+
uom / uom.category / name (char) : DEL required
5+
uom / uom.category / reference_uom_id (many2one) : DEL relation: uom.uom, stored: False
6+
uom / uom.category / uom_ids (one2many) : DEL relation: uom.uom
7+
uom / uom.uom / _order : _order is now 'sequence, relative_uom_id, id' ('factor DESC, id')
8+
uom / uom.uom / category_id (many2one) : DEL relation: uom.category, required
9+
uom / uom.uom / factor (float) : now a function
10+
uom / uom.uom / parent_path (char) : NEW
11+
uom / uom.uom / related_uom_ids (one2many) : NEW relation: uom.uom
12+
uom / uom.uom / relative_factor (float) : NEW required, hasdefault: default
13+
uom / uom.uom / relative_uom_id (many2one) : NEW relation: uom.uom
14+
uom / uom.uom / rounding (float) : not stored anymore
15+
uom / uom.uom / rounding (float) : now a function
16+
uom / uom.uom / sequence (integer) : NEW hasdefault: compute
17+
uom / uom.uom / uom_type (selection) : DEL required, selection_keys: ['bigger', 'reference', 'smaller']
18+
---XML records in module 'uom'---
19+
NEW decimal.precision: uom.decimal_product_uom [renamed from product module] (noupdate)
20+
DEL ir.actions.act_window: uom.product_uom_categ_form_action
21+
DEL ir.model.access: uom.access_uom_category_manager
22+
DEL ir.model.access: uom.access_uom_category_user
23+
ir.model.constraint: uom.constraint_uom_uom_factor_gt_zero (changed definition: is now 'CHECK (relative_factor!=0)' ('check(factor!=0)'))
24+
DEL ir.model.constraint: uom.constraint_uom_uom_factor_reference_is_one
25+
DEL ir.model.constraint: uom.constraint_uom_uom_rounding_gt_zero
26+
DEL ir.ui.view: uom.product_uom_categ_form_view
27+
DEL ir.ui.view: uom.product_uom_categ_tree_view
28+
DEL ir.ui.view: uom.uom_categ_view_search
29+
DEL uom.category: uom.product_uom_categ_kgm (noupdate)
30+
DEL uom.category: uom.product_uom_categ_unit (noupdate)
31+
DEL uom.category: uom.product_uom_categ_vol (noupdate)
32+
DEL uom.category: uom.uom_categ_length (noupdate)
33+
DEL uom.category: uom.uom_categ_surface (noupdate)
34+
DEL uom.category: uom.uom_categ_wtime (noupdate)
35+
NEW uom.uom: uom.product_uom_milliliter (noupdate)
36+
NEW uom.uom: uom.product_uom_pack_6 (noupdate)
37+
NEW uom.uom: uom.product_uom_square_foot (noupdate)
38+
NEW uom.uom: uom.product_uom_square_meter (noupdate)
39+
DEL uom.uom: uom.uom_square_foot (noupdate)
40+
DEL uom.uom: uom.uom_square_meter (noupdate)

0 commit comments

Comments
 (0)