diff options
| -rw-r--r-- | odoo/addons/test_new_api/models/test_new_api.py | 22 | ||||
| -rw-r--r-- | odoo/addons/test_new_api/security/ir.model.access.csv | 2 | ||||
| -rw-r--r-- | odoo/addons/test_new_api/tests/test_new_fields.py | 27 | ||||
| -rw-r--r-- | odoo/fields.py | 8 |
4 files changed, 57 insertions, 2 deletions
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 5a192d755a5..af2aeed2312 100644 --- a/odoo/addons/test_new_api/models/test_new_api.py +++ b/odoo/addons/test_new_api/models/test_new_api.py @@ -628,6 +628,28 @@ class MonetaryInherits(models.Model): currency_id = fields.Many2one('res.currency') +class MonetaryOrder(models.Model): + _name = 'test_new_api.monetary_order' + _description = 'Sales Order' + + currency_id = fields.Many2one('res.currency') + line_ids = fields.One2many('test_new_api.monetary_order_line', 'order_id') + total = fields.Monetary(compute='_compute_total', store=True) + + @api.depends('line_ids.subtotal') + def _compute_total(self): + for record in self: + record.total = sum(line.subtotal for line in record.line_ids) + + +class MonetaryOrderLine(models.Model): + _name = 'test_new_api.monetary_order_line' + _description = 'Sales Order Line' + + order_id = fields.Many2one('test_new_api.monetary_order', required=True, ondelete='cascade') + subtotal = fields.Float(digits=(10, 2)) + + class FieldWithCaps(models.Model): _name = 'test_new_api.field_with_caps' _description = 'Model with field defined with capital letters' 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 d671d4a9a1a..139a321489b 100644 --- a/odoo/addons/test_new_api/security/ir.model.access.csv +++ b/odoo/addons/test_new_api/security/ir.model.access.csv @@ -52,6 +52,8 @@ access_test_new_api_model_private_address_onchange,access_test_new_api_model_pri access_test_new_api_req_m2o_transient,access_test_new_api_req_m2o_transient,model_test_new_api_req_m2o_transient,,0,0,0,0 access_test_new_api_country,access_test_new_api_country,model_test_new_api_country,base.group_user,1,1,1,1 access_test_new_api_city,access_test_new_api_city,model_test_new_api_city,base.group_user,1,1,1,1 +access_test_new_api_monetary_order,access_test_new_api_monetary_order,model_test_new_api_monetary_order,,1,1,1,1 +access_test_new_api_monetary_order_line,access_test_new_api_monetary_order_line,model_test_new_api_monetary_order_line,,1,1,1,1 access_test_new_api_model_selection_base,access_test_new_api_model_selection_base,model_test_new_api_model_selection_base,,1,1,1,1 access_test_new_api_model_selection_required,access_test_new_api_model_selection_required,model_test_new_api_model_selection_required,,1,1,1,1 access_test_new_api_model_selection_non_stored,access_test_new_api_model_selection_non_stored,model_test_new_api_model_selection_non_stored,,1,1,1,1 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 9f895ba5732..bf620ebe2ce 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -629,6 +629,33 @@ class TestFields(TransactionCaseWithUserDemo): for record in records: self.check_monetary(record, amount, currency, 'multi write(amount)') + def test_20_monetary_opw_2223134(self): + """ test monetary fields with cache override """ + model = self.env['test_new_api.monetary_order'] + currency = self.env.ref('base.USD') + + def check(value): + self.assertEqual(record.total, value) + record.flush() + self.cr.execute('SELECT total FROM test_new_api_monetary_order WHERE id=%s', [record.id]) + [total] = self.cr.fetchone() + self.assertEqual(total, value) + + # create, and compute amount + record = model.create({ + 'currency_id': currency.id, + 'line_ids': [(0, 0, {'subtotal': 1.0})], + }) + check(1.0) + + # delete and add a line: the deletion of the line clears the cache, then + # the recomputation of 'total' must prefetch record.currency_id without + # screwing up the new value in cache + record.write({ + 'line_ids': [(2, record.line_ids.id), (0, 0, {'subtotal': 1.0})], + }) + check(1.0) + def test_21_date(self): """ test date fields """ record = self.env['test_new_api.mixed'].create({}) diff --git a/odoo/fields.py b/odoo/fields.py index 6fcf8692072..a96d0f9631a 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -1306,7 +1306,9 @@ class Monetary(Field): else: # Note: this is wrong if 'record' is several records with different # currencies, which is functional nonsense and should not happen - currency = record[:1][self.currency_field] + # BEWARE: do not prefetch other fields, because 'value' may be in + # cache, and would be overridden by the value read from database! + currency = record[:1].with_context(prefetch_fields=False)[self.currency_field] value = float(value or 0.0) if currency: @@ -1319,7 +1321,9 @@ class Monetary(Field): if value and validate: # FIXME @rco-odoo: currency may not be already initialized if it is # a function or related field! - currency = record.sudo()[self.currency_field] + # BEWARE: do not prefetch other fields, because 'value' may be in + # cache, and would be overridden by the value read from database! + currency = record.sudo().with_context(prefetch_fields=False)[self.currency_field] if len(currency) > 1: raise ValueError("Got multiple currencies while assigning values of monetary field %s" % str(self)) elif currency: |
