[FIX] web: Fix useless search_count with count_limit

When count_limit is set and lower than the current number of fetched records, making an extra search_count is useless.

closes odoo/odoo#111895

X-original-commit: 6f90d6924e24e700694111732ee85465f802b22f
Signed-off-by: Rémy Voet <ryv@odoo.com>
This commit is contained in:
Laurent Smet
2023-02-03 17:41:15 +01:00
parent d8ba0ad0c0
commit d724f69a1d
3 changed files with 43 additions and 2 deletions
+6 -2
View File
@@ -57,10 +57,14 @@ class Base(models.AbstractModel):
'length': 0,
'records': []
}
if limit and (len(records) == limit or self.env.context.get('force_search_count')):
current_length = len(records) + offset
limit_reached = len(records) == limit
force_search_count = self._context.get('force_search_count')
count_limit_reached = count_limit and count_limit <= current_length
if limit and ((limit_reached and not count_limit_reached) or force_search_count):
length = self.search_count(domain, limit=count_limit)
else:
length = len(records) + offset
length = current_length
return {
'length': length,
'records': records
+1
View File
@@ -15,3 +15,4 @@ from . import test_read_progress_bar
from . import test_assets
from . import test_assets_xml
from . import test_login
from . import test_web_search_read
+36
View File
@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
from odoo.tests import common
from unittest.mock import patch
@common.tagged('post_install', '-at_install')
class TestWebSearchRead(common.TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.ResCurrency = cls.env['res.currency'].with_context(active_test=False)
cls.max = cls.ResCurrency.search_count([])
def assert_web_search_read(self, expected_length, expected_records_length, expected_search_count_called=True, **kwargs):
original_search_count = self.ResCurrency.search_count
search_count_called = [False]
def search_count(obj, *method_args, **method_kwargs):
search_count_called[0] = True
return original_search_count(*method_args, **method_kwargs)
with patch('odoo.addons.base.models.res_currency.Currency.search_count', new=search_count):
results = self.ResCurrency.web_search_read(domain=[], fields=['id'], **kwargs)
self.assertEqual(results['length'], expected_length)
self.assertEqual(len(results['records']), expected_records_length)
self.assertEqual(search_count_called[0], expected_search_count_called)
def test_web_search_read(self):
self.assert_web_search_read(self.max, self.max, expected_search_count_called=False)
self.assert_web_search_read(self.max, 2, limit=2)
self.assert_web_search_read(self.max, 2, limit=2, offset=10)
self.assert_web_search_read(2, 2, limit=2, count_limit=2, expected_search_count_called=False)
self.assert_web_search_read(20, 2, limit=2, offset=10, count_limit=20)
self.assert_web_search_read(12, 2, limit=2, offset=10, count_limit=12, expected_search_count_called=False)