server-ux/base_search_custom_field_filter/models/base.py
2022-06-29 20:41:04 +02:00

68 lines
2.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 lxml import etree
from flectra import api, models
class Base(models.AbstractModel):
_inherit = "base"
@api.model
def _add_custom_filters(self, res, custom_filters):
arch = etree.fromstring(res["arch"])
for custom_filter in custom_filters:
node = False
if custom_filter.position_after:
node = arch.xpath("//field[@name='%s']" % custom_filter.position_after)
if not node:
node = arch.xpath("//field[last()]")
if node:
elem = etree.Element(
"field",
{"name": custom_filter.expression, "string": custom_filter.name},
)
node[0].addnext(elem)
res["arch"] = etree.tostring(arch)
return res
@api.model
def fields_view_get(
self, view_id=None, view_type="form", toolbar=False, submenu=False
):
"""Inject fields field in search views."""
res = super().fields_view_get(
view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu
)
if view_type == "search":
custom_filters = self.env["ir.ui.custom.field.filter"].search(
[("model_name", "=", res.get("model"))]
)
if custom_filters:
res = self._add_custom_filters(res, custom_filters)
return res
@api.model
def load_views(self, views, options=None):
"""Inject fake field definition for having custom filters available."""
res = super(
Base,
self.with_context(
custom_field_filter=True,
),
).load_views(views, options=options)
custom_filters = self.env["ir.ui.custom.field.filter"].search(
[("model_name", "=", self._name)]
)
for custom_filter in custom_filters:
field = custom_filter._get_related_field()
field_name = "ir_ui_custom_filter_%s" % custom_filter.id
res["fields"][field_name] = field.get_description(self.env)
# force this for avoiding to appear on the rest of the UI
res["fields"][field_name]["selectable"] = False
res["fields"][field_name]["sortable"] = False
res["fields"][field_name]["store"] = False
return res