[FIX] web: limit on search panel values

Before this commit, if a many2X field with a big comodel was added
in a search panel, the view using it would crash. For instance that
problem occured in the kanban view for hr.job, where res.users
appears as the comodel for the field user_id.

Now, we fix an arbitrary limit of 200 to the numbers of values to fetch
for each many2X fields in the search panel. This avoid the problem
mentionned above.
Furthermore, in case the limit is attained for a field used
as select="one", the values are displayed without being hierarchized.
Indeed the limit can leads to gaps in the knowledge of the hierarchy
and consequently to a bad representation of it.

Task ID: 2154668

closes odoo/odoo#50334

X-original-commit: 8d57153b34c04952a85f6642951cb2697016da84
Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
This commit is contained in:
Mathieu Duckerts-Antoine
2020-04-28 14:57:58 +00:00
parent 64ae832a8a
commit 7b402c5e59
3 changed files with 27 additions and 4 deletions
+5 -3
View File
@@ -10,6 +10,8 @@ from odoo.tools import lazy
from odoo.tools.misc import get_lang
from odoo.exceptions import UserError
SEARCH_PANEL_LIMIT = 200
class IrActionsActWindowView(models.Model):
_inherit = 'ir.actions.act_window.view'
@@ -240,7 +242,7 @@ class Base(models.AbstractModel):
fields.append(parent_name)
return {
'parent_field': parent_name,
'values': Comodel.with_context(hierarchical_naming=False).search_read([], fields),
'values': Comodel.with_context(hierarchical_naming=False).search_read([], fields, limit=SEARCH_PANEL_LIMIT),
}
@api.model
@@ -315,7 +317,7 @@ class Base(models.AbstractModel):
}
# retrieve all possible values, and return them with their label and counter
field_names = ['display_name', group_by] if group_by else ['display_name']
records = Comodel.search_read(comodel_domain, field_names)
records = Comodel.search_read(comodel_domain, field_names, limit=SEARCH_PANEL_LIMIT)
for record in records:
record_id = record['id']
values = {
@@ -330,7 +332,7 @@ class Base(models.AbstractModel):
elif field.type == 'many2many':
# retrieve all possible values, and return them with their label and counter
field_names = ['display_name', group_by] if group_by else ['display_name']
records = Comodel.search_read(comodel_domain, field_names)
records = Comodel.search_read(comodel_domain, field_names, limit=SEARCH_PANEL_LIMIT)
for record in records:
record_id = record['id']
values = {
+15 -1
View File
@@ -19,6 +19,8 @@ var qweb = core.qweb;
// in the arch)
var defaultViewTypes = ['kanban', 'tree'];
const SEARCH_PANEL_LIMIT = 200;
/**
* Given a <searchpanel> arch node, iterate over its children to generate the
* description of each section (being either a category or a filter).
@@ -279,7 +281,15 @@ var SearchPanel = Widget.extend({
*/
_createCategoryTree: function (categoryId, values) {
var category = this.categories[categoryId];
var parentField = category.parentField;
let parentField = category.parentField;
if (values.length === SEARCH_PANEL_LIMIT) {
category.limitAttained = true;
if (parentField) {
// we do not hierarchize values
parentField = false;
}
}
category.values = {};
_.each(values, function (value) {
@@ -324,6 +334,10 @@ var SearchPanel = Widget.extend({
_createFilterTree: function (filterId, values) {
var filter = this.filters[filterId];
if (values.length === SEARCH_PANEL_LIMIT) {
filter.limitAttained = true;
}
// restore checked property
values.forEach(function (value) {
var oldValue = filter.values && filter.values[value.id];
+7
View File
@@ -236,6 +236,10 @@
<t t-set="values" t-value="category.rootIds"/>
</t>
</ul>
<div t-if="category.limitAttained" class="alert alert-warning">
<span>For performance reasons, only 200 values were fetched. Some values might be missing.</span>
<span t-if="category.parentField">The values have not been hierarchized.</span>
</div>
</section>
</t>
<t t-name="SearchPanel.CategoryValues">
@@ -271,6 +275,9 @@
<t t-set="values" t-value="filter.values"/>
</t>
</ul>
<div t-if="filter.limitAttained" class="alert alert-warning">
<span>For performance reasons, only 200 values were fetched. Some values might be missing.</span>
</div>
</section>
</t>
<t t-name="SearchPanel.FilterGroups">