diff --git a/src/base/tests/test_util.py b/src/base/tests/test_util.py index 58ecb3bca..d1d58d793 100644 --- a/src/base/tests/test_util.py +++ b/src/base/tests/test_util.py @@ -1156,6 +1156,65 @@ def test_change_field_selection_with_default(self): self.assertEqual(new_default, "en_US") + @unittest.skipIf(not util.version_gte("saas~17.5"), "Company dependent fields are stored as jsonb since saas~17.5") + def test_convert_field_to_company_dependent(self): + cr = self.env.cr + + partner_model = self.env["ir.model"].search([("model", "=", "res.partner")]) + self.env["ir.model.fields"].create( + [ + { + "name": "x_test_cd_1", + "ttype": "char", + "model_id": partner_model.id, + }, + { + "name": "x_test_cd_2", + "ttype": "char", + "model_id": partner_model.id, + }, + ] + ) + + c1 = self.env["res.company"].create({"name": "Flancrest"}) + c2 = self.env["res.company"].create({"name": "Flancrest2"}) + + test_partners = self.env["res.partner"].create( + [ + {"name": "Homer", "x_test_cd_1": "A", "x_test_cd_2": "A", "company_id": c1.id}, + {"name": "Marjorie", "x_test_cd_1": "B", "x_test_cd_2": "B"}, + {"name": "Bartholomew"}, + ] + ) + test_partners.invalidate_recordset(["x_test_cd_1", "x_test_cd_2"]) + + # Using company_id as default, only records with company set are updated + util.make_field_company_dependent(cr, "res.partner", "x_test_cd_1", "char") + util.make_field_company_dependent(cr, "res.partner", "x_test_cd_2", "char", company_field=False) + + # make the ORM re-read the info about these manual fields from the DB + setup_models = ( + self.registry.setup_models if hasattr(self.registry, "setup_models") else self.registry._setup_models__ + ) + args = (["res.partner"],) if util.version_gte("saas~18.4") else () + setup_models(cr, *args) + + test_partners_c1 = test_partners.with_company(c1.id) + self.assertEqual(test_partners_c1[0].x_test_cd_1, "A") + self.assertFalse(test_partners_c1[1].x_test_cd_1) + self.assertFalse(test_partners_c1[2].x_test_cd_1) + self.assertEqual(test_partners_c1[0].x_test_cd_2, "A") + self.assertEqual(test_partners_c1[1].x_test_cd_2, "B") + self.assertFalse(test_partners_c1[2].x_test_cd_2) + + test_partners_c2 = test_partners.with_company(c2.id) + self.assertFalse(test_partners_c2[0].x_test_cd_1) + self.assertFalse(test_partners_c2[1].x_test_cd_1) + self.assertFalse(test_partners_c2[2].x_test_cd_1) + self.assertEqual(test_partners_c2[0].x_test_cd_2, "A") + self.assertEqual(test_partners_c2[1].x_test_cd_2, "B") + self.assertFalse(test_partners_c2[2].x_test_cd_2) + class TestHelpers(UnitTestCase): def test_model_table_conversion(self): diff --git a/src/util/fields.py b/src/util/fields.py index eb4b1056a..02a8ff3ca 100644 --- a/src/util/fields.py +++ b/src/util/fields.py @@ -881,9 +881,16 @@ def _convert_field_to_company_dependent( where_condition = "{0} IS NOT NULL" else: where_condition = cr.mogrify("{0} != %s", [default_value]).decode() - where_condition += format_query(cr, " AND {} IS NOT NULL", company_field) - using = format_query(cr, "jsonb_build_object({}, {{0}})", company_field) + if company_field: + where_condition += format_query(cr, " AND {} IS NOT NULL", company_field) + using = format_query(cr, "jsonb_build_object({}, {{0}})", company_field) + else: + using = format_query( + cr, + "(SELECT jsonb_object_agg(c.id::text, {}.{{0}}) FROM res_company c)", + table, + ) alter_column_type(cr, table, field, "jsonb", using=using, where=where_condition) # delete all old default