When a domain field value is edited via the debug textarea, no search_count is done for performance reasons. A single exception is done when saving the record. Then we check the validity of the domain created in the debug textarea in order to avoid to save an invalid domain in db (and get tracebacks,..). The problem is that a search_count can take a very long time to be executed if the domain is valid. Here we introduce a route /web/domain/validate in order to quickly check the validity of a domain and use it in domain field in order to fix the above mentionned performance issue. Note that the search_count is still done if it useful but does not have to be waited anymore. X-original-commit: 40288221c39ff8fba41cd6ac231ab33600dc0cd4 Part-of: odoo/odoo#128913 Co-authored-by: Oliver Dony <odo@odoo.com> Co-authored-by: Mathieu Duckerts-Antoine <dam@odoo.com>
35 lines
1.5 KiB
Python
35 lines
1.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import http, _
|
|
from odoo.http import Controller, request
|
|
from odoo.exceptions import ValidationError
|
|
from odoo.tools.misc import mute_logger
|
|
|
|
class Domain(Controller):
|
|
|
|
@http.route('/web/domain/validate', type='json', auth="user")
|
|
def validate(self, model, domain):
|
|
""" Parse `domain` and verify that it can be used to search on `model`
|
|
:return: True when the domain is valid, otherwise False
|
|
:raises ValidationError: if `model` is invalid
|
|
"""
|
|
Model = request.env.get(model)
|
|
if Model is None:
|
|
raise ValidationError(_('Invalid model: %s', model))
|
|
try:
|
|
# go through the motions of preparing the final SQL for the domain,
|
|
# so that anything invalid will raise an exception.
|
|
query = Model.sudo()._search(domain)
|
|
sql, params = query.select()
|
|
|
|
# Execute the search in EXPLAIN mode, to have the query parser
|
|
# verify it. EXPLAIN will make sure the query is never actually executed
|
|
# An alternative to EXPLAIN would be a LIMIT 0 clause, but the semantics
|
|
# of a falsy `limit` parameter when calling _search() do not permit it.
|
|
with mute_logger('odoo.sql_db'):
|
|
request.env.cr.execute(f"EXPLAIN {sql}", params)
|
|
return True
|
|
except Exception: # pylint: disable=broad-except
|
|
return False
|