Validate domain of view search
issue11380 review354871002
This commit is contained in:
1 parent
ca287e019a
commit
5288ffac8c
3 files changed
+48
-2
No files matched your search
@@ -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
@@ -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()
|
||||
|
||||
@@ -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>
|
||||
Reference in new issue
Block a user