mirror of
https://gitlab.com/flectra-community/server-ux.git
synced 2024-07-06 18:40:29 +00:00
48 lines
1.5 KiB
Python
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."))
|