From a6c786090c2cf7a07db7875fa2f752c97bbf79df Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Mon, 31 Jan 2022 13:23:06 +0000 Subject: [PATCH] [IMP] test_new_api: test precompute monetary fields Part-of: odoo/odoo#81423 --- .../test_new_api/models/test_new_api.py | 17 +++++++++++ .../test_new_api/security/ir.model.access.csv | 1 + .../test_new_api/tests/test_new_fields.py | 29 +++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/odoo/addons/test_new_api/models/test_new_api.py b/odoo/addons/test_new_api/models/test_new_api.py index 3efc9158548..913e5e1cfc2 100644 --- a/odoo/addons/test_new_api/models/test_new_api.py +++ b/odoo/addons/test_new_api/models/test_new_api.py @@ -1516,6 +1516,23 @@ class PrecomputeRequired(models.Model): name = fields.Char(related='partner_id.name', precompute=True, store=True, required=True) +class PrecomputeMonetary(models.Model): + _name = 'test_new_api.precompute.monetary' + _description = 'a model with precomputed monetary and currency' + + amount = fields.Monetary( + compute='_compute_amount', store=True, precompute=True) + currency_id = fields.Many2one( + 'res.currency', compute="_compute_currency_id", store=True, precompute=True) + + def _compute_amount(self): + for record in self: + record.amount = 12.333 + + def _compute_currency_id(self): + self.currency_id = 1 # EUR + + class PrefetchTranslateField(models.Model): _name = 'test_new_api.prefetch.translate' _description = 'A model with some translate fields to check prefetch' diff --git a/odoo/addons/test_new_api/security/ir.model.access.csv b/odoo/addons/test_new_api/security/ir.model.access.csv index 1a464f3d24e..0ff8b670537 100644 --- a/odoo/addons/test_new_api/security/ir.model.access.csv +++ b/odoo/addons/test_new_api/security/ir.model.access.csv @@ -84,4 +84,5 @@ access_test_new_api_precompute_line,access_test_new_api_precompute_line,model_te access_test_new_api_precompute_combo,access_test_new_api_precompute_combo,model_test_new_api_precompute_combo,,1,0,0,0 access_test_new_api_precompute_editable,access_test_new_api_precompute_editable,model_test_new_api_precompute_editable,,1,0,0,0 access_test_new_api_precompute_required,access_test_new_api_precompute_required,model_test_new_api_precompute_required,,1,0,0,0 +access_test_new_api_precompute_monetary,access_test_new_api_precompute_monetary,model_test_new_api_precompute_monetary,,1,0,0,0 access_test_new_api_prefetch_translate,access_test_new_api_prefetch_translate,model_test_new_api_prefetch_translate,,1,0,0,0 diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py index 9a78be1b634..d6cedd961e3 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -3399,6 +3399,16 @@ class TestFieldParametersValidation(common.TransactionCase): )) +def select(model, *fnames): + """ Return the expected query string to SELECT the given columns. """ + table = model._table + terms = ", ".join( + f'"{table}"."{fname}" AS "{fname}"' + for fname in ['id'] + list(fnames) + ) + return f'SELECT {terms} FROM "{table}" WHERE "{table}".id IN %s' + + def insert(model, *fnames, rowcount=1): """ Return the expected query string to INSERT the given columns. """ columns = sorted(fnames + ('create_uid', 'create_date', 'write_uid', 'write_date')) @@ -3788,3 +3798,22 @@ class TestPrecompute(common.TransactionCase): # check the number of queries: 1 SELECT + 1 INSERT with self.assertQueryCount(2): model.create([{'partner_id': pid} for pid in partners.ids]) + + def test_precompute_monetary(self): + """Make sure the rounding of monetaries correctly prefetches currency fields""" + model = self.env['test_new_api.precompute.monetary'] + currency = self.env['res.currency'] + + # warmup + model.create({}) + model.flush() + model.invalidate_cache() + + QUERIES = [ + select(currency, 'rounding'), + select(currency, 'decimal_places'), + insert(model, 'amount', 'currency_id'), + select(model, 'currency_id'), + ] + with self.assertQueries(QUERIES): + model.create({})