diff --git a/mrp_bom_attribute_match/tests/common.py b/mrp_bom_attribute_match/tests/common.py index 65e082930..eeed6a207 100644 --- a/mrp_bom_attribute_match/tests/common.py +++ b/mrp_bom_attribute_match/tests/common.py @@ -1,3 +1,5 @@ +from odoo import Command +from odoo.models import BaseModel from odoo.tests import Form, TransactionCase @@ -5,130 +7,162 @@ class TestMrpBomAttributeMatchBase(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() - cls._create_products(cls) - cls._create_boms(cls) - - def _create_products(self): - self.warehouse = self.env.ref("stock.warehouse0") - route_manufacture = self.warehouse.manufacture_pull_id.route_id.id - self.product_sword = self.env["product.template"].create( + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.warehouse = cls.env.ref("stock.warehouse0") + cls.route_manufacture = cls.warehouse.manufacture_pull_id.route_id + # Create products + cls.product_sword = cls.env["product.template"].create( { "name": "Plastic Sword", "type": "product", } ) - self.product_surf = self.env["product.template"].create( + cls.product_surf = cls.env["product.template"].create( { "name": "Surf", "type": "product", } ) - self.product_fin = self.env["product.template"].create( + cls.product_fin = cls.env["product.template"].create( { "name": "Surf Fin", "type": "product", } ) - self.product_plastic = self.env["product.template"].create( + cls.product_plastic = cls.env["product.template"].create( { "name": "Plastic Component", "type": "product", } ) - self.p1 = self.env["product.template"].create( + cls.p1 = cls.env["product.template"].create( { "name": "P1", "type": "product", - "route_ids": [(6, 0, [route_manufacture])], + "route_ids": [Command.link(cls.route_manufacture.id)], } ) - self.p2 = self.env["product.template"].create( + cls.p2 = cls.env["product.template"].create( { "name": "P2", "type": "product", - "route_ids": [(6, 0, [route_manufacture])], + "route_ids": [Command.link(cls.route_manufacture.id)], } ) - self.p3 = self.env["product.template"].create( + cls.p3 = cls.env["product.template"].create( { "name": "P3", "type": "product", - "route_ids": [(6, 0, [route_manufacture])], + "route_ids": [Command.link(cls.route_manufacture.id)], } ) - self.product_9 = self.env["product.product"].create( + cls.product_9 = cls.env["product.product"].create( { "name": "Paper", } ) - self.product_10 = self.env["product.product"].create( + cls.product_10 = cls.env["product.product"].create( { "name": "Stone", } ) - self.product_attribute = self.env["product.attribute"].create( + cls.product_attribute = cls.env["product.attribute"].create( {"name": "Colour", "display_type": "radio", "create_variant": "always"} ) - self.attribute_value_ids = self.env["product.attribute.value"].create( + cls.attribute_value_ids = cls.env["product.attribute.value"].create( [ - {"name": "Cyan", "attribute_id": self.product_attribute.id}, - {"name": "Magenta", "attribute_id": self.product_attribute.id}, + {"name": "Cyan", "attribute_id": cls.product_attribute.id}, + {"name": "Magenta", "attribute_id": cls.product_attribute.id}, ] ) - self.plastic_attrs = self.env["product.template.attribute.line"].create( + cls.plastic_attrs = cls.env["product.template.attribute.line"].create( { - "attribute_id": self.product_attribute.id, - "product_tmpl_id": self.product_plastic.id, - "value_ids": [(6, 0, self.product_attribute.value_ids.ids)], + "attribute_id": cls.product_attribute.id, + "product_tmpl_id": cls.product_plastic.id, + "value_ids": [Command.set(cls.product_attribute.value_ids.ids)], } ) - self.sword_attrs = self.env["product.template.attribute.line"].create( + cls.sword_attrs = cls.env["product.template.attribute.line"].create( { - "attribute_id": self.product_attribute.id, - "product_tmpl_id": self.product_sword.id, - "value_ids": [(6, 0, self.product_attribute.value_ids.ids)], + "attribute_id": cls.product_attribute.id, + "product_tmpl_id": cls.product_sword.id, + "value_ids": [Command.set(cls.product_attribute.value_ids.ids)], } ) + # Create boms + cls.bom_id = cls._create_bom( + cls.product_sword, + [ + dict( + component_template_id=cls.product_plastic.id, + product_qty=1, + ), + ], + ) + cls.fin_bom_id = cls._create_bom( + cls.product_fin, + [ + dict( + product_id=cls.product_plastic.product_variant_ids[0], + product_qty=1, + ), + ], + ) + cls.surf_bom_id = cls._create_bom( + cls.product_surf, + [ + dict( + product_id=cls.product_fin.product_variant_ids[0], + product_qty=1, + ), + ], + ) + cls.p1_bom_id = cls._create_bom( + cls.p1, + [ + dict( + product_id=cls.p2.product_variant_ids[0], + product_qty=1, + ), + ], + ) + cls.p2_bom_id = cls._create_bom( + cls.p2, + [ + dict( + product_id=cls.p3.product_variant_ids[0], + product_qty=1, + ), + ], + ) + cls.p3_bom_id = cls._create_bom( + cls.p3, + [ + dict( + product_id=cls.p1.product_variant_ids[0], + product_qty=1, + ), + ], + ) - def _create_boms(self): - mrp_bom_form = Form(self.env["mrp.bom"]) - mrp_bom_form.product_tmpl_id = self.product_sword - with mrp_bom_form.bom_line_ids.new() as line_form: - line_form.component_template_id = self.product_plastic - line_form.product_qty = 1 - self.bom_id = mrp_bom_form.save() - - mrp_bom_form = Form(self.env["mrp.bom"]) - mrp_bom_form.product_tmpl_id = self.product_fin - with mrp_bom_form.bom_line_ids.new() as line_form: - line_form.product_id = self.product_plastic.product_variant_ids[0] - line_form.product_qty = 1 - self.fin_bom_id = mrp_bom_form.save() - - mrp_bom_form = Form(self.env["mrp.bom"]) - mrp_bom_form.product_tmpl_id = self.product_surf - with mrp_bom_form.bom_line_ids.new() as line_form: - line_form.product_id = self.product_fin.product_variant_ids[0] - line_form.product_qty = 1 - self.surf_bom_id = mrp_bom_form.save() - - mrp_bom_form = Form(self.env["mrp.bom"]) - mrp_bom_form.product_tmpl_id = self.p1 - with mrp_bom_form.bom_line_ids.new() as line_form: - line_form.product_id = self.p2.product_variant_ids[0] - line_form.product_qty = 1 - self.p1_bom_id = mrp_bom_form.save() - - mrp_bom_form = Form(self.env["mrp.bom"]) - mrp_bom_form.product_tmpl_id = self.p2 - with mrp_bom_form.bom_line_ids.new() as line_form: - line_form.product_id = self.p3.product_variant_ids[0] - line_form.product_qty = 1 - self.p2_bom_id = mrp_bom_form.save() - - mrp_bom_form = Form(self.env["mrp.bom"]) - mrp_bom_form.product_tmpl_id = self.p3 - with mrp_bom_form.bom_line_ids.new() as line_form: - line_form.product_id = self.p1.product_variant_ids[0] - line_form.product_qty = 1 - self.p3_bom_id = mrp_bom_form.save() + @classmethod + def _create_bom(cls, product, line_form_vals): + if product._name == "product.template": + template = product + product = cls.env["product.product"] + else: + template = product.product_tmpl_id + with Form(cls.env["mrp.bom"]) as form: + form.product_tmpl_id = template + form.product_id = product + for vals in line_form_vals: + with form.bom_line_ids.new() as line_form: + for key, value in vals.items(): + field = line_form._model._fields.get(key) + if field and field.relational: # pragma: no cover + if value and not isinstance(value, BaseModel): + value = cls.env[field.comodel_name].browse(value) + elif not value: + value = cls.env[field.comodel_name] + setattr(line_form, key, value) + return form.save()