diff options
| author | Sébastien Theys <seb@odoo.com> | 2020-02-04 11:33:50 +0000 |
|---|---|---|
| committer | Sébastien Theys <seb@odoo.com> | 2020-02-26 17:56:32 +0000 |
| commit | 5d62e4954f902e08bda38179bf98919dbd3a57e1 (patch) | |
| tree | df054f47814d5407dbee5290edc42beaa372c640 /odoo | |
| parent | 382f17f4624b45798c9ec4cc4ca37e8cb00b08ec (diff) | |
[FIX] core: fix _flush_search() when _order depends on m2o
closes odoo/odoo#46365
X-original-commit: 604b6a22db8eddfb37f9be31d3826394e25bd86c
Signed-off-by: Raphael Collet (rco) <rco@openerp.com>
Co-authored-by: Raphael Collet <rco@odoo.com>
Co-authored-by: Sébastien Theys <seb@odoo.com>
Diffstat (limited to 'odoo')
| -rw-r--r-- | odoo/addons/test_new_api/models/test_new_api.py | 17 | ||||
| -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 | 18 | ||||
| -rw-r--r-- | odoo/models.py | 13 |
4 files changed, 47 insertions, 3 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 330eed18008..14a981b3b0c 100644 --- a/odoo/addons/test_new_api/models/test_new_api.py +++ b/odoo/addons/test_new_api/models/test_new_api.py @@ -816,3 +816,20 @@ class ModelParentM2o(models.Model): name = fields.Char('Name') child_ids = fields.One2many('test_new_api.model_child_m2o', 'parent_id', string="Children") + + +class Country(models.Model): + _name = 'test_new_api.country' + _description = 'Country, ordered by name' + _order = 'name, id' + + name = fields.Char() + + +class City(models.Model): + _name = 'test_new_api.city' + _description = 'City, ordered by country then name' + _order = 'country_id, name, id' + + name = fields.Char() + country_id = fields.Many2one('test_new_api.country') 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 056be62d064..21a676a2d54 100644 --- a/odoo/addons/test_new_api/security/ir.model.access.csv +++ b/odoo/addons/test_new_api/security/ir.model.access.csv @@ -49,3 +49,5 @@ access_test_new_api_model_child_m2o,access_test_new_api_model_child_m2o,model_te access_test_new_api_model_parent_m2o,access_test_new_api_model_parent_m2o,model_test_new_api_model_parent_m2o,,1,1,1,1 access_test_new_api_model_private_address_onchange,access_test_new_api_model_private_address_onchange,model_test_new_api_model_private_address_onchange,base.group_user,1,1,1,1 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 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 94b1dd9c04e..0712e088f78 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -1714,7 +1714,23 @@ class TestFields(TransactionCaseWithUserDemo): self.assertEqual(record_no_bin_size.binary_computed, expected_value) self.assertEqual(record_bin_size.binary_computed, expected_value) - def test_96_ir_rule_m2m_field(self): + def test_96_order_m2o(self): + belgium, congo = self.env['test_new_api.country'].create([ + {'name': "Duchy of Brabant"}, + {'name': "Congo"}, + ]) + cities = self.env['test_new_api.city'].create([ + {'name': "Brussels", 'country_id': belgium.id}, + {'name': "Kinshasa", 'country_id': congo.id}, + ]) + # cities are sorted by country_id, name + self.assertEqual(cities.sorted().mapped('name'), ["Kinshasa", "Brussels"]) + + # change order of countries, and check sorted() + belgium.name = "Belgium" + self.assertEqual(cities.sorted().mapped('name'), ["Brussels", "Kinshasa"]) + + def test_97_ir_rule_m2m_field(self): """Ensures m2m fields can't be read if the left records can't be read. Also makes sure reading m2m doesn't take more queries than necessary.""" tag = self.env['test_new_api.multi.tag'].create({}) diff --git a/odoo/models.py b/odoo/models.py index 44e7a3b62bd..cf4eebde3b0 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -4307,8 +4307,14 @@ Record ids: %(records)s return order_by_clause and (' ORDER BY %s ' % order_by_clause) or '' @api.model - def _flush_search(self, domain, fields=None, order=None): + def _flush_search(self, domain, fields=None, order=None, seen=None): """ Flush all the fields appearing in `domain`, `fields` and `order`. """ + if seen is None: + seen = set() + elif self._name in seen: + return + seen.add(self._name) + to_flush = defaultdict(set) # {model_name: field_names} if fields: to_flush[self._name].update(fields) @@ -4354,8 +4360,11 @@ Record ids: %(records)s order_spec = order or self._order for order_part in order_spec.split(','): order_field = order_part.split()[0] - if order_field in self._fields: + field = self._fields.get(order_field) + if field is not None: to_flush[self._name].add(order_field) + if field.relational: + self.env[field.comodel_name]._flush_search([], seen=seen) if self._active_name: to_flush[self._name].add(self._active_name) |
