diff --git a/odoo/addons/test_new_api/ir.model.access.csv b/odoo/addons/test_new_api/ir.model.access.csv index c825fb51c59..77c881dcc4d 100644 --- a/odoo/addons/test_new_api/ir.model.access.csv +++ b/odoo/addons/test_new_api/ir.model.access.csv @@ -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 diff --git a/odoo/addons/test_new_api/models.py b/odoo/addons/test_new_api/models.py index 043ee8a0b7d..7d7ad777b44 100644 --- a/odoo/addons/test_new_api/models.py +++ b/odoo/addons/test_new_api/models.py @@ -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') 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 caa4eedf4bf..9b3da038c5c 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -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): diff --git a/odoo/fields.py b/odoo/fields.py index a146a1bfa07..00923886d0a 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -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: diff --git a/odoo/tests/common.py b/odoo/tests/common.py index 55fad1ceb73..39bb02ab717 100644 --- a/odoo/tests/common.py +++ b/odoo/tests/common.py @@ -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: