From 93ce600dc64a6f76acfcb655adaf155a1b1691ef Mon Sep 17 00:00:00 2001 From: Carmen Bianca BAKKER Date: Fri, 27 Sep 2024 14:50:05 +0200 Subject: [PATCH] [FIX] product_print_category: Improve computation of product_variant_id for inactive templates Signed-off-by: Carmen Bianca BAKKER --- .../models/product_template.py | 24 +++++++++++++++++++ product_print_category/tests/__init__.py | 1 + .../tests/test_product_template.py | 21 ++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 product_print_category/tests/test_product_template.py diff --git a/product_print_category/models/product_template.py b/product_print_category/models/product_template.py index f0078baa..44ab6951 100644 --- a/product_print_category/models/product_template.py +++ b/product_print_category/models/product_template.py @@ -18,6 +18,30 @@ class ProductTemplate(models.Model): to_print = fields.Boolean(related="product_variant_id.to_print", readonly=False) + @api.depends("product_variant_ids") + def _compute_product_variant_id(self): + # This is a very particular workaround for the following workflow: + # + # - Archive product.template. + # - Duplicate product.template. <-- This method is called in this step. + # - Unarchive duplicated product.template. + # + # If a product.template is archived, then its variants are also + # archived. This means that accessing `product_variant_ids` outputs an + # empty recordset, subsequently causing this compute function to wrongly + # populate `product_variant_id` with null. By disabling `active_test`, + # we prevent this problem. + # + # Upsteam bugfix in targeted + # at v15+. + for p in self: + # We do with_context() on each individual product instead of on + # self, because doing it on self does not produce the desired result + # in Odoo 12, somehow. + p.product_variant_id = ( + p.with_context(active_test=False).product_variant_ids[:1].id + ) + @api.multi def write(self, vals): res = super().write(vals) diff --git a/product_print_category/tests/__init__.py b/product_print_category/tests/__init__.py index 748c092c..c7faabb7 100644 --- a/product_print_category/tests/__init__.py +++ b/product_print_category/tests/__init__.py @@ -1 +1,2 @@ from . import test_product_print_category +from . import test_product_template diff --git a/product_print_category/tests/test_product_template.py b/product_print_category/tests/test_product_template.py new file mode 100644 index 00000000..e28d2527 --- /dev/null +++ b/product_print_category/tests/test_product_template.py @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: 2024 Coop IT Easy SC +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +from odoo.tests.common import SavepointCase + + +class TestProductTemplate(SavepointCase): + def test_product_variant_id(self): + """Test that product_variant_id is correctly populated for cloned + archived products. + """ + product = self.env["product.template"].create({"name": "Test"}) + breakpoint() + product.active = False + new_product = product.copy() + new_variants = new_product.with_context(active_test=False).product_variant_ids + self.assertFalse(new_product.active) + self.assertEqual(new_product.product_variant_id, new_variants[0]) + new_product.active = True + self.assertEqual(new_product.product_variant_id, new_variants[0])