From f7b9046c7b57272e7504ad19137515951c0e9194 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Fri, 20 Feb 2015 11:16:45 +0100 Subject: [PATCH 1/3] Add a failing test to reproduce #5398 --- openerp/addons/test_inherits/__init__.py | 2 + openerp/addons/test_inherits/__openerp__.py | 16 ++++++++ openerp/addons/test_inherits/demo_data.xml | 19 +++++++++ .../addons/test_inherits/ir.model.access.csv | 4 ++ openerp/addons/test_inherits/models.py | 41 +++++++++++++++++++ .../addons/test_inherits/tests/__init__.py | 3 ++ .../test_inherits/tests/test_inherits.py | 17 ++++++++ 7 files changed, 102 insertions(+) create mode 100644 openerp/addons/test_inherits/__init__.py create mode 100644 openerp/addons/test_inherits/__openerp__.py create mode 100644 openerp/addons/test_inherits/demo_data.xml create mode 100644 openerp/addons/test_inherits/ir.model.access.csv create mode 100644 openerp/addons/test_inherits/models.py create mode 100644 openerp/addons/test_inherits/tests/__init__.py create mode 100644 openerp/addons/test_inherits/tests/test_inherits.py diff --git a/openerp/addons/test_inherits/__init__.py b/openerp/addons/test_inherits/__init__.py new file mode 100644 index 00000000000..a0fdc10fe11 --- /dev/null +++ b/openerp/addons/test_inherits/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import models diff --git a/openerp/addons/test_inherits/__openerp__.py b/openerp/addons/test_inherits/__openerp__.py new file mode 100644 index 00000000000..21010738f8e --- /dev/null +++ b/openerp/addons/test_inherits/__openerp__.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'test-inherits', + 'version': '0.1', + 'category': 'Tests', + 'description': """A module to verify the inheritance using _inherits.""", + 'author': 'Camptocamp', + 'website': 'http://www.camptocamp.com', + 'depends': ['base'], + 'data': [ + 'ir.model.access.csv', + 'demo_data.xml', + ], + 'installable': True, + 'auto_install': False, +} diff --git a/openerp/addons/test_inherits/demo_data.xml b/openerp/addons/test_inherits/demo_data.xml new file mode 100644 index 00000000000..98b19095acd --- /dev/null +++ b/openerp/addons/test_inherits/demo_data.xml @@ -0,0 +1,19 @@ + + + + Unit A + a + + + + + A + + + + + A + + + + diff --git a/openerp/addons/test_inherits/ir.model.access.csv b/openerp/addons/test_inherits/ir.model.access.csv new file mode 100644 index 00000000000..22ecf366e31 --- /dev/null +++ b/openerp/addons/test_inherits/ir.model.access.csv @@ -0,0 +1,4 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +access_test_unit,access_test_unit,model_test_unit,,1,1,1,1 +access_test_box,access_test_box,model_test_box,,1,1,1,1 +access_test_pallet,access_test_pallet,model_test_pallet,,1,1,1,1 diff --git a/openerp/addons/test_inherits/models.py b/openerp/addons/test_inherits/models.py new file mode 100644 index 00000000000..c8f86ec52d7 --- /dev/null +++ b/openerp/addons/test_inherits/models.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +from openerp import models, fields, api, osv + + +# We just create a new model +class Unit(models.Model): + _name = 'test.unit' + + _columns = { + 'name': osv.fields.char('Name', required=True), + 'state': osv.fields.selection([('a', 'A'), ('b', 'B')], + string='State'), + } + + surname = fields.Char(compute='_compute_surname') + + @api.one + @api.depends('name') + def _compute_surname(self): + self.surname = self.name or '' + + +# We want to _inherits from the parent model and we add some fields +# in the child object +class Box(models.Model): + _name = 'test.box' + _inherits = {'test.unit': 'unit_id'} + + unit_id = fields.Many2one('test.unit', 'Unit', required=True, + ondelete='cascade') + field_in_box = fields.Char('Field1') + + +# We add a third level of _inherits +class Pallet(models.Model): + _name = 'test.pallet' + _inherits = {'test.box': 'box_id'} + + box_id = fields.Many2one('test.box', 'Box', required=True, + ondelete='cascade') + field_in_pallet = fields.Char('Field2') diff --git a/openerp/addons/test_inherits/tests/__init__.py b/openerp/addons/test_inherits/tests/__init__.py new file mode 100644 index 00000000000..694d1720d65 --- /dev/null +++ b/openerp/addons/test_inherits/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import test_inherits diff --git a/openerp/addons/test_inherits/tests/test_inherits.py b/openerp/addons/test_inherits/tests/test_inherits.py new file mode 100644 index 00000000000..1fcdbb2f3ec --- /dev/null +++ b/openerp/addons/test_inherits/tests/test_inherits.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from openerp.tests import common + + +class test_inherits(common.TransactionCase): + + def test_create_3_levels_inherits(self): + """ Check that we can create an inherits on 3 levels """ + pallet = self.env['test.pallet'].create({ + 'name': 'B', + 'field_in_box': 'box', + 'field_in_pallet': 'pallet', + }) + self.assertTrue(pallet) + self.assertEqual(pallet.name, 'B') + self.assertEqual(pallet.field_in_box, 'box') + self.assertEqual(pallet.field_in_pallet, 'pallet') From 461c93081d54db2fa08a166837140ae8e59f3d8f Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Fri, 20 Feb 2015 11:25:57 +0100 Subject: [PATCH 2/3] Add a failing test for write as well --- openerp/addons/test_inherits/tests/test_inherits.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openerp/addons/test_inherits/tests/test_inherits.py b/openerp/addons/test_inherits/tests/test_inherits.py index 1fcdbb2f3ec..7ff5dee814b 100644 --- a/openerp/addons/test_inherits/tests/test_inherits.py +++ b/openerp/addons/test_inherits/tests/test_inherits.py @@ -15,3 +15,9 @@ class test_inherits(common.TransactionCase): self.assertEqual(pallet.name, 'B') self.assertEqual(pallet.field_in_box, 'box') self.assertEqual(pallet.field_in_pallet, 'pallet') + + def test_write_3_levels_inherits(self): + """ Check that we can create an inherits on 3 levels """ + pallet = self.env.ref('test_inherits.pallet_a') + pallet.write({'name': 'C'}) + self.assertEqual(pallet.name, 'C') From 608e58cce13e51d40e6b741dd8ea336fc9cfcb5a Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Tue, 24 Feb 2015 10:34:09 +0100 Subject: [PATCH 3/3] Reload fields of parent inherits, fixes #5398 --- openerp/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openerp/models.py b/openerp/models.py index 3a8cb88423e..8f0ac390d3e 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -2896,6 +2896,7 @@ class BaseModel(object): cls._inherit_fields = struct = {} for parent_model, parent_field in cls._inherits.iteritems(): parent = cls.pool[parent_model] + parent._inherits_reload() for name, column in parent._columns.iteritems(): struct[name] = (parent_model, parent_field, column, parent_model) for name, source in parent._inherit_fields.iteritems():