From 3f5da9314fe8b81e6338db52ceac16f897c9476b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Wed, 28 Feb 2024 12:03:24 +0100 Subject: [PATCH] [MIG] quality_control_stock_oca: Migration to 16.0 TT47858 --- .../data/quality_control_data.xml | 1 + .../tests/test_quality_control.py | 60 ++++--- .../models/qc_inspection.py | 31 ++-- .../models/stock_picking_type.py | 21 ++- .../tests/test_quality_control_stock.py | 156 +++++++----------- 5 files changed, 121 insertions(+), 148 deletions(-) diff --git a/quality_control_oca/data/quality_control_data.xml b/quality_control_oca/data/quality_control_data.xml index 4bd7d9ca5..f2109f218 100644 --- a/quality_control_oca/data/quality_control_data.xml +++ b/quality_control_oca/data/quality_control_data.xml @@ -22,5 +22,6 @@ qc.inspection QC- 6 + diff --git a/quality_control_oca/tests/test_quality_control.py b/quality_control_oca/tests/test_quality_control.py index 30d478f34..9dd08200b 100644 --- a/quality_control_oca/tests/test_quality_control.py +++ b/quality_control_oca/tests/test_quality_control.py @@ -6,38 +6,48 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import exceptions -from odoo.tests.common import TransactionCase + +from odoo.addons.base.tests.common import BaseCommon from ..models.qc_trigger_line import _filter_trigger_lines -class TestQualityControl(TransactionCase): - def setUp(self): - super().setUp() - self.inspection_model = self.env["qc.inspection"] - self.category_model = self.env["qc.test.category"] - self.question_model = self.env["qc.test.question"] - self.wizard_model = self.env["qc.inspection.set.test"] - self.qc_trigger = self.env["qc.trigger"].create( - {"name": "Test Trigger", "active": True} - ) - self.test = self.env.ref("quality_control_oca.qc_test_1") - self.val_ok = self.env.ref("quality_control_oca.qc_test_question_value_1") - self.val_ko = self.env.ref("quality_control_oca.qc_test_question_value_2") - self.qn_question = self.env.ref("quality_control_oca.qc_test_question_2") - self.cat_generic = self.env.ref( +class TestQualityControlOcaBase(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.inspection_model = cls.env["qc.inspection"] + cls.category_model = cls.env["qc.test.category"] + cls.question_model = cls.env["qc.test.question"] + cls.wizard_model = cls.env["qc.inspection.set.test"] + cls.qc_trigger = cls.env["qc.trigger"].create({"name": "Test Trigger"}) + cls.test = cls.env.ref("quality_control_oca.qc_test_1") + cls.val_ok = cls.env.ref("quality_control_oca.qc_test_question_value_1") + cls.val_ko = cls.env.ref("quality_control_oca.qc_test_question_value_2") + cls.qn_question = cls.env.ref("quality_control_oca.qc_test_question_2") + cls.cat_generic = cls.env.ref( "quality_control_oca.qc_test_template_category_generic" ) - self.product = self.env.ref("product.product_product_11") - inspection_lines = self.inspection_model._prepare_inspection_lines(self.test) - self.inspection1 = self.inspection_model.create( - {"name": "Test Inspection", "inspection_lines": inspection_lines} + cls.product = cls.env["product.product"].create({"name": "Test product"}) + cls.inspection1 = cls.inspection_model.create( + { + "name": "Test Inspection", + "inspection_lines": cls.inspection_model._prepare_inspection_lines( + cls.test + ), + } ) - self.wizard = self.wizard_model.with_context( - active_id=self.inspection1.id - ).create({"test": self.test.id}) - self.wizard.action_create_test() - self.inspection1.action_todo() + + +class TestQualityControlOca(TestQualityControlOcaBase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.wizard = cls.wizard_model.with_context(active_id=cls.inspection1.id).create( + {"test": cls.test.id} + ) + cls.wizard.action_create_test() + cls.inspection1.action_todo() def test_inspection_correct(self): for line in self.inspection1.inspection_lines: diff --git a/quality_control_stock_oca/models/qc_inspection.py b/quality_control_stock_oca/models/qc_inspection.py index 5e85afd3e..3a6eeb4f1 100644 --- a/quality_control_stock_oca/models/qc_inspection.py +++ b/quality_control_stock_oca/models/qc_inspection.py @@ -29,12 +29,11 @@ class QcInspection(models.Model): @api.depends("object_id") def _compute_picking(self): - for inspection in self: - if inspection.object_id: - if inspection.object_id._name == "stock.move": - inspection.picking_id = inspection.object_id.picking_id - elif inspection.object_id._name == "stock.picking": - inspection.picking_id = inspection.object_id + for inspection in self.filtered("object_id"): + if inspection.object_id._name == "stock.move": + inspection.picking_id = inspection.object_id.picking_id + elif inspection.object_id._name == "stock.picking": + inspection.picking_id = inspection.object_id @api.depends("object_id") def _compute_lot(self): @@ -44,17 +43,13 @@ class QcInspection(models.Model): move_lines = self.env["stock.move.line"].search( [("lot_id", "!=", False), ("move_id", "in", [move.id for move in moves])] ) - - for inspection in self: - if inspection.object_id: - if inspection.object_id._name == "stock.move": - inspection.lot_id = first( - move_lines.filtered( - lambda line: line.move_id == inspection.object_id - ) - ).lot_id - elif inspection.object_id._name == "stock.lot": - inspection.lot_id = inspection.object_id + for inspection in self.filtered("object_id"): + if inspection.object_id._name == "stock.move": + inspection.lot_id = first( + move_lines.filtered(lambda x: x.move_id == inspection.object_id) + ).lot_id + elif inspection.object_id._name == "stock.lot": + inspection.lot_id = inspection.object_id @api.depends("object_id") def _compute_product_id(self): @@ -69,7 +64,7 @@ class QcInspection(models.Model): @api.onchange("object_id") def onchange_object_id(self): - if self.object_id._name == "stock.move": + if self.object_id and self.object_id._name == "stock.move": self.qty = self.object_id.product_qty def _prepare_inspection_header(self, object_ref, trigger_line): diff --git a/quality_control_stock_oca/models/stock_picking_type.py b/quality_control_stock_oca/models/stock_picking_type.py index 4378757b0..d29bea017 100644 --- a/quality_control_stock_oca/models/stock_picking_type.py +++ b/quality_control_stock_oca/models/stock_picking_type.py @@ -8,15 +8,20 @@ from odoo import api, models class StockPickingType(models.Model): _inherit = "stock.picking.type" + def _prepare_qc_trigger_vals(self): + self.ensure_one() + return { + "name": self.display_name, + "company_id": self.warehouse_id.company_id.id, + "picking_type_id": self.id, + "partner_selectable": True, + } + def _create_qc_trigger(self): + values = [] for picking_type in self: - qc_trigger = { - "name": picking_type.display_name, - "company_id": picking_type.warehouse_id.company_id.id, - "picking_type_id": picking_type.id, - "partner_selectable": True, - } - self.env["qc.trigger"].sudo().create(qc_trigger) + values.append(picking_type._prepare_qc_trigger_vals()) + self.env["qc.trigger"].sudo().create(values) @api.model_create_multi def create(self, val_list): @@ -32,5 +37,5 @@ class StockPickingType(models.Model): qc_triggers = qc_trigger_model.search( [("picking_type_id", "=", rec.id)] ) - qc_triggers.write({"name": rec.name}) + qc_triggers.write({"name": rec.display_name}) return res diff --git a/quality_control_stock_oca/tests/test_quality_control_stock.py b/quality_control_stock_oca/tests/test_quality_control_stock.py index 4fa15aec2..f790f546f 100644 --- a/quality_control_stock_oca/tests/test_quality_control_stock.py +++ b/quality_control_stock_oca/tests/test_quality_control_stock.py @@ -1,113 +1,66 @@ # Copyright 2015 Oihane Crucelaegui - AvanzOSC # Copyright 2018 Simone Rubino - Agile Business Group # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.tests import Form, new_test_user +from odoo.tools import mute_logger -from odoo.tests.common import TransactionCase +from odoo.addons.quality_control_oca.tests.test_quality_control import ( + TestQualityControlOcaBase, +) -class TestQualityControl(TransactionCase): - def setUp(self): - super().setUp() - self.users_model = self.env["res.users"] - self.picking_model = self.env["stock.picking"] - self.inspection_model = self.env["qc.inspection"] - self.qc_trigger_model = self.env["qc.trigger"] - self.picking_type_model = self.env["stock.picking.type"] - self.product = self.env.ref("product.product_product_2") - self.partner1 = self.env.ref("base.res_partner_2") - self.partner2 = self.env.ref("base.res_partner_4") - self.test = self.env.ref("quality_control_oca.qc_test_1") - self.picking_type = self.env.ref("stock.picking_type_out") - self.location_dest = self.env.ref("stock.stock_location_customers") - self.group_stock_user = self.env.ref("stock.group_stock_user") - self.group_quality_control_user = self.env.ref( - "quality_control_oca.group_quality_control_user" +class TestQualityControlStockOca(TestQualityControlOcaBase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.qc_trigger_model = cls.env["qc.trigger"] + cls.picking_type_model = cls.env["stock.picking.type"] + cls.partner1 = cls.env["res.partner"].create({"name": "Test partner 1"}) + cls.partner2 = cls.env["res.partner"].create({"name": "Test partner 2"}) + cls.picking_type = cls.env.ref("stock.picking_type_out") + cls.location = cls.picking_type.default_location_src_id + cls.location_dest = cls.picking_type.default_location_dest_id + cls.trigger = cls.qc_trigger_model.search( + [("picking_type_id", "=", cls.picking_type.id)] ) - self.company = self.env.ref("base.main_company") - self.sequence = self.env["ir.sequence"].create( - {"code": "out", "name": "outgoing_sequence"} - ) - inspection_lines = self.inspection_model._prepare_inspection_lines(self.test) - self.inspection1 = self.inspection_model.create( - {"name": "Test Inspection", "inspection_lines": inspection_lines} - ) - self.trigger = self.qc_trigger_model.search( - [("picking_type_id", "=", self.picking_type.id)] - ) - self.lot = self.env["stock.lot"].create( + cls.lot = cls.env["stock.lot"].create( { "name": "Lot for tests", - "product_id": self.product.id, - "company_id": self.company.id, + "product_id": cls.product.id, } ) - self.user1_id = self._create_user( - "user_1", - [self.group_stock_user, self.group_quality_control_user], - self.company, - ) - move_vals = { - "name": self.product.name, - "product_id": self.product.id, - "product_uom": self.product.uom_id.id, - "product_uom_qty": 2.0, - "location_id": self.picking_type.default_location_src_id.id, - "location_dest_id": self.location_dest.id, - } - self.picking1 = ( - self.picking_model.with_user(self.user1_id) - .with_context(default_picking_type_id=self.picking_type.id) - .create( - { - "partner_id": self.partner1.id, - "picking_type_id": self.picking_type.id, - "move_ids": [(0, 0, move_vals)], - "location_dest_id": self.location_dest.id, - } - ) - ) - self.picking1.action_confirm() - sequence = 10 - for line in self.picking1.move_ids.filtered( - lambda r: r.product_id == self.product - ): - line.write( - { - "move_line_ids": [ - ( - 0, - 0, - { - "lot_id": self.lot.id, - "qty_done": 1.0, - "product_uom_id": line.product_uom.id, - "product_id": line.product_id.id, - "location_id": line.location_id.id, - "location_dest_id": line.location_dest_id.id, - }, - ) - ], - "sequence": sequence, - } - ) - sequence += 10 - - def _create_user(self, login, groups, company): - """Create a user.""" - group_ids = [group.id for group in groups] - user = self.users_model.with_context(no_reset_password=True).create( + cls.product.detailed_type = "product" + cls.env["stock.quant"].create( { - "name": "Sale User", - "login": login, - "password": "test", - "email": "test@yourcompany.com", - "company_id": company.id, - "company_ids": [(4, company.id)], - "groups_id": [(6, 0, group_ids)], + "product_id": cls.product.id, + "location_id": cls.location.id, + "quantity": 1, + "lot_id": cls.lot.id, } ) - return user.id + cls.user = new_test_user( + cls.env, + login="test_quality_control_stock_oca", + groups="%s,%s" + % ( + "stock.group_stock_user", + "quality_control_oca.group_quality_control_user", + ), + ) + picking_form = Form( + cls.env["stock.picking"] + .with_user(cls.user) + .with_context(default_picking_type_id=cls.picking_type.id) + ) + picking_form.partner_id = cls.partner1 + with picking_form.move_ids_without_package.new() as move_form: + move_form.product_id = cls.product + move_form.product_uom_qty = 2 + cls.picking1 = picking_form.save() + cls.picking1.action_confirm() + cls.picking1.move_ids.move_line_ids.qty_done = 1 + @mute_logger("odoo.models.unlink") def test_inspection_create_for_product(self): self.product.qc_triggers = [ (0, 0, {"trigger": self.trigger.id, "test": self.test.id}) @@ -126,6 +79,7 @@ class TestQualityControl(TransactionCase): inspection.onchange_object_id() self.assertEqual(inspection.qty, self.picking1.move_ids.product_uom_qty) + @mute_logger("odoo.models.unlink") def test_inspection_create_for_template(self): self.product.product_tmpl_id.qc_triggers = [ (0, 0, {"trigger": self.trigger.id, "test": self.test.id}) @@ -140,6 +94,7 @@ class TestQualityControl(TransactionCase): "Wrong test picked when creating inspection.", ) + @mute_logger("odoo.models.unlink") def test_inspection_create_for_category(self): self.product.categ_id.qc_triggers = [ (0, 0, {"trigger": self.trigger.id, "test": self.test.id}) @@ -154,6 +109,7 @@ class TestQualityControl(TransactionCase): "Wrong test picked when creating inspection.", ) + @mute_logger("odoo.models.unlink") def test_inspection_create_for_product_partner(self): self.product.qc_triggers = [ ( @@ -176,6 +132,7 @@ class TestQualityControl(TransactionCase): "Wrong test picked when creating inspection.", ) + @mute_logger("odoo.models.unlink") def test_inspection_create_for_template_partner(self): self.product.product_tmpl_id.qc_triggers = [ ( @@ -198,6 +155,7 @@ class TestQualityControl(TransactionCase): "Wrong test picked when creating inspection.", ) + @mute_logger("odoo.models.unlink") def test_inspection_create_for_category_partner(self): self.product.categ_id.qc_triggers = [ ( @@ -220,6 +178,7 @@ class TestQualityControl(TransactionCase): "Wrong test picked when creating inspection.", ) + @mute_logger("odoo.models.unlink") def test_inspection_create_for_product_wrong_partner(self): self.product.qc_triggers = [ ( @@ -237,6 +196,7 @@ class TestQualityControl(TransactionCase): self.picking1.created_inspections, 0, "No inspection must be created" ) + @mute_logger("odoo.models.unlink") def test_inspection_create_for_template_wrong_partner(self): self.product.product_tmpl_id.qc_triggers = [ ( @@ -254,6 +214,7 @@ class TestQualityControl(TransactionCase): self.picking1.created_inspections, 0, "No inspection must be created" ) + @mute_logger("odoo.models.unlink") def test_inspection_create_for_category_wrong_partner(self): self.product.categ_id.qc_triggers = [ ( @@ -271,6 +232,7 @@ class TestQualityControl(TransactionCase): self.picking1.created_inspections, 0, "No inspection must be created" ) + @mute_logger("odoo.models.unlink") def test_inspection_create_only_one(self): self.product.qc_triggers = [ (0, 0, {"trigger": self.trigger.id, "test": self.test.id}) @@ -301,8 +263,8 @@ class TestQualityControl(TransactionCase): { "name": "Test Picking Type", "code": "outgoing", - "sequence_code": "OUT", - "sequence_id": self.sequence.id, + "sequence_code": self.picking_type.sequence_code, + "sequence_id": self.picking_type.sequence_id.id, } ) trigger = self.qc_trigger_model.search(