[IMP] models: add _inherit_children on models to handle base model extensions

When extending an inherited model, the registry now automatically updates the
schema of children models.
This commit is contained in:
Raphael Collet
2016-02-04 15:52:05 +01:00
parent d76979c03f
commit fe2d819474
2 changed files with 14 additions and 7 deletions
+3 -1
View File
@@ -48,7 +48,7 @@ from .api import Environment
from .exceptions import AccessError, MissingError, ValidationError, UserError
from .osv import fields
from .osv.query import Query
from .tools import frozendict, lazy_property, ormcache, Collector, LastOrderedSet
from .tools import frozendict, lazy_property, ormcache, Collector, LastOrderedSet, OrderedSet
from .tools.config import config
from .tools.func import frame_codeinfo
from .tools.misc import CountingStream, DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
@@ -623,6 +623,7 @@ class BaseModel(object):
'_name': name,
'_register': False,
'_original_module': cls._module,
'_inherit_children': OrderedSet(), # names of children models
'_fields': {}, # populated in _setup_base()
'_defaults': {}, # populated in _setup_base()
})
@@ -638,6 +639,7 @@ class BaseModel(object):
bases.add(base)
else:
bases.add(parent_class)
parent_class._inherit_children.add(name)
ModelClass.__bases__ = bases = tuple(bases)
# determine the attributes of the model's class
+11 -6
View File
@@ -11,7 +11,8 @@ import threading
import openerp
from .. import SUPERUSER_ID
from openerp.tools import assertion_report, lazy_property, classproperty, config, topological_sort
from openerp.tools import assertion_report, classproperty, config, \
lazy_property, topological_sort, OrderedSet
from openerp.tools.lru import LRU
_logger = logging.getLogger(__name__)
@@ -158,7 +159,13 @@ class Registry(Mapping):
"""
from .. import models
models_to_load = [] # need to preserve loading order
loaded_models = OrderedSet()
def mark_loaded(model):
# recursively mark model and its children
loaded_models.add(model._name)
for child_name in model._inherit_children:
mark_loaded(self[child_name])
lazy_property.reset_all(self)
# Instantiate registered classes (via the MetaModel automatic discovery
@@ -166,11 +173,9 @@ class Registry(Mapping):
for cls in models.MetaModel.module_to_models.get(module.name, []):
# models register themselves in self.models
model = cls._build_model(self, cr)
if model._name not in models_to_load:
# avoid double-loading models whose declaration is split
models_to_load.append(model._name)
mark_loaded(model)
return [self.models[m] for m in models_to_load]
return map(self, loaded_models)
def setup_models(self, cr, partial=False):
""" Complete the setup of models.