[FIX] fields, test_new_api: monetary related custom
This commit allows for not copying the currency_field attribute of a monetary field when the monetary field is related, and when the currency_field attribute is not explicit Before this commit, the currency_field attribute on the related monetary was set as the one on the distant model After this commit, the currency_field attribute takes the field on the current model Though the test may appear like an incoherent use case, it is on the contrary totally legit, as web_studio allows it OPW 1903113 closes odoo/odoo#28144
This commit is contained in:
committed by
Raphael Collet
parent
c41902a21c
commit
50e5f73b4e
@@ -22,3 +22,7 @@ access_test_new_api_multi_compute_inverse,access_test_new_api_multi_compute_inve
|
||||
access_test_new_api_recursive,access_test_new_api_recursive,model_test_new_api_recursive,,1,1,1,1
|
||||
access_test_new_api_cascade,access_test_new_api_cascade,model_test_new_api_cascade,,1,1,1,1
|
||||
access_test_new_api_binary_svg,access_test_new_api_binary_svg,model_test_new_api_binary_svg,,1,1,1,1
|
||||
access_test_new_api_monetary_base,access_test_new_api_monetary_base,model_test_new_api_monetary_base,,1,1,1,1
|
||||
access_test_new_api_monetary_related,access_test_new_api_monetary_related,model_test_new_api_monetary_related,,1,1,1,1
|
||||
access_test_new_api_monetary_custom,access_test_new_api_monetary_custom,model_test_new_api_monetary_custom,,1,1,1,1
|
||||
access_test_new_api_monetary_inherits,access_test_new_api_monetary_inherits,model_test_new_api_monetary_inherits,,1,1,1,1
|
||||
|
||||
|
@@ -468,3 +468,38 @@ class BinarySvg(models.Model):
|
||||
name = fields.Char(required=True)
|
||||
image_attachment = fields.Binary(attachment=True)
|
||||
image_wo_attachment = fields.Binary(attachment=False)
|
||||
|
||||
|
||||
class MonetaryBase(models.Model):
|
||||
_name = 'test_new_api.monetary_base'
|
||||
_description = 'Monetary Base'
|
||||
|
||||
base_currency_id = fields.Many2one('res.currency')
|
||||
amount = fields.Monetary(currency_field='base_currency_id')
|
||||
|
||||
|
||||
class MonetaryRelated(models.Model):
|
||||
_name = 'test_new_api.monetary_related'
|
||||
_description = 'Monetary Related'
|
||||
|
||||
monetary_id = fields.Many2one('test_new_api.monetary_base')
|
||||
currency_id = fields.Many2one('res.currency', related='monetary_id.base_currency_id')
|
||||
amount = fields.Monetary(related='monetary_id.amount')
|
||||
|
||||
|
||||
class MonetaryCustom(models.Model):
|
||||
_name = 'test_new_api.monetary_custom'
|
||||
_description = 'Monetary Related Custom'
|
||||
|
||||
monetary_id = fields.Many2one('test_new_api.monetary_base')
|
||||
x_currency_id = fields.Many2one('res.currency', related='monetary_id.base_currency_id')
|
||||
x_amount = fields.Monetary(related='monetary_id.amount')
|
||||
|
||||
|
||||
class MonetaryInherits(models.Model):
|
||||
_name = 'test_new_api.monetary_inherits'
|
||||
_description = 'Monetary Inherits'
|
||||
_inherits = {'test_new_api.monetary_base': 'monetary_id'}
|
||||
|
||||
monetary_id = fields.Many2one('test_new_api.monetary_base', required=True, ondelete='cascade')
|
||||
currency_id = fields.Many2one('res.currency')
|
||||
|
||||
@@ -1054,6 +1054,26 @@ class TestFields(common.TransactionCase):
|
||||
])
|
||||
self.assertEqual(attachment.mimetype, 'text/plain')
|
||||
|
||||
def test_93_monetary_related(self):
|
||||
""" Check the currency field on related monetary fields. """
|
||||
# check base field
|
||||
field = self.env['test_new_api.monetary_base']._fields['amount']
|
||||
self.assertEqual(field.currency_field, 'base_currency_id')
|
||||
|
||||
# related fields must use the field 'currency_id' or 'x_currency_id'
|
||||
field = self.env['test_new_api.monetary_related']._fields['amount']
|
||||
self.assertEqual(field.related, ('monetary_id', 'amount'))
|
||||
self.assertEqual(field.currency_field, 'currency_id')
|
||||
|
||||
field = self.env['test_new_api.monetary_custom']._fields['x_amount']
|
||||
self.assertEqual(field.related, ('monetary_id', 'amount'))
|
||||
self.assertEqual(field.currency_field, 'x_currency_id')
|
||||
|
||||
# inherited field must use the same field as its parent field
|
||||
field = self.env['test_new_api.monetary_inherits']._fields['amount']
|
||||
self.assertEqual(field.related, ('monetary_id', 'amount'))
|
||||
self.assertEqual(field.currency_field, 'base_currency_id')
|
||||
|
||||
|
||||
class TestX2many(common.TransactionCase):
|
||||
def test_search_many2many(self):
|
||||
|
||||
+11
-3
@@ -1276,11 +1276,9 @@ class Monetary(Field):
|
||||
def __init__(self, string=Default, currency_field=Default, **kwargs):
|
||||
super(Monetary, self).__init__(string=string, currency_field=currency_field, **kwargs)
|
||||
|
||||
_related_currency_field = property(attrgetter('currency_field'))
|
||||
_description_currency_field = property(attrgetter('currency_field'))
|
||||
|
||||
def _setup_regular_full(self, model):
|
||||
super(Monetary, self)._setup_regular_full(model)
|
||||
def _setup_currency_field(self, model):
|
||||
if not self.currency_field:
|
||||
# pick a default, trying in order: 'currency_id', 'x_currency_id'
|
||||
if 'currency_id' in model._fields:
|
||||
@@ -1290,6 +1288,16 @@ class Monetary(Field):
|
||||
assert self.currency_field in model._fields, \
|
||||
"Field %s with unknown currency_field %r" % (self, self.currency_field)
|
||||
|
||||
def _setup_regular_full(self, model):
|
||||
super(Monetary, self)._setup_regular_full(model)
|
||||
self._setup_currency_field(model)
|
||||
|
||||
def _setup_related_full(self, model):
|
||||
super(Monetary, self)._setup_related_full(model)
|
||||
if self.inherited:
|
||||
self.currency_field = self.related_field.currency_field
|
||||
self._setup_currency_field(model)
|
||||
|
||||
def convert_to_column(self, value, record, values=None, validate=True):
|
||||
# retrieve currency from values or record
|
||||
if values and self.currency_field in values:
|
||||
|
||||
@@ -314,7 +314,7 @@ class BaseCase(TreeCase, MetaCase('DummyCase', (object,), {})):
|
||||
field_type = record._fields[field_name].type
|
||||
if field_type == 'monetary':
|
||||
# Compare monetary field.
|
||||
currency_field_name = record._fields[field_name]._related_currency_field
|
||||
currency_field_name = record._fields[field_name].currency_field
|
||||
record_currency = record[currency_field_name]
|
||||
if record_currency.compare_amounts(candidate_value, record_value)\
|
||||
if record_currency else candidate_value != record_value:
|
||||
|
||||
Reference in New Issue
Block a user