summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--odoo/addons/test_new_api/models/test_new_api.py22
-rw-r--r--odoo/addons/test_new_api/security/ir.model.access.csv2
-rw-r--r--odoo/addons/test_new_api/tests/test_new_fields.py27
-rw-r--r--odoo/fields.py8
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: