← Back to team overview

openerp-expert-framework team mailing list archive

Re: Multiple inheritance problem with MRO

 

On 04/20/2012 08:01 PM, Ovnicraft wrote:
> Hello we are working with hr_payroll module, so we implement another module
> inherit from it.
> Here is our case:
> 
> A hr_payroll (core openerp)
> B hr_payroll_b (custom module) here we redefine compute_sheet method
> C hr_payroll_c (another custom module) here we redefine compute_sheet again but
> we need run compute_sheet redefined in B module but sytem calls method from A.

* Option 1 (not your case apparently)
If your dependencies are the following:  C -> B -> A (hr_payroll)
then your don't need to do anything, because when you call super() in C's
compute_sheet() you will call B's compute_sheet(). And then probably B should
call super() at some point to make sure the original hr_payroll method is called.

* Option 2 (looks like your case)
If your dependencies are the following:
   B --> A (hr_payroll)
   C --> A (hr_payroll)
and you still need C to call B's method, then something is wrong in your
design. In such a case the hierarchy depends on the ORM module loading order
(you can't really control it unless you put an explicit dependency). B could
have C as parent, or C could have B as parent, it depends. So they must be
clearly independent of each other. If they're not, you have to fix your B and C
implementation to make sure they are properly calling super() and can be
invoked in any order.
Or if you _really_ need to make B and C aware of each other without having a
direct dependency between them you can add a third "link module" D with:
   'depends': ['B', 'C'],
   'auto_install': True
It will be installed as soon as B *and* C are installed (6.1+ only) and can be
used to make them work together, as it knows it will have B and C as parents.
This is a bit similar to the project_mrp module making the connection between
project and mrp modules. But don't touch the MRO!


> Reading about MRO[1] in Python , i need to know how to solve this issue in
> OpenERP and if system support this.

You should never touch the MRO to alter OpenERP models inheritance, or at all.
This is a Python implementation detail and the ORM takes care of managing it
properly when you use OpenERP inheritance. If you need to mess with it your
design is probably bad and certainly too complicated.

Hope this helps...


Follow ups

References