[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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user