← Back to team overview

openerp-expert-framework team mailing list archive

Re: Multiple inheritance problem with MRO

 

On Mon, Apr 23, 2012 at 5:41 PM, Ovnicraft <ovnicraft@xxxxxxxxx> wrote:
>
>
> On Mon, Apr 23, 2012 at 2:38 AM, Olivier Dony <odo@xxxxxxxxxxx> wrote:
>>
>> 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.
>
>
> Hello,
>
> This is my case but in my class when call C super() it does not calls B
> definition, so it calls A definition.
> That is why i am getting wrong.

Indeed something is wrong as this is a widely used case in OpenERP.

Normally, you have model A provided by some module MA, B by MB, and C by MC.

Both B and C _inherit from A. By having explicit dependencies from MB
to MA, and from MC to MB, you are assured to have eventually C > B > A
and the super() to work as expected.

A common mistake is to define C in two different classes inside MC.

class C...

class C...
  def m(self):
    super(C, self).m()  # C is not what you want

If this is the case, just make C a single class.

HTH,
Thu

>>
>>
>> * 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
>
>
> Totally agree but is not my case.
>
>>
>> (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!
>
>
> Best regards,
>
>>
>>
>>
>> > 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...
>
>
>
>
> --
> Cristian Salamea
> @ovnicraft
>
> _______________________________________________
> Mailing list: https://launchpad.net/~openerp-expert-framework
> Post to     : openerp-expert-framework@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~openerp-expert-framework
> More help   : https://help.launchpad.net/ListHelp
>


References