[REF] never defer parent_store computation
Simplify the implementation of parent_left/parent_right by removing this optimization.
This commit is contained in:
@@ -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')
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user