[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.
This commit is contained in:
Martin Trigaux 2014-08-21 15:27:31 +02:00
parent 8fe9f07cac
commit 0ab88f54f9
3 changed files with 50 additions and 0 deletions

View File

@ -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,

View File

@ -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,

View File

@ -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()