diff options
| author | Christophe Simonis <chs@odoo.com> | 2019-09-13 18:07:59 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2019-09-13 18:07:59 +0200 |
| commit | 6c948c36bbf72dd896e0bff03aa7fbddadcbb0cd (patch) | |
| tree | f8620905c011735d8a3c340c46d1417a54a75972 /odoo/modules | |
| parent | 48503fcf08eac6fed12e080d4f501f9bbc8d257d (diff) | |
| parent | 197474e5b9ad43ab2d587a98136a1a809ce9a2e7 (diff) | |
[MERGE] forward port branch saas-12.5 up to 197474e5b9a
Diffstat (limited to 'odoo/modules')
| -rw-r--r-- | odoo/modules/loading.py | 2 | ||||
| -rw-r--r-- | odoo/modules/module.py | 11 | ||||
| -rw-r--r-- | odoo/modules/registry.py | 38 |
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() |
