Inherit a Model from an AbstractModel has _auto=False

Bug #1013566 reported by Guewen Baconnier @ Camptocamp
8
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Odoo Server (MOVED TO GITHUB)
Fix Released
Low
OpenERP's Framework R&D

Bug Description

Hello,

It seems that there is a small issue when we use an AbstractModel.
By the way, I'm not sure if it is really destined to be used as I'm not able to find any usage in addons.
It's a pity because it allows to really modularize some things.

As instance, I tried to create a model with the "sequence" responsibility :

class Sequencable(AbstractModel):

    _name = 'abstract.sequencable'

    _order = 'sequence'

    _columns = {
        'sequence': fields.integer('Sequence')
    }

    _defaults = {
        'sequence': 1000
    }

Then, in the models where I want a sequence, I just have to inherit from 'abstract.sequencable'.

class ModelA(Model):

    _name = 'model.a'
    _inherit = ['abstract.sequencable', 'other.inheritance']

    _columns = {...}

class ModelB(TransientModel):
    # please ignore the non-sense of a sequence on a TransientModel, I put it just because the problem explained below happens on Model and TransientModel
    _name = 'model.b'
    _inherit = 'abstract.sequencable'

    _columns = {...}

First, do you see any reason not to do that ?

The once issue I've encountered is that _auto is set to False in AbstractModel, and is not set to True in Model and TransientModel

In orm.py with some cuts :
class AbstractModel(BaseModel):
    _auto = False # don't create any database backend for AbstractModels
    _register = False # not visible in ORM registry, meant to be python-inherited only

class Model(BaseModel):
    _register = False # not visible in ORM registry, meant to be python-inherited only
    _transient = False # True in a TransientModel

So as a result, I have to declare _auto = True in every materialized models; for my model.a it gives:
class ModelA(Model):

    _name = 'model.a'
    _inherit = ['abstract.sequencable', 'other.inheritance']
+    _auto = True

    _columns = {...}

As Model and TransiantModel are supposed to be concrete models, I think that they have to be _auto = True by default even if they are "_inherit"-ing an AbstractModel.

So the base model classes would be (without docstrings):
class Model(BaseModel):
    _register = False # not visible in ORM registry, meant to be python-inherited only
    _transient = False # True in a TransientModel
    _auto = True # create database backend for Models

class TransientModel(BaseModel):
    _register = False # not visible in ORM registry, meant to be python-inherited only
    _transient = True
    _auto = True # create database backend for TransientModels

class AbstractModel(BaseModel):
    _auto = False # don't create any database backend for AbstractModels
    _register = False # not visible in ORM registry, meant to be python-inherited only

Do you agree with that ?

Thanks
Guewen

description: updated
description: updated
Revision history for this message
Olivier Dony (Odoo) (odo-openerp) wrote :

You're perfectly right, due to the way the Python MRO (Method Resolution Order) is computed, when a model class inherits both Model and AbstractModel, the _auto flag of AbstractModel will take precedence and the final class with have _auto=False.

We need to make sure all class attributes overridden by any of [AbstractModel, TransientModel, Model] classes is properly overridden in the others. This will take care of multiple inheritance pitfalls.

This is fixed in 6.1 at revision [1] and will be ported to trunk along with the next batch or forward-ports.

Thanks for reporting!

[1] server 6.1 rev 4216 rev-id: <email address hidden>

Changed in openobject-server:
assignee: nobody → OpenERP's Framework R&D (openerp-dev-framework)
importance: Undecided → Low
milestone: none → 6.1
status: New → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.