summaryrefslogtreecommitdiff
path: root/odoo/modules
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-09-13 18:07:59 +0200
committerChristophe Simonis <chs@odoo.com>2019-09-13 18:07:59 +0200
commit6c948c36bbf72dd896e0bff03aa7fbddadcbb0cd (patch)
treef8620905c011735d8a3c340c46d1417a54a75972 /odoo/modules
parent48503fcf08eac6fed12e080d4f501f9bbc8d257d (diff)
parent197474e5b9ad43ab2d587a98136a1a809ce9a2e7 (diff)
[MERGE] forward port branch saas-12.5 up to 197474e5b9a
Diffstat (limited to 'odoo/modules')
-rw-r--r--odoo/modules/loading.py2
-rw-r--r--odoo/modules/module.py11
-rw-r--r--odoo/modules/registry.py38
3 files changed, 45 insertions, 6 deletions
diff --git a/odoo/modules/loading.py b/odoo/modules/loading.py
index 1551bdc3800..b844fddaf49 100644
--- a/odoo/modules/loading.py
+++ b/odoo/modules/loading.py
@@ -80,7 +80,7 @@ def load_demo(cr, package, idref, mode, report=None):
try:
_logger.info("Module %s: loading demo", package.name)
- with cr.savepoint():
+ with cr.savepoint(flush=False):
load_data(cr, idref, mode, kind='demo', package=package, report=report)
return True
except Exception as e:
diff --git a/odoo/modules/module.py b/odoo/modules/module.py
index ddbd0ce31ae..2c06bca742b 100644
--- a/odoo/modules/module.py
+++ b/odoo/modules/module.py
@@ -492,8 +492,9 @@ class OdooTestResult(unittest.result.TestResult):
# using logger.log makes it difficult to spot-replace findCaller in
# order to provide useful location information (the problematic spot
# inside the test function), so use lower-level functions instead
- record = logger.makeRecord(logger.name, level, fn, lno, msg, args, exc_info, func, extra, sinfo)
- logger.handle(record)
+ if logger.isEnabledFor(level):
+ record = logger.makeRecord(logger.name, level, fn, lno, msg, args, exc_info, func, extra, sinfo)
+ logger.handle(record)
def getDescription(self, test):
if isinstance(test, unittest.case._SubTest):
@@ -549,6 +550,8 @@ class OdooTestResult(unittest.result.TestResult):
"""
# only test case should be executed in odoo, this is only a safe guard
+ if isinstance(test, unittest.suite._ErrorHolder):
+ return
if not isinstance(test, unittest.TestCase):
_logger.warning('%r is not a TestCase' % test)
return
@@ -576,10 +579,8 @@ class OdooTestRunner(object):
start_time = time.perf_counter()
test(result)
time_taken = time.perf_counter() - start_time
-
- logger = logging.getLogger(test.__module__)
run = result.testsRun
- logger.info("Ran %d test%s in %.3fs", run, run != 1 and "s" or "", time_taken)
+ _logger.info("Ran %d test%s in %.3fs", run, run != 1 and "s" or "", time_taken)
return result
current_test = None
diff --git a/odoo/modules/registry.py b/odoo/modules/registry.py
index c3930d3f425..5df1a7b61f0 100644
--- a/odoo/modules/registry.py
+++ b/odoo/modules/registry.py
@@ -247,6 +247,44 @@ class Registry(Mapping):
for model in models:
model._setup_fields()
+ # determine field dependencies
+ Model = odoo.models.Model
+ dependencies = {
+ field: set(field.resolve_depends(model))
+ for model in models
+ if isinstance(model, Model)
+ for field in model._fields.values()
+ }
+
+ # determine transitive dependencies
+ def transitive_dependencies(field, seen=[]):
+ if field in seen:
+ return
+ for seq1 in dependencies[field]:
+ yield seq1
+ for seq2 in transitive_dependencies(seq1[-1], seen + [field]):
+ yield concat(seq1[:-1], seq2)
+
+ def concat(seq1, seq2):
+ if seq1 and seq2:
+ f1, f2 = seq1[-1], seq2[0]
+ if f1.type == 'one2many' and f2.type == 'many2one' and \
+ f1.model_name == f2.comodel_name and f1.inverse_name == f2.name:
+ return concat(seq1[:-1], seq2[1:])
+ return seq1 + seq2
+
+ # determine triggers based on transitive dependencies
+ triggers = {}
+ for field in dependencies:
+ for path in transitive_dependencies(field):
+ if path:
+ tree = triggers
+ for label in reversed(path):
+ tree = tree.setdefault(label, {})
+ tree.setdefault(None, set()).add(field)
+
+ self.field_triggers = triggers
+
for model in models:
model._setup_complete()