Validate domain of view search

issue11380
review354871002
This commit is contained in:
Cédric Krier committed 2022-04-12 10:47:17 +02:00
1 parent ca287e019a
commit 5288ffac8c
3 files changed
+48 -2

No files matched your search

+3
View File
@@ -387,5 +387,8 @@ this repository contains the full copyright notices and license terms. -->
<record model="ir.message" id="msg_button_name_unique">
<field name="text">The name of the button must be unique per model.</field>
</record>
<record model="ir.message" id="msg_view_search_invalid_domain">
<field name="text">Invalid domain or search criteria "%(domain)s" for search "%(search)s".</field>
</record>
</data>
</tryton>
+41 -1
View File
@@ -10,12 +10,14 @@ from trytond.i18n import gettext
from trytond.model import ModelSQL, ModelView, fields
from trytond.model.exceptions import ValidationError
from trytond.pool import Pool
from trytond.pyson import Bool, Eval, If, PYSONDecoder
from trytond.pyson import PYSON, Bool, Eval, If, PYSONDecoder
from trytond.rpc import RPC
from trytond.tools import file_open
from trytond.transaction import Transaction
from trytond.wizard import Button, StateView, Wizard
from ..action import DomainError
class XMLError(ValidationError):
pass
@@ -572,6 +574,44 @@ class ViewSearch(ModelSQL, ModelView):
def default_user():
return Transaction().user
@classmethod
def validate_fields(cls, searches, field_names):
super().validate_fields(searches, field_names)
cls.check_domain(searches, field_names)
@classmethod
def check_domain(cls, searches, field_names):
decoder = PYSONDecoder()
if field_names and 'domain' not in field_names:
return
for search in searches:
try:
value = decoder.decode(search.domain)
except Exception as exception:
raise DomainError(
gettext('ir.msg_view_search_invalid_domain',
domain=search.domain,
search=search.rec_name)) from exception
if isinstance(value, PYSON):
if not value.types() == set([list]):
raise DomainError(
gettext('ir.msg_view_search_invalid_domain',
domain=search.domain,
search=search.rec_name))
elif not isinstance(value, list):
raise DomainError(
gettext('ir.msg_view_search_invalid_domain',
domain=search.domain,
search=search.rec_name))
else:
try:
fields.domain_validate(value)
except Exception as exception:
raise DomainError(
gettext('ir.msg_view_search_invalid_domain',
domain=search.domain,
search=search.rec_name)) from exception
@classmethod
def get_search(cls):
decoder = PYSONDecoder()
+4 -1
View File
@@ -6,8 +6,11 @@ this repository contains the full copyright notices and license terms. -->
<field name="name"/>
<label name="user"/>
<field name="user"/>
<label name="model"/>
<field name="model"/>
<newline/>
<label name="domain"/>
<field name="domain"/>
<field name="domain" colspan="3" widget="pyson"/>
</form>