[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:
+3
-1
@@ -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,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.
|
||||
|
||||
Reference in New Issue
Block a user