Skip to content

Commit c28e73d

Browse files
committed
[16.0][MIG] - attribute_set
[16.0][MIG] - attribute_set
1 parent c233fec commit c28e73d

File tree

8 files changed

+64
-58
lines changed

8 files changed

+64
-58
lines changed

attribute_set/__manifest__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "Attribute Set",
3-
"version": "15.0.1.0.0",
3+
"version": "16.0.1.0.0",
44
"category": "Generic Modules/Others",
55
"license": "AGPL-3",
66
"author": "Akretion,Odoo Community Association (OCA)",

attribute_set/models/attribute_group.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class AttributeGroup(models.Model):
1212
_description = "Attribute Group"
1313
_order = "sequence"
1414

15-
name = fields.Char(size=128, required=True, translate=True)
15+
name = fields.Char(required=True, translate=True)
1616

1717
sequence = fields.Integer(
1818
"Sequence in Set", help="The Group order in his attribute's Set"

attribute_set/models/attribute_set_owner.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111

1212
class AttributeSetOwnerMixin(models.AbstractModel):
13-
"""Override the '_inheriting' model's fields_view_get() and replace
13+
"""Override the '_inheriting' model's get_views() and replace
1414
the 'attributes_placeholder' by the fields related to the '_inheriting' model's
1515
Attributes.
1616
Each Attribute's field will have a conditional invisibility depending on its
@@ -77,15 +77,14 @@ def _insert_attribute(self, arch):
7777
return etree.tostring(eview, pretty_print=True)
7878

7979
@api.model
80-
def fields_view_get(
81-
self, view_id=None, view_type="form", toolbar=False, submenu=False
82-
):
83-
result = super().fields_view_get(
84-
view_id=view_id,
85-
view_type=view_type,
86-
toolbar=toolbar,
87-
submenu=submenu,
88-
)
89-
if view_type == "form":
90-
result["arch"] = self._insert_attribute(result["arch"])
80+
def get_views(self, views, options=None):
81+
result = super().get_views(views, options=options)
82+
if (
83+
"views" in result
84+
and "form" in result["views"]
85+
and "arch" in result["views"]["form"]
86+
):
87+
result["views"]["form"]["arch"] = self._insert_attribute(
88+
result["views"]["form"]["arch"]
89+
)
9190
return result

attribute_set/tests/test_build_view.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -250,18 +250,16 @@ def test_render_all_field_type(self):
250250
self.assertFalse(attr.get("nolabel", False))
251251

252252
# TEST on NATIVE ATTRIBUTES
253-
def _get_eview_from_fields_view_get(self, include_native_attribute=True):
254-
fields_view = (
253+
def _get_eview_from_get_views(self, include_native_attribute=True):
254+
result = (
255255
self.env["res.partner"]
256256
.with_context(include_native_attribute=include_native_attribute)
257-
.fields_view_get(
258-
view_id=self.view.id, view_type="form", toolbar=False, submenu=False
259-
)
257+
.get_views([(self.view.id, "form")])
260258
)
261-
return etree.fromstring(fields_view["arch"])
259+
return etree.fromstring(result["views"]["form"]["arch"])
262260

263261
def test_include_native_attr(self):
264-
eview = self._get_eview_from_fields_view_get()
262+
eview = self._get_eview_from_get_views()
265263
attr = eview.xpath("//field[@name='{}']".format(self.attr_native.name))
266264

267265
# Only one field with this name
@@ -274,13 +272,13 @@ def test_include_native_attr(self):
274272
)
275273

276274
def test_native_readonly(self):
277-
eview = self._get_eview_from_fields_view_get()
275+
eview = self._get_eview_from_get_views()
278276
attr = eview.xpath("//field[@name='{}']".format(self.attr_native_readonly.name))
279277
self.assertTrue(attr[0].get("readonly"))
280278

281279
def test_no_include_native_attr(self):
282-
# Run fields_view_get on the test view with no "include_native_attribute"
283-
eview = self._get_eview_from_fields_view_get(include_native_attribute=False)
280+
# Run get_views on the test view with no "include_native_attribute"
281+
eview = self._get_eview_from_get_views(include_native_attribute=False)
284282
attr = eview.xpath("//field[@name='{}']".format(self.attr_native.name))
285283

286284
# Only one field with this name

attribute_set/wizard/attribute_option_wizard.py

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,30 @@ class AttributeOptionWizard(models.TransientModel):
2626
def validate(self):
2727
return True
2828

29-
@api.model
30-
def create(self, vals):
29+
@api.model_create_multi
30+
def create(self, vals_list):
3131
attr_obj = self.env["attribute.attribute"]
32-
attr = attr_obj.browse(vals["attribute_id"])
33-
34-
opt_obj = self.env["attribute.option"]
35-
36-
for op_id in vals.get("option_ids") and vals["option_ids"][0][2] or []:
37-
model = attr.relation_model_id.model
38-
39-
name = self.env[model].browse(op_id).name_get()[0][1]
40-
opt_obj.create(
41-
{
42-
"attribute_id": vals["attribute_id"],
43-
"name": name,
44-
"value_ref": "{},{}".format(attr.relation_model_id.model, op_id),
45-
}
46-
)
47-
if vals.get("option_ids"):
48-
del vals["option_ids"]
49-
return super().create(vals)
32+
for vals in vals_list:
33+
attr = attr_obj.browse(vals["attribute_id"])
34+
35+
opt_obj = self.env["attribute.option"]
36+
37+
for op_id in vals.get("option_ids") and vals["option_ids"][0][2] or []:
38+
model = attr.relation_model_id.model
39+
40+
name = self.env[model].browse(op_id).name_get()[0][1]
41+
opt_obj.create(
42+
{
43+
"attribute_id": vals["attribute_id"],
44+
"name": name,
45+
"value_ref": "{},{}".format(
46+
attr.relation_model_id.model, op_id
47+
),
48+
}
49+
)
50+
if vals.get("option_ids"):
51+
del vals["option_ids"]
52+
return super().create(vals_list)
5053

5154
# Hack to circumvent the fact that option_ids never actually exists in the DB,
5255
# thus crashing when read is called after create
@@ -56,26 +59,23 @@ def read(self, fields=None, load="_classic_read"):
5659
return super().read(fields, load)
5760

5861
@api.model
59-
def fields_view_get(
60-
self, view_id=None, view_type="form", toolbar=False, submenu=False
61-
):
62+
def get_views(self, views, options=None):
6263
context = self.env.context
63-
res = super().fields_view_get(
64-
view_id=view_id,
65-
view_type=view_type,
66-
toolbar=toolbar,
67-
submenu=submenu,
68-
)
69-
70-
if view_type == "form" and context and context.get("attribute_id"):
64+
res = super().get_views(views, options=options)
65+
if (
66+
"views" in res
67+
and "form" in res["views"]
68+
and context
69+
and context.get("attribute_id")
70+
):
7171
attr_obj = self.env["attribute.attribute"]
7272
attr = attr_obj.browse(context.get("attribute_id"))
7373
model = attr.relation_model_id
7474

7575
relation = model.model
7676
domain_ids = [op.value_ref.id for op in attr.option_ids if op.value_ref]
7777

78-
res["fields"].update(
78+
res["models"][self._name].update(
7979
{
8080
"option_ids": {
8181
"domain": [("id", "not in", domain_ids)],
@@ -87,10 +87,10 @@ def fields_view_get(
8787
}
8888
)
8989

90-
eview = etree.fromstring(res["arch"])
90+
eview = etree.fromstring(res["views"]["form"]["arch"])
9191
options = etree.Element("field", name="option_ids", nolabel="1")
9292
placeholder = eview.xpath("//separator[@string='options_placeholder']")[0]
9393
placeholder.getparent().replace(placeholder, options)
94-
res["arch"] = etree.tostring(eview, pretty_print=True)
94+
res["views"]["form"]["arch"] = etree.tostring(eview, pretty_print=True)
9595

9696
return res

requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# generated from manifests external_dependencies
2+
unidecode
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../../attribute_set

setup/attribute_set/setup.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import setuptools
2+
3+
setuptools.setup(
4+
setup_requires=['setuptools-odoo'],
5+
odoo_addon=True,
6+
)

0 commit comments

Comments
 (0)