server-ux/base_search_custom_field_filter/models/ir_ui_custom_field_filter.py
2021-03-23 20:15:27 +01:00

48 lines
1.5 KiB
Python

# Copyright 2020 Tecnativa - Carlos Dauden
# Copyright 2020 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from flectra import _, api, exceptions, fields, models
class IrUiCustomFilter(models.Model):
_name = "ir.ui.custom.field.filter"
_description = "Custom UI field filter"
_order = "model_id, sequence, id"
sequence = fields.Integer()
model_id = fields.Many2one(
comodel_name="ir.model", required=True, ondelete="cascade"
)
model_name = fields.Char(
related="model_id.model",
store=True,
readonly=True,
index=True,
string="Model name",
)
name = fields.Char(required=True, translate=True)
expression = fields.Char(required=True)
position_after = fields.Char(
help="Optional field name for putting the filter after that one. "
"If empty or not found, it will be put at the end.",
)
def _get_related_field(self):
"""Determine the chain of fields."""
self.ensure_one()
related = self.expression.split(".")
target = self.env[self.model_name]
for name in related:
field = target._fields[name]
target = target[name]
return field
@api.constrains("model_id", "expression")
def _check_expression(self):
for record in self:
try:
record._get_related_field()
except KeyError:
raise exceptions.ValidationError(_("Incorrect expression."))