[IMP] mrp_bom_attribute_match: Drop the web_field_domain dependency.

The same result can be achieved with a computed field.
Moreover, we have one already in odoo core. Originally it was a related
field, but we can change it to a computed and add our extra logic there.
This commit is contained in:
Ivàn Todorovich
2022-10-27 16:42:33 -03:00
committed by Ilyas
parent b28c5bd7e4
commit b1ab67ce5e
3 changed files with 41 additions and 23 deletions

View File

@@ -4,7 +4,7 @@
"category": "Manufacturing", "category": "Manufacturing",
"author": "Ilyas, Ooops, Odoo Community Association (OCA)", "author": "Ilyas, Ooops, Odoo Community Association (OCA)",
"summary": "Dynamic BOM component based on product attribute", "summary": "Dynamic BOM component based on product attribute",
"depends": ["mrp_account", "web_domain_field"], "depends": ["mrp_account"],
"license": "AGPL-3", "license": "AGPL-3",
"website": "https://github.com/OCA/manufacture", "website": "https://github.com/OCA/manufacture",
"data": [ "data": [

View File

@@ -1,4 +1,3 @@
import json
import logging import logging
from odoo import _, api, fields, models from odoo import _, api, fields, models
@@ -21,24 +20,50 @@ class MrpBomLine(models.Model):
match_on_attribute_ids = fields.Many2many( match_on_attribute_ids = fields.Many2many(
"product.attribute", string="Match on Attributes", readonly=True "product.attribute", string="Match on Attributes", readonly=True
) )
product_uom_id_domain = fields.Char(compute="_compute_product_uom_id_domain") product_uom_category_id = fields.Many2one(
"uom.category",
related=None,
compute="_compute_product_uom_category_id",
)
@api.depends("component_template_id", "product_id") @api.depends("product_id", "component_template_id")
def _compute_product_uom_id_domain(self): def _compute_product_uom_category_id(self):
for r in self: """Compute the product_uom_category_id field.
if r.component_template_id:
category_id = r.component_template_id.uom_id.category_id.id This is the product category that will be allowed to use on the product_uom_id
if ( field, already covered by core module:
r.product_uom_id.category_id.id https://github.com/odoo/odoo/blob/331b9435c/addons/mrp/models/mrp_bom.py#L372
!= r.component_template_id.uom_id.category_id.id
): In core, though, this field is related to "product_id.uom_id.category_id".
r.product_uom_id = r.component_template_id.uom_id Here we make it computed to choose between component_template_id and
else: product_id, depending on which one is set
category_id = r.product_uom_category_id.id """
r.product_uom_id_domain = json.dumps([("category_id", "=", category_id)]) # pylint: disable=missing-return
# NOTE: To play nice with other modules trying to do the same:
# 1) Set the field value as if it were a related field (core behaviour)
# 2) Call super (if it's there)
# 3) Update only the records we want
for rec in self:
rec.product_uom_category_id = rec.product_id.uom_id.category_id
if hasattr(super(), "_compute_product_uom_category_id"):
super()._compute_product_uom_category_id()
for rec in self:
if rec.component_template_id:
rec.product_uom_category_id = (
rec.component_template_id.uom_id.category_id
)
@api.onchange("component_template_id") @api.onchange("component_template_id")
def _onchange_component_template_id(self): def _onchange_component_template_id(self):
if self.component_template_id:
if (
self.product_uom_id.category_id
!= self.component_template_id.uom_id.category_id
):
self.product_uom_id = self.component_template_id.uom_id
else:
if self.product_uom_id.category_id != self.product_id.uom_id.category_id:
self.product_uom_id = self.product_id.uom_id
self._update_component_attributes() self._update_component_attributes()
def _update_component_attributes(self): def _update_component_attributes(self):

View File

@@ -19,13 +19,6 @@
position="after" position="after"
> >
<field name="component_template_id" /> <field name="component_template_id" />
<field name="product_uom_id_domain" invisible="1" />
</xpath>
<xpath
expr="//field[@name='bom_line_ids']//field[@name='product_uom_id']"
position="attributes"
>
<attribute name="domain">product_uom_id_domain</attribute>
</xpath> </xpath>
<xpath <xpath
expr="//field[@name='bom_line_ids']//field[@name='product_id']" expr="//field[@name='bom_line_ids']//field[@name='product_id']"