From 6412575f4bebf9ac73a0c550ac408d8488feb140 Mon Sep 17 00:00:00 2001 From: std-odoo Date: Wed, 19 Apr 2023 08:16:16 +0200 Subject: [PATCH] [IMP] base: allow to use `default_` context key for properties Purpose ======= Allow to use `default_properties.xxxxx` as a context key, to set the default value on a property. We need that because when we group by a property in a Kanban view, we can create new record in a given column, and this process will set this context key. Task-3032464 Part-of: odoo/odoo#103510 --- .../test_new_api/tests/test_properties.py | 35 +++++++++++++++++++ odoo/fields.py | 7 +++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/odoo/addons/test_new_api/tests/test_properties.py b/odoo/addons/test_new_api/tests/test_properties.py index 5bb2f5a2578..e78b6220a10 100644 --- a/odoo/addons/test_new_api/tests/test_properties.py +++ b/odoo/addons/test_new_api/tests/test_properties.py @@ -604,6 +604,41 @@ class PropertiesCase(TestPropertiesMixin): }) self.assertEqual(self._get_sql_properties(record), {'my_char': 'my char', 'test': self.partner_2.id}) + # use the context to set the default value, the default key in the definition is ignored + # (e.g. when you create a new record in a Kanban view grouped by a property) + del property_definition[0]['value'] + self.discussion_1.attributes_definition = property_definition + partner = self.env['test_new_api.partner'].create({'name': 'Test Default'}) + message = self.env['test_new_api.message'] \ + .with_context({'default_attributes.my_many2one': partner.id}) \ + .create({ + 'name': 'Test Message', + 'author': self.user.id, + 'discussion': self.discussion_1.id, + 'attributes': property_definition, + }) + + sql_values = self._get_sql_properties(message) + self.assertEqual(sql_values, {'my_many2one': partner.id}) + properties = message.read(['attributes'])[0]['attributes'] + self.assertEqual(properties[0]['value'], (partner.id, partner.display_name)) + + # "None" is a valid default value + del property_definition[0]['value'] + message = self.env['test_new_api.message'] \ + .with_context({'default_attributes.my_many2one': None}) \ + .create({ + 'name': 'Test Message', + 'author': self.user.id, + 'discussion': self.discussion_1.id, + 'attributes': property_definition, + }) + + sql_values = self._get_sql_properties(message) + self.assertEqual(sql_values, {'my_many2one': False}) + properties = message.read(['attributes'])[0]['attributes'] + self.assertEqual(properties[0]['value'], False) + def test_properties_field_read(self): """Test the behavior of the read method. diff --git a/odoo/fields.py b/odoo/fields.py index b0ede449b2f..b38dc999304 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -3545,7 +3545,12 @@ class Properties(Field): for properties_value in properties_list_values: if properties_value.get('value') is None: - default = properties_value.get('default') or False + property_name = properties_value.get('name') + context_key = f"default_{self.name}.{property_name}" + if property_name and context_key in env.context: + default = env.context[context_key] + else: + default = properties_value.get('default') or False properties_value['value'] = default return properties_list_values