From 0bbda6f265d30e6166b837af36d895124ad3e86e Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 5 Sep 2024 18:21:59 +0200 Subject: [PATCH] product_detailed_type: improve compatibility with demo/test data It's still not perfect yet, in particular when you install the "stock" module and "product_detailed_type_stock" is not installed yet. --- .../models/product_template.py | 17 +++++++++- product_detailed_type/tests/__init__.py | 1 + .../tests/test_detailed_type.py | 34 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 product_detailed_type/tests/__init__.py create mode 100644 product_detailed_type/tests/test_detailed_type.py diff --git a/product_detailed_type/models/product_template.py b/product_detailed_type/models/product_template.py index 8e050c3..393d67b 100644 --- a/product_detailed_type/models/product_template.py +++ b/product_detailed_type/models/product_template.py @@ -13,7 +13,9 @@ class ProductTemplate(models.Model): ('consu', 'Consumable'), ('service', 'Service'), ], string='Product Type', default='consu', required=True, tracking=True) - type = fields.Selection(compute='_compute_type', store=True, string="Type") + type = fields.Selection( + compute='_compute_type', store=True, string="Type", # native string = "Product Type" + default=False, required=False) def _detailed_type_mapping(self): return {} @@ -23,3 +25,16 @@ class ProductTemplate(models.Model): type_mapping = self._detailed_type_mapping() for record in self: record.type = type_mapping.get(record.detailed_type, record.detailed_type) + + # to ensure compat with test and demo data + # It's not perfect, we still have a problem when installing the "stock" + # module while product_detailed_type_stock is not installed yet: it creates + # products with type = 'product' and with the inherit below, it sets detailed_type = 'product' + # but this value is only possible once product_detailed_type_stock is installed. Odoo says: + # ValueError: Wrong value for product.template.detailed_type: 'product' + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if vals.get('type') and vals['type'] != vals.get('detailed_type'): + vals['detailed_type'] = vals['type'] + return super().create(vals_list) diff --git a/product_detailed_type/tests/__init__.py b/product_detailed_type/tests/__init__.py new file mode 100644 index 0000000..46bd6e0 --- /dev/null +++ b/product_detailed_type/tests/__init__.py @@ -0,0 +1 @@ +from . import test_detailed_type diff --git a/product_detailed_type/tests/test_detailed_type.py b/product_detailed_type/tests/test_detailed_type.py new file mode 100644 index 0000000..18036e9 --- /dev/null +++ b/product_detailed_type/tests/test_detailed_type.py @@ -0,0 +1,34 @@ +# Copyright 2024 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo.tests.common import SavepointCase + + +class TestProductDetailedType(SavepointCase): + + def test_product_detailed_type(self): + p1 = self.env['product.product'].create({ + 'name': 'Test 1', + 'detailed_type': 'service', + }) + self.assertEqual(p1.type, 'service') + p2 = self.env['product.product'].create({ + 'name': 'Test 2', + 'detailed_type': 'consu', + }) + self.assertEqual(p2.type, 'consu') + + def test_product_type_compat(self): + p1 = self.env['product.product'].create({ + 'name': 'Test 1', + 'type': 'service', + }) + self.assertEqual(p1.type, 'service') + self.assertEqual(p1.detailed_type, 'service') + p2 = self.env['product.product'].create({ + 'name': 'Test 1', + 'type': 'consu', + }) + self.assertEqual(p2.type, 'consu') + self.assertEqual(p2.detailed_type, 'consu')