[REF] never defer parent_store computation

Simplify the implementation of parent_left/parent_right by removing this
optimization.
This commit is contained in:
Raphael Collet
2018-02-28 10:33:44 +01:00
parent af05bf2027
commit 80f1ac3599
7 changed files with 7 additions and 53 deletions
-4
View File
@@ -677,10 +677,6 @@ class Import(models.TransientModel):
_logger.info('importing %d rows...', len(data))
model = self.env[self.res_model].with_context(import_file=True)
defer_parent_store = self.env.context.get('defer_parent_store_computation', True)
if defer_parent_store and model._parent_store:
model = model.with_context(defer_parent_store_computation=True)
import_result = model.load(import_fields, data)
_logger.info('done')
@@ -12,11 +12,6 @@ class TestUi(odoo.tests.HttpCase):
def test_01_pos_basic_order(self):
env = self.env
# By default parent_store computation is deferred until end of
# tests. Pricelist items however are sorted based on these
# fields, so they need to be computed.
env['product.category']._parent_store_compute()
journal_obj = env['account.journal']
account_obj = env['account.account']
main_company = env.ref('base.main_company')
-3
View File
@@ -442,9 +442,6 @@ class TestParentStore(TransactionCase):
def setUp(self):
super(TestParentStore, self).setUp()
# pretend the pool has finished loading to avoid deferring parent_store computation
self.patch(self.registry, '_init', False)
self.registry.do_parent_store(self.cr)
# force res_partner_category.copy() to copy children
category = self.env['res.partner.category']
@@ -996,10 +996,6 @@ class TestParentStore(common.TransactionCase):
def setUp(self):
super(TestParentStore, self).setUp()
# pretend the pool has finished loading to avoid deferring parent_store
# computation
self.patch(self.registry, '_init', False)
# make a tree of categories:
# 0
# /|\
+2 -19
View File
@@ -809,9 +809,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
cr.execute('ROLLBACK TO SAVEPOINT model_load')
ids = False
if ids and self._context.get('defer_parent_store_computation'):
self._parent_store_compute()
return {'ids': ids, 'messages': messages}
def _add_fake_fields(self, fields):
@@ -2114,7 +2111,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
self.pool.post_init(self._reflect)
cr = self._cr
parent_store_compute = False
update_custom_fields = self._context.get('update_custom_fields', False)
must_create_table = not tools.table_exists(cr, self._table)
@@ -2125,7 +2121,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
if self._parent_store:
if not tools.column_exists(cr, self._table, 'parent_left'):
self._create_parent_columns()
parent_store_compute = True
self._check_removed_columns(log=False)
@@ -2154,9 +2149,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
if must_create_table:
self._execute_sql()
if parent_store_compute:
self._parent_store_compute()
@api.model_cr
def init(self):
""" This method is called after :meth:`~._auto_init`, and may be
@@ -3344,11 +3336,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
""" Prepare the creation of a record, and return whether its
parent_left/parent_right fields must be updated after creation.
"""
if not self._parent_store or self._context.get('defer_parent_store_computation'):
return False
if self.pool._init:
self.pool._init_parent.add(self._name)
if not self._parent_store:
return False
# temporarily put the node at the top-level rightmost position
@@ -3365,12 +3353,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
parent_right fields, in their sibling order. This must be called
before updating the parent field.
"""
if not self._parent_store or self._parent_name not in vals or \
self._context.get('defer_parent_store_computation'):
return self.browse()
if self.pool._init:
self.pool._init_parent.add(self._name)
if not self._parent_store or self._parent_name not in vals:
return self.browse()
# The parent_left/right computation may take up to 5 seconds. No need to
+3 -16
View File
@@ -95,16 +95,11 @@ class Registry(Mapping):
# load_modules() above can replace the registry by calling
# indirectly new() again (when modules have to be uninstalled).
# Yeah, crazy.
init_parent = registry._init_parent
registry = cls.registries[db_name]
registry._init_parent.update(init_parent)
with closing(registry.cursor()) as cr:
registry.do_parent_store(cr)
cr.commit()
registry.ready = True
registry.registry_invalidated = bool(update_module)
registry._init = False
registry.ready = True
registry.registry_invalidated = bool(update_module)
return registry
@@ -112,7 +107,6 @@ class Registry(Mapping):
self.models = {} # model name/model instance mapping
self._sql_error = {}
self._init = True
self._init_parent = set()
self._assertion_report = assertion_report.assertion_report()
self._fields_by_model = None
self._post_init_queue = deque()
@@ -209,13 +203,6 @@ class Registry(Mapping):
}
return mapping.get
def do_parent_store(self, cr):
env = odoo.api.Environment(cr, SUPERUSER_ID, {})
for model_name in self._init_parent:
if model_name in env:
env[model_name]._parent_store_compute()
self._init = False
def descendants(self, model_names, *kinds):
""" Return the models corresponding to ``model_names`` and all those
that inherit/inherits from them.
+2 -2
View File
@@ -741,7 +741,7 @@ class expression(object):
(when available), or as an expanded [(left,in,child_ids)] """
if not ids:
return FALSE_DOMAIN
if left_model._parent_store and (not left_model.pool._init) and (not context.get('defer_parent_store_computation')):
if left_model._parent_store:
# TODO: Improve where joins are implemented for many with '.', replace by:
# doms += ['&',(prefix+'.parent_left','<',rec.parent_right),(prefix+'.parent_left','>=',rec.parent_left)]
doms = []
@@ -764,7 +764,7 @@ class expression(object):
""" Return a domain implementing the parent_of operator for [(left,parent_of,ids)],
either as a range using the parent_left/right tree lookup fields
(when available), or as an expanded [(left,in,parent_ids)] """
if left_model._parent_store and (not left_model.pool._init) and (not context.get('defer_parent_store_computation')):
if left_model._parent_store:
doms = []
for rec in left_model.browse(ids):
if doms: