From 0ab88f54f9b5e6c2396f7a612dc2df1f94ff0c09 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Thu, 21 Aug 2014 15:27:31 +0200 Subject: [PATCH] [FIX] ir_model: invalidate cache when adding new fields When a new ir.model.field is created, add the new field in the fields_by_model (cache of custom fields). This is required as the __init__ method would not retrieve the new field if fields_by_model is already set. Otherwise, the _columns would not contain the new fields and we could not access it without restarting the server (e.g. the installation of a module adds ir.model.fields and use it in the a view. --- openerp/addons/base/ir/ir_model.py | 4 ++ openerp/addons/base/tests/__init__.py | 2 + openerp/addons/base/tests/test_ir_model.py | 44 ++++++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 openerp/addons/base/tests/test_ir_model.py diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py index 4fe4fc09df7..fb8e1db2fd5 100644 --- a/openerp/addons/base/ir/ir_model.py +++ b/openerp/addons/base/ir/ir_model.py @@ -361,6 +361,10 @@ class ir_model_fields(osv.osv): if self.pool.get(vals['model']): if vals['model'].startswith('x_') and vals['name'] == 'x_name': self.pool[vals['model']]._rec_name = 'x_name' + + if self.pool.fields_by_model is not None: + cr.execute('SELECT * FROM ir_model_fields WHERE id=%s', (res,)) + self.pool.fields_by_model.setdefault(vals['model'], []).append(cr.dictfetchone()) self.pool.get(vals['model']).__init__(self.pool, cr) #Added context to _auto_init for special treatment to custom field for select_level ctx = dict(context, diff --git a/openerp/addons/base/tests/__init__.py b/openerp/addons/base/tests/__init__.py index f4432f6e1eb..3c6029c49ea 100644 --- a/openerp/addons/base/tests/__init__.py +++ b/openerp/addons/base/tests/__init__.py @@ -1,6 +1,7 @@ import test_base import test_expression import test_ir_attachment +import test_ir_model import test_ir_values import test_menu import test_search @@ -10,6 +11,7 @@ checks = [ test_base, test_expression, test_ir_attachment, + test_ir_model, test_ir_values, test_menu, test_search, diff --git a/openerp/addons/base/tests/test_ir_model.py b/openerp/addons/base/tests/test_ir_model.py new file mode 100644 index 00000000000..409e93270ec --- /dev/null +++ b/openerp/addons/base/tests/test_ir_model.py @@ -0,0 +1,44 @@ +import unittest2 + +import openerp.tests.common as common + +class test_ir_model(common.TransactionCase): + + def test_00(self): + # Create some custom model and fields + cr, uid, context = self.cr, self.uid, {} + + ir_model = self.registry('ir.model') + ir_model_fields = self.registry('ir.model.fields') + ir_model_access = self.registry('ir.model.access') + candy_model_id = ir_model.create(cr, uid, { + 'name': 'Candies', + 'model': 'x_candy', + 'info': 'List of candies', + 'state': 'manual', + }, context=context) + # security rule to avoid warning + ir_model_access.create(cr, uid, { + 'name': 'Candies are for everybody', + 'model_id': candy_model_id, + 'perm_read': True, + 'perm_write': True, + 'perm_create': True, + 'perm_unlink': True, + }) + + assert self.registry('x_candy'), "Custom model not present in registry" + + ir_model_fields.create(cr, uid, { + 'name': 'x_name', + 'field_description': 'Name', + 'model_id': candy_model_id, + 'state': 'manual', + 'ttype': 'char', + }, context=context) + + assert 'x_name' in self.registry('x_candy')._all_columns, "Custom field not present in registry" + assert self.registry('x_candy')._rec_name == 'x_name', "The _rec_name on custom model was not updated" + +if __name__ == '__main__': + unittest2.main()