From a9c43bba8211a99c799425b4520bfa5616c6a623 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Fri, 2 Oct 2015 16:25:52 +0200 Subject: [PATCH] [FIX] fields: fix assignment of related field on several records --- .../addons/test_new_api/tests/test_new_fields.py | 13 +++++++++++++ openerp/fields.py | 4 +++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/openerp/addons/test_new_api/tests/test_new_fields.py b/openerp/addons/test_new_api/tests/test_new_fields.py index 2d25cfbf368..af9e5053e8e 100644 --- a/openerp/addons/test_new_api/tests/test_new_fields.py +++ b/openerp/addons/test_new_api/tests/test_new_fields.py @@ -309,6 +309,19 @@ class TestNewFields(common.TransactionCase): self.assertEqual(discussion.name, 'Bar') self.assertEqual(message.discussion_name, 'Bar') + # change discussion name via related field on several records + discussion1 = discussion.create({'name': 'X1'}) + discussion2 = discussion.create({'name': 'X2'}) + discussion1.participants = discussion2.participants = self.env.user + message1 = message.create({'discussion': discussion1.id}) + message2 = message.create({'discussion': discussion2.id}) + self.assertEqual(message1.discussion_name, 'X1') + self.assertEqual(message2.discussion_name, 'X2') + + (message1 + message2).write({'discussion_name': 'X3'}) + self.assertEqual(discussion1.name, 'X3') + self.assertEqual(discussion2.name, 'X3') + # search on related field, and check result search_on_related = self.env['test_new_api.message'].search([('discussion_name', '=', 'Bar')]) search_on_regular = self.env['test_new_api.message'].search([('discussion.name', '=', 'Bar')]) diff --git a/openerp/fields.py b/openerp/fields.py index e8ea78cb6af..3e2dbbb8bfd 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -548,13 +548,15 @@ class Field(object): def _inverse_related(self, records): """ Inverse the related field ``self`` on ``records``. """ + # store record values, otherwise they may be lost by cache invalidation! + record_value = {record: record[self.name] for record in records} for record in records: other = record # traverse the intermediate fields, and keep at most one record for name in self.related[:-1]: other = other[name][:1] if other: - other[self.related[-1]] = record[self.name] + other[self.related[-1]] = record_value[record] def _search_related(self, records, operator, value): """ Determine the domain to search on field ``self``. """