From fe2d8194743f4e44c80c1e7ebd2f6f05d62a8525 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Mon, 14 Dec 2015 16:40:19 +0100 Subject: [PATCH] [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. --- openerp/models.py | 4 +++- openerp/modules/registry.py | 17 +++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/openerp/models.py b/openerp/models.py index b08f1b14745..4da815ef71b 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -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 diff --git a/openerp/modules/registry.py b/openerp/modules/registry.py index e436ab75cf6..907fe7575ee 100644 --- a/openerp/modules/registry.py +++ b/openerp/modules/registry.py @@ -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.